宽字节编码类型的XSS

安全相关 专栏收录该内容
34 篇文章 0 订阅

今晚又看了一遍PKAV-心上的瘦子写的xss腾讯系列的例子,收获挺大的,其中对宽字节注入有了更深的了解,又查找了一些相关的资料,整理一下,以备以后查阅
参考文档:
http://book.2cto.com/201301/14515.html
http://itindex.net/detail/47408-xss-%E5%AD%A6%E4%B9%A0-xss
http://www.wooyun.org/bugs/wooyun-2010-015969

GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,比如,下面这个PHP示例,在magic_quotes_gpc=On的情况下,如何触发XSS?

 <?php header("Content-Type: text/html;charset=GBK"); ?>
    <head>
    <title>gb xss</title>
    </head>
    <script>
    a="<?php echo $_GET['x'];?>";
    </script>
我们会想到,需要闭合双引号才行,如果只是提交如下语句:
 gb.php?x=1";alert(1)//
双引号会被转义成\",导致闭合失败:
 a="1\";alert(1)//";
由于这个网页头部响应指明了这是GBK编码,GBK编码第一字节(高字节)的范围是0x81~0xFE,第二字节(低字节)的范围是0x40~0x7E与0x80~0xFE,这样的十六进制表示。而\符号的十六进制表示为0x5C,正好在GBK的低字节中,如果之前有一个高字节,那么正好会被组成一个合法字符,于是提交如下:
  gb.php?x=1%81";alert(1)//
双引号会继续被转义成\",最终如下:
 a="1[0x81]\";alert(1)//";

[0x81]\组成了一个合法字符,于是之后的双引号就会产生闭合,这样我们就成功触发了XSS。

要注意的是,GB2312是被GBK兼容的,它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE(0x5C不在该范围内),把上面的PHP代码的GBK改为GB2312,在浏览器中处理行为同GBK,也许是由于GBK兼容GB2312,浏览器都做了同样的兼容:把GB2312统一按GBK行为处理。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值