一次存储型XSS的攻防实战


当前第2页 返回上一页

10.jpg

那么黑客该如何继续进行攻击呢?

答案是:大小写绕过

1

<sCrIPt>alert(1)</ScripT>

5ab06447fe511961dfb712752a6b2a5.png

因为js是不区分大小写的,所以我们的大小写不影响脚本的执行。

成功弹框!

aa626e7887d96823133082d89bf6299.png

0×02、使用str_ireplace()函数进行不区分大小写地过滤script关键字

作为一名优秀的开发,发现了问题当然要及时改正,不区分大小写不就行了嘛。

后端代码修正如下:

1

$nickname = str_ireplace("script", "", @$_POST['nickname']);//昵称

str_ireplace()函数类似于上面的str_replace(),但是它不区分大小写。

那么,黑客该如何绕过?

答案是:双写script

1

<Sscriptcript>alert(1)</Sscriptcript>

d13fc9cca642e466de8a5946df0e9a0.png

原理就是str_ireplace()函数只找出了中间的script关键字,前面的S和后面的cript组合在一起,构成了新的Script关键字。

弹框成功!

b2c80a7f5749ddbbbcb405efc494cc0.png

0×03、使用preg_replace()函数进行正则表达式过滤script关键字

1

$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST['nickname']);//昵称

显然,弹框失败。

11.jpg

攻击者如何再一次绕过?

答案是:用img标签的oneerror属性

1

<img src=x onerror=alert(1)>

0×04、过滤alert关键字

看到这里,不知道你烦了没有,以开发的角度来讲,我都有点烦。大黑阔你不是喜欢弹窗么?我过滤alert关键字看你怎么弹!

1

2

$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST['nickname']);//昵称

$nickname = preg_replace( "(.*)a(.*)l(.*)e(.*)r(.*)t/i", "", $nickname);//昵称

那么,攻击者该怎么办呢?

答案是:编码绕过

1

2

<a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;

&#49;&#41;>a</a>

当点击页面上的超链接时,会弹框。

12.jpg

但是为什么呢?

这种编码方式为字符编码

字符编码:十进制、十六进制ASCII码或unicode 字符编码,样式为“&#数值;”, 例如“j”可以编码为“&#106;”或“&#x6a; ”

上述代码解码之后如下:

1

<a href=javascript:alert(1)>a</a>

你能明显感觉到限制:由于使用到了a标签,所以只有点击时,才会弹框。

作为一个大黑阔,我们当然是不满意的,能不能让所有进入这个页面的人都弹框?

当然可以了:用iframe标签编码

1

2

<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;

&#41;>

这种写法,同样既没有script关键字,又没有alert关键字。

4d16afd83acdb92b07ad5399d502af1.png

可以看到弹框成功!

5ba7af0d4bfa70a4e75f74d96b3ade2.png

可是你也能看到,由于使用了iframe标签,留言板的样式已经变形了。实战中尽量不要用。

0×05、过滤特殊字符

优秀的开发,永不认输!你个小小的黑阔,不就是会插入js代码么?我过滤特殊字符,看你代码咋被解析?

可是我不想手撸代码来列举那么多特殊字符怎么办?

php给我们提供了htmlentities()函数:

1

$nickname = htmlentities(@$_POST['nickname']);//昵称

htmlentities()函数的作用是把字符转换为 HTML 实体。

7d8aa122e7c3676c9dd6f2931e8eee5.png

看到这里,你可能还是不明白HTML字符实体是什么。我举个例子吧,当你想在HTML页面上显示一个小于号(<)时,浏览器会认为这是标签的一部分(因为所有标签都由大于号,标签名和小于号构成),因此,为了能在页面上显示这个小于号(<),我们引入了HTML字符实体的概念,能够在页面上显示类似于小于号(<)这样的特殊符号,而不会影响到页面标签的解析。

可以看到,我们输入的内容全部显示在页面上了。

13.jpg

可是却没有弹框。

我们鼠标右键,查看网页源代码

3ed483569df8bc317cd599553db6cae.png

际上,我们输入的内容已经变成了HTML实体:

1

2

&lt;iframe src=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;

&amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#49;&amp;#41;&gt;

无法被解析为js脚本。

黑客在当前场景下已经无法攻击了(在某些其他场景,即使使用了htmlentities()函数,仍然是可以攻击的,这就不在本文讨论范围之内了)

0×06、总结

开发者不应该只考虑关键字的过滤,还应该考虑特殊符号的过滤 。

黑客在面对未知的情况时,要不断尝试,这对于知识的储备量有较高的要求。

对于xss攻击,站在开发者角度来讲,仅仅用一个htmlentities()函数基本可以做到防御,可是一个优秀的开发者应该明白它的原理。站在黑客的角度来讲,面对环境的逐步变化,条件的逐步限制,攻击思路灵活变化是对整个职业生涯有益的。

相关文章教程推荐:web服务器安全

以上就是一次存储型XSS的攻防实战的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

跨站脚本攻击xss包括哪三大类型

linux企业端口扫描实战

xss防御措施有哪些

xss攻击原理及防护

xss分类及防御措施

一次存储型xss的攻防实战

linux企业端口扫描实战

xss攻击的原理是什么

更多相关阅读请进入《存储型》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...