DVWA-XSS DOM、Reflected、Stored三种类型攻击(全阶段)

准备

渗透工具:burpsuite、火狐浏览器、FoxyProxy火狐代理插件。

常用的XSS攻击语句

<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<iframe onload=alert(/xss/)>
复制代码

攻击

XSS(DOM)

一、low级别

image.png

既然已经知道当前页面存在xss dom类型的漏洞,所以咱们直接检查一下下拉框内容对应的代码

image.png
可以看到lang等于default后面的值,并调用decodeURI()函数对其进行解码解释,所以我们可以直接构造XSS攻击语句,拼接在default=后面

image.png
攻击成功。

二、medium级别

分析medium级别的源码

image.png
就算不知道stripos()函数的作用,看注释也说了不允许script标签,再查一下stripos()函数的作用,发现其作用是stripos()函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。刚好咱们也有其他的XSS攻击语句,试着在default=后面拼接<img src=x onerror=alert(1)>,结果发现没用。

image.png

开始分析一波,显然<img src=x onerror=alert(1)>的注入是可以绕开stripos($default,”<script”)的校验的,那就是它被写入dom中时,没有起作用。咱们再看一遍下拉框对应的源码

<select name="default">
	if (document.location.href.indexOf("default=") >= 0) {
            var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
            document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
            document.write("<option value='' disabled='disabled'>----</option>");
        }
        document.write("<option value='English'>English</option>");
	document.write("<option value='French'>French</option>");
	document.write("<option value='Spanish'>Spanish</option>");
	document.write("<option value='German'>German</option>");
        ...
</select>
复制代码

如果<img src=x onerror=alert(1)>成功绕开校验,并付给lang,那么document.write(“<option value='”+lang+”‘>”+decodeURI(lang)+”</option>”)的拼接结果为

<select name="default">
    <option value=<img src=x onerror=alert(1)>></option>
    ...
复制代码

这样构造自然执行不了,所以我们需要将select和option标签闭合,在把img标签放出来,让浏览器解释执行,再次构造得到</option></select><img src=x onerror=alert("恭喜中奖")>

image.png
攻击成功。

三、high级别

分析high级别的代码

image.png
代码通俗易懂,default的值只能是French、English、German、Spanish,显然直接往后拼接xss攻击语句没得玩。此时我们可以使用关于链接提交给服务器的一个知识点:
URL中#号之后的内容,不会被提交到服务器,直接在浏览器中交互
因为high级别中的代码没有对default=后的内容做任何的过滤,所以结合知识点,我们可以构造出 #<script>alert("恭喜中奖")</script>

image.png
攻击成功。

XSS(Reflected)

反射型XSS攻击原理

image-20210315001848641.png

一、low级别

已经有了DOM类型的攻击经验,反射型的low级别就易如反掌,直接在输入框中输入<script>alert("恭喜您中奖了,点击链接领取奖励")</script>

image.png
攻击成功。

二、medium级别

查看medium级别的源码

image.png
看到使用str_replace()函数将输入内容中的<script>标签替换为空,那么攻击就很简单,使用其他的xss攻击语句即可攻击成功。除了这种简单直接的方式,还可以通过混写<script>来绕过替换函数,比如将<script>写成<sc<script>ript>,这样替换后还剩一个<script>,也可将<script>写为<scRipt>。

image.png
攻击成功。

三、high级别

看源码

image.png
可以看到直接使用正则表达式检测script断了各种绕写的后路,不过没有检测其他标签,所以使用其他的攻击语句即可攻击成功。

image.png

XSS(Stored)

存储型XSS攻击原理

image-20210315003042687.png

一、low级别

image.png
如图所示有两个输入框,分别输入<script>alert("恭喜中奖")</script>,发现Name输入框有字数限制,Message没有,点击sign

image.png
攻击成功。

二、medium级别

还是和low级别的操作一样,先不管它的防御策略,把攻击语句先输进去提交试一下效果,不出所料,失败了

image.png
从显示效果上看,显然<script>被过滤掉了,看看源码引证一下猜测

image.png
源码中使用htmlspecialchars()函数对message中的预定义字符转换为HTML实体,即浏览器不会把它再作为HTML元素进行解释执行。除了使用htmlspecialchars()函数,还使用了strip_tags()函数剥去字符串中的 HTML 标签。对于message中的字符串的防御可以说是滴水不漏,但是对于name字符串仅仅是做了字数限制和<script>的替换,我们只需要抓包后修改一下name中的内容,替换为xss攻击语句<img src=x onerror=alert(1)>即可完成攻击

image.png
image.png
攻击成功

三、high级别

看high级别的源码

image.png
message还是滴水不漏,name仅过滤<script>和它的混写,所以medium中的攻击操作仍然有效

image.png
攻击成功

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享