本文摘自PHP中文网,作者V,侵删。
什么是存储型XSS
它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,一般是注入一段javascript脚本。在测试过程中,我们一般是使用:
1 |
|
通过这段js代码,弹个框来证明存在xss漏洞。那么,可能新手就会问了,弹个框有什么用呢?
其实,弹框只是为了证明存在此漏洞。而此漏洞的利用方式由很多种。
比如,你可以使用xss平台:
写入一段平台生成的xss脚本:
1 |
|
当某人进入带有这个脚本的页面时,js脚本会获取他的cookie并发往xss平台。
你只需要登录xss平台等待即可,拿到cookie后,可以不需要密码登录他的账号。
注意:本文的重点是一步一步以黑客的角度进行xss攻击,再讨论如何站在开发者的角度去一步一步防御xss攻击。所以我会在本文中以开发的身份修正后端代码,再以黑客的身份进行前端页面的xss攻击,这一点需要注意哦。
对于存储型xss漏洞的表现形式,比较经典的是留言板。但是我们都是遵纪守法的好同学,不能对外面的网站进行测试,所以就花半个小时自己手撸一个留言板咯。
首先,应该有前端展示的页面Message_Board.php和后端存储数据的页面addMessage.php
前端代码不是本文重点(感兴趣的可以自行查看前端代码),我们重点关注后端代码addMessage.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
可以看到,我们对传入的四个参数完全没有处理,而是直接存入数据库中。
所以,只要我们这样输入:
提交之后,系统会自动刷新页面出现弹框:
点击确定后,你会发现留言内容和留言者的部分都为空。
这是因为js脚本已经被解析了,这时我们按F12,打开浏览器的开发者工具,发现了js脚本。
那么,问题来了。
毕竟我们还有另外一个身份,开发者该如何防御呢?
0×00、来个最简单的,只修改前端代码
在input标签里面加上maxlength属性
1 |
|
至于原理嘛,就是因为js脚本的形式为<script></script>长度为17,所以只要我们在前端对长度进行限制,就可以阻止黑客进行xss攻击了。
可是!开发可没这么好做!
我们是想做开发的黑客,所以还得自己搞自己。
作为攻击者,我们同样可以修改前端代码,具体的操作是使用浏览器的F12(开发者工具)
可以看到,我们可以直接进行长度的修改。
另外,还可以用抓包的方法,在包里面直接写,也是不受长度限制的。
0×01、对关键字script进行过滤
作为开发者,你很容易发现,要想进行xss攻击,必须插入一段js脚本,而js脚本的特征是很明显的,脚本中包含script关键字,那么我们只需要进行script过滤即可。
回到之前的代码。
为方便说明,我只取nickname参数,其实传入的四个参数需要做同样的处理。
1 |
|
上面这个str_replace()函数的意思是把script替换为空。
可以看到,script被替换为空,弹框失败。
相关阅读 >>
更多相关阅读请进入《存储型》频道 >>