[腾讯实例教程] 那些年我们一起学XSS – 12. Dom Xss进阶 [路径con]

漏洞概要

缺陷编号:WooYun-2012-016279

漏洞标题:[腾讯实例教程] 那些年我们一起学XSS - 12. Dom Xss进阶 [路径con]

相关厂商:腾讯

漏洞作者:心伤的瘦子

提交时间:2012-12-20 15:38

公开时间:2013-02-03 15:39

漏洞类型:XSS 跨站脚本攻击

危害等级:低

自评Rank:2

漏洞状态:厂商已经确认

Tags标签:

漏洞详情

披露状态:

2012-12-20: 细节已通知厂商并且等待厂商处理中
2012-12-20: 厂商已经确认,细节仅向厂商公开
2012-12-30: 细节向核心白帽子及相关领域专家公开
2013-01-09: 细节向普通白帽子公开
2013-01-19: 细节向实习白帽子公开
2013-02-03: 细节向公众公开

简要描述:

我不是萝莉con,我是路径con。一些程序员会动态的加载json数据,同域的时候,可以使用ajax;而有时候,数据所在域和当前页面所在域又不一致。所以需要跨域请求。跨域请求数据的手段中,有一种叫做jsonp。用代码表示的话,就是
somescript.src="http://otherdomain.com/xx?jsonp=callback"某些时候,程序员会在调用外部数据的时候带上可控的参数。somescript.src="http://otherdomain.com/xx?jsonp=callback&id="+id;如果这个id我们可控,将可能带来XSS问题。

详细说明:

本次教程,就不像前面的一样,去细说操作过程了,前面的几次教程也基本将常用操作全部介绍到了。直接来看例子。1. 在扫描过程中,经常遇到下面的例子。

2. 初看看,这种情况,似乎没有什么利用价值。3. 但是我们不难想象,如果这个地址是我们可控的话,一样会带来威胁。地址的可控可以分为3个层面。3.1 script src="http://www.secevery.com:4321/bugs/wooyun-2012-016279/完全可控" ,这种就简单了,直接将地址换为我们的JS地址3.2 script src="http://www.secevery.com/path/xxx/[路径可控]/1.js"这种要利用的话,需要同域名下有可控的文件。可控文件又分为2种。3.2.1 可以直接上传文本至同域名下,不一定要是HTML文件,需要上传点有过滤缺陷。3.2.2 参数可控,利用可用的json接口。最终变为 script src="http://www.secevery.com/path/xxx/.../yyy/xx.json?callback=alert(1)"3.3 script src="http://www.secevery.com/xxxx/json.php?callback=xxxx&param1=yyy&param2=[参数可控]"这种情况,和3.2.2类似,如果参数可控,且json的参数没有很好的过滤时。我们就有机可乘了。4. 本文以拍拍网一处XSS为例,来描述以上可能性。扫描器扫到的点,见步骤1中的图。进一步,我们可以通过抓包的方式,看到页面在打开时,所加载的外部JS文件地址。http://sse1.paipai.com/comm_json?callback=commentListCallBack&dtag=1&ac=1&cluster=1&sellquality=0&NewProp=&Property=256&PageNum=1&PageSize=48&OrderStyle=80&Address=&SaleType=1&degree=1&AuthType=2&BeginPrice=&EndPrice=&KeyWord=2012%20%D0%C2&OnlineState=2&Paytype=4&ranking=&sClassid='aaaaaaaa&t=1354854681我们打开这个JSON,用扫描反射型的方式,可以测试出,callback, dtag 以及 ranking可控。但均无法使用<, >,也就是说,这个JSON接口本身是无XSS风险的。此外 dtag, 和 ranking 都在双引号里面,我们在后续无法进行利用,而callback则在最前面,比较好控制。我们可以想象下,如果我们可以让这个页面调用:http://sse1.paipai.com/comm_json?callback=alert(1);那么将会产生XSS。那么怎么让页面调用上面的情况呢?4.1 直接控制callback参数,但是从实际情况来看,我们此处无法直接控制它,【失败】4.2 将后面的参数, param=xxx修改为param=xxx&callback=alert(1) ,从而覆盖前面的callback5. 上面说到的第2种方案,似乎可行。但是实际上还是有问题的。譬如我们页面上的 type参数,对应着json的sclassid参数。我们访问以下地址:http://bag.paipai.com/search_list.shtml?type=&callback=alert(1);&np=11&pro=256&searchtype=2&cs=0010000&keyword=&PTAG=20058.13.13其实很明显上面这样是不行的。。因为 & 本身就是参数分隔符。这样写type就为空了可能很快就有人想到另外一个写法:& 写为 %26http://bag.paipai.com/search_list.shtml?type=%26callback=alert(1);&np=11&pro=256&searchtype=2&cs=0010000&keyword=&PTAG=20058.13.13很好,但是实际上,你会发现,访问的json接口的参数也还是原封不动的 %26,而不是所希望的 &

6. 为了看看参数是怎么从页面,传递到了 comm_json 这个接口上的。我们定位到以下代码。http://static.paipaiimg.com/js/search.js?t=20121108

在这个文件里,我们很容易的看出,当前页面参数和json参数的对应关系option.JSON参数=$getQuery("页面参数")7. 一个函数让我眼前一亮啊,decodeURIComp。。也就是说,传入的keyword,会解码一次。也就是说,如果我们keyword=%26callback=alert(1);decodeURIComp就会变为&callback=alert(1);为了证明我们的想法:我们直接写利用代码。注意keyword=那一部分

8. 看效果:弹了吧

抓包可以看到,被动态加载的keyword参数,我们在后面插入了一个callback,覆盖了前面的callback

同样,看到返回的comm_json的内容

漏洞证明:

见详细证明。

修复方案:

1. 可在调用外部json数据时,对参数进行严格控制。2. 也可对jsonp接口的callback参数进行更加严格的字符控制,一般的callback,只需要允许,字母,数字+下划线即可。

漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2012-12-20 17:03

厂商回复:

非常感谢您的报告。这个问题我们已经确认,正在与业务部门进行沟通制定解决方案。如有任何新的进展我们将会及时同步。

最新状态:

暂无

评价

  1. 2010-01-01 00:00 疯子 白帽子 | Rank:254 漏洞数:39)

    广告位出租.....

  2. 2010-01-01 00:00 Coody 白帽子 | Rank:1303 漏洞数:118)

    广告位招租.....

  3. 2010-01-01 00:00 CHForce 白帽子 | Rank:0 漏洞数:1)

    广告位招租.....给力的注入理念

  4. 2010-01-01 00:00 鬼魅羊羔 白帽子 | Rank:274 漏洞数:36)

    我了个去。。我晚了

  5. 2010-01-01 00:00 猥琐 白帽子 | Rank:4 漏洞数:1)

    我不是萝莉con,我是路径con。

  6. 2010-01-01 00:00 dyun 白帽子 | Rank:75 漏洞数:11)

    末日大奖是你的啦...

  7. 2010-01-01 00:00 xsser 白帽子 | Rank:152 漏洞数:17)

    @dyun 无法超越了

  8. 2010-01-01 00:00 dyun 白帽子 | Rank:75 漏洞数:11)

    续集呢...我等不急了...

  9. 2010-01-01 00:00 px1624 白帽子 | Rank:963 漏洞数:126)

    其实应该低危害的就写低,高危害的就写高,也不要全部清一色都写低诶...

  10. 2010-01-01 00:00 yy520 白帽子 | Rank:124 漏洞数:12)

    [email protected] 开发中的扫描器

  11. 2010-01-01 00:00 px1624 白帽子 | Rank:963 漏洞数:126)

    @yy520 。。。请看这里 WooYun: 腾讯微博一处两用DOM-XSS,能反射,能后门

  12. 2010-01-01 00:00 DM_ 白帽子 | Rank:44 漏洞数:9)

    扫描器?

  13. 2010-01-01 00:00 mole3o 白帽子 | Rank:10 漏洞数:2)

    Bt5的,/pentest/web/ 目录下,也有几款xss扫描器,不过,像我这种小白,还是先打好基础的说。

  14. 2010-01-01 00:00 lxsec 白帽子 | Rank:52 漏洞数:6)

    这个连载太给力了,看的都不想睡了

  15. 2010-01-01 00:00 QQ852451559 白帽子 | Rank:78 漏洞数:17)

    明明就是萝莉con

  16. 2010-01-01 00:00 Mark 白帽子 | Rank:38 漏洞数:3)

    看到这里 洞主是二哥的小号?@[email protected]

  17. 2010-01-01 00:00 watchdoge 白帽子 | Rank:0 漏洞数:0)

    扫描器是?