文章目录
前言
来自菜鸟的一次简单分享,本次实验主要结合后台源代码讲解,梳理存储型XSS实验的思路,如果存在问题,请各位大佬多多指导。
一、XSS基础
1.什么是XSS?
XSS(Cross-site scripting)被称为跨站脚本攻击,由于与层叠样式表的缩写一样,因此被缩写为XSS。
2.XSS漏洞原理
XSS攻击发生在客户端,由于web应用程序对用户的输入过滤不严格导致攻击者可以利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端JS脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码。
3.XSS漏洞成因
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输入到前端时被浏览器当作有效代码解析执行从而产生危害。
4.XSS漏洞危害
- 网络钓鱼,盗取各类用户账号,如机器登录账号、用户网银账号。
- 窃取cookie,从而获取用户隐私信息,或利用用户身份对网站执行操作
- 劫持用户(浏览器)会话
- 强制发送网站挂马
- 控制受害者机器向其他网站发起进攻
5.存储型XSS漏洞原理
存储型XSS又称持久型XSS,攻击脚本被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。
这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端数据库中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
存储型XSS攻击能够将恶意代码永久的嵌入到一个页面中,所有访问此页面的用户都会成为受害者。
6.存储型XSS与反射型XSS的区别
个人理解反射型XSS是通过将payload经过编码插入到URL中,或者构造具有诱惑性的恶意网站通过社会工程学(如发送邮件、消息等方式),诱导正常用户点击达到攻击的目的,如果用户不点击则无法达到攻击的目的。
存储型XSS与反射型XSS不同的是,存储型XSS是攻击者将恶意的payload通过留言板、博客系统发送至后台服务器存储起来,当其他用户访问这个页面时就会受到攻击,不需要用户手动点击payload便可完成攻击。
二、DVWA靶场实战
1.存储型XSS漏洞利用(LOW)
1.1.实验思路
- 测试靶场接口是否过滤<script>标签
- 构造payload判断渗透点
- 构造payload获取cookie
1.2.实验步骤
(1)打开dvwa靶场,修改安全级别为low
(2)选择实验关卡
(3) 测试接口是否过滤特殊字符/<script>标签
在name、message两处提交框输入<script>alert(1)</script>,进行了两次弹窗,说明两个提交框都存在xss漏洞,并且没有对输入的内容进行任何的过滤。
但是在name提交框输入时发现输入的内容字节数有所限制,F12键打开开发者模式修改:
(4)构造payload并获取cookie
<script>alert(document.cookie)</script>
2.存储型XSS漏洞利用(medium)
1.1.实验思路
- 测试靶场接口是否过滤<script>标签
- 分析源代码
- 构造payload判断渗透点
- 构造payload获取cookie
1.2.实验步骤
(1)打开dvwa靶场,修改安全级别为medium
(2)选择实验关卡
(3) 测试接口是否过滤特殊字符或者<script>标签
在name、message两处提交框输入<script>alert(1)</script>
此时页面不再弹框,而是直接将输入的内容去掉标签直接输出,因此可能存在过滤。
(4)分析源代码
源码中str_replace() 函数的作用是替换字符串中的一些字符(区分大小写)。
分析源码可知会将<script>标签替换为空,因此我们可以利用双写或者大小写混写达到绕过的目的。
(5)构造payload并获取cookie(双写绕过)
<scr<script>ipt>alert(1)</scr<script>ipt>
此时成功弹窗,那么也就可以利用弹窗获取cookie。
(6)构造payload获取cookie
<scr<script>ipt>alert(document.cookie)</scr<script>ipt>
至此双写绕过已完成,关于大小写绕过这里提供payload样例即可,有兴趣的网友可以自行尝试。大小写payload如下:
<sCript>alert(1)</scriPt>
3.存储型XSS漏洞利用(high)
3.1.实验思路
- 测试靶场接口是否过滤<script>标签
- 分析源代码
- 构造payload判断渗透点
- 构造payload获取cookie
3.2.实验步骤
(1)打开dvwa靶场,修改安全级别为medium
(2)选择实验关卡
(3) 测试接口是否过滤特殊字符或者<script>标签
在name、message两处提交框输入<script>alert(1)</script>
此时页面不再弹框,name提交框只“>”输出,message提交框去掉<script>标签直接输出alert(1)内容,因此可能存在过滤。
(4)分析源代码
源码中preg_replace 函数会对$name的值执行一个正则表达式的搜索和替换。会将<script>标签除”>”中的所有字符全部替换为空然后输出,此时双写、大小写混写已经不再适用,可采用其他标签方式进行绕过。
分析源码发现后台会对变量message首先利用addslashes()函数在每个双引号前面加上反斜杠进行转义,然后再利用strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。因此在message提交框中无法进行xss注入,可以尝试在name提交框输入payload。
(5)构造payload并获取cookie(双写绕过)
<input οnfοcus="alert('xss');">提交后输出一个提交框
点击提交框开始弹窗
成功弹窗说明我们此时可以利用此标签构造payload获取cookie。
(6)构造payload获取cookie
<input onfocus="alert(document.cookie);">
成功获取cookie。
总结
以上就是我对DVWA靶场存储型xss实验的一个总结,欢迎各位大佬指正。