原理
XSS漏洞是攻击者将恶意代码注入到合法网页中,当用户浏览该页面时,恶意代码会被执行,从而获取用户敏感信息或进行其他攻击。
形成原因
网站对用户输入数据的过滤不严格或不完备,攻击者可以根据这个漏洞向网站提交恶意代码,然后再将这些代码传播给其他用户,从而造成危害。
防御措施
- 输入过滤:在网站接收用户输入数据之前,需要对输入数据进行过滤。例如,可以使用编码标记来过滤HTML、JavaScript和CSS等标记语言。
- 输出编码:对于显示在页面上的输入内容,需要进行输出编码,以避免JavaScript脚本的注入攻击。例如,可以使用Escape函数或EncodeURIComponent函数来对特殊字符进行编码。
- cookie安全:通过对Cookie的设置来限制客户端对Cookie的读取和修改。例如,使用HttpOnly标志可以禁止脚本访问Cookie,从而有效降低攻击的风险。
- 安全编程:开发人员应该牢记安全编程的原则,例如使用白名单验证策略、禁止直接操作DOM等规则,以避免开发过程中出现安全漏洞。
突破方式
- 利用漏洞:攻击者使用已知的或未公开的漏洞来突破网站的XSS防御措施,从而成功注入恶意脚本。
- 钓鱼式攻击(Phishing):攻击者通过伪造合法的邮件、网站、电话等方式引诱用户主动点击链接进入钓鱼网站,并注入恶意脚本,从而突破XSS防御系统。
- 反射型XSS攻击:攻击者向目标网站提交恶意脚本,然后将脚本放在URL中传递给受害用户,当用户访问这个URL时,恶意脚本就会被执行,攻击成功。
- 存储型XSS攻击:攻击者将恶意脚本存储到目标网站的数据库中,在用户访问受影响的页面时,恶意脚本会从服务器端传递给用户并在用户浏览器上执行。—辗转相除法。(本质上Base64编码是64进制,Base58编码是58进制)
Reflected型-XSS
-
【Low】级别
查看源码,发现没有任何过滤,就是直接把用户输入的内容反射给浏览器。
这里直接在输入框里面输入代码:<script>alert("GXY")</script>。
-
【Medium】级别
查看源码如下图所示,下图方框中的代码作用是替换name中的出现的<script>,那就可以通过改变<script>的大小写来绕过。
源码是通过referrer这个字段的参数进行判断的,通常情况下在增加referrer验证时就是网站本省当前页面的ip地址,这里需要抓包看看相关信息。
这里在输入框里面可以输入代码:<SCRIPT>alert("GXY")</script>(这里的可以将<script>里面的任意字母改为大写即可),此处也可以通过双写(即写两个嵌套的script)来绕过,即在输入框里面输入代码:<s<script>cript> alert("GXY")</script>。
-
【High】级别
查看源码如下图所以,这里i是正则表达式,表示in-casesensitive,即大小写不敏感。然后代码里面的(.*)看不太懂,去网上查找发现是正则表达式(“.”表示匹配除换行符\n之外的任何单字符,“*”表示零次或多次),“.*”意思就是任意字符出现零次或多次。以表达式a.*b为例,它将匹配最长的以a开始,以b结束的字符串。
这里的输入框就可以不用输入<script>标签,可以换成其他标签输入,这里我输入的<body onl oad=alert’GXY’>。
Sort型-XSS
-
【Low】级别
这里在name输入框里面随意输入一个代码,然后在message输入框里面输入代码<script>alert("GXY")</script>。
对于name栏,它的长度是有限制的,所以代码不能完整的写进去,解决办法就是把这里的长度改大一些,直接F12,查看源码,在图中位置更改长度。
然后再回到dvwa的界面,在name栏就可以输入完整的代码段,然后message里面的内容可以随意写。
-
【Medium】级别
仍然使用刚刚的构造,渗透失败了,但是发现系统把<script>标签过滤掉了。然后查看源码,可以看到,由于对message参数使用了htmlapecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只限制了输入长度,过滤了。
补充:strip_tags()函数:剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签;addslashes()函数:返回再预定义字符(单引号、双引号、反斜杠,NULL)之前添加反斜杠的字符串。
这里由于name长度不能超过10,所以这里通过修改html源码把name的长度改大一些。(这里把长度10改成了10000)。
然后在name栏里面就可以输入完整的代码,但是依然渗透失败,于是参考之前做反射型XSS时的思路,采用大小写混写,居然成功了。
还可以使用工具burpsuit抓包解决,首先抓取到数据包后把代码段(这里依旧是采用大小写混写模式)添加到图中1的位置,然后点击forward。
在浏览器中就可以看到刚刚对数据包操作后,浏览器给出的响应。
-
【High】级别
使用工具burpsuit抓包解决,首先抓取到数据包后把代码段(这里采用其他标签,我是用的<body>标签)添加到图中1的位置,然后点击forward。
在浏览器中就可以看到刚刚对数据包操作后,浏览器给出的响应。
同样的这里把name栏的长度改大一点,然后采用其他标签的方式进行渗透。