准备
渗透工具:burpsuite、火狐浏览器、FoxyProxy火狐代理插件。
常用的XSS攻击语句
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<iframe onload=alert(/xss/)>
复制代码
攻击
XSS(DOM)
一、low级别
既然已经知道当前页面存在xss dom类型的漏洞,所以咱们直接检查一下下拉框内容对应的代码
可以看到lang等于default后面的值,并调用decodeURI()函数对其进行解码解释,所以我们可以直接构造XSS攻击语句,拼接在default=后面
攻击成功。
二、medium级别
分析medium级别的源码
就算不知道stripos()函数的作用,看注释也说了不允许script标签,再查一下stripos()函数的作用,发现其作用是stripos()函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
。刚好咱们也有其他的XSS攻击语句,试着在default=后面拼接<img src=x onerror=alert(1)>,结果发现没用。
开始分析一波,显然<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("恭喜中奖")>
攻击成功。
三、high级别
分析high级别的代码
代码通俗易懂,default的值只能是French、English、German、Spanish,显然直接往后拼接xss攻击语句没得玩。此时我们可以使用关于链接提交给服务器的一个知识点:
URL中#号之后的内容,不会被提交到服务器,直接在浏览器中交互
因为high级别中的代码没有对default=后的内容做任何的过滤,所以结合知识点,我们可以构造出 #<script>alert("恭喜中奖")</script>
攻击成功。
XSS(Reflected)
反射型XSS攻击原理
一、low级别
已经有了DOM类型的攻击经验,反射型的low级别就易如反掌,直接在输入框中输入<script>alert("恭喜您中奖了,点击链接领取奖励")</script>
攻击成功。
二、medium级别
查看medium级别的源码
看到使用str_replace()函数将输入内容中的<script>标签替换为空,那么攻击就很简单,使用其他的xss攻击语句即可攻击成功。除了这种简单直接的方式,还可以通过混写<script>来绕过替换函数,比如将<script>写成<sc<script>ript>,这样替换后还剩一个<script>,也可将<script>写为<scRipt>。
攻击成功。
三、high级别
看源码
可以看到直接使用正则表达式检测script断了各种绕写的后路,不过没有检测其他标签,所以使用其他的攻击语句即可攻击成功。
XSS(Stored)
存储型XSS攻击原理
一、low级别
如图所示有两个输入框,分别输入<script>alert("恭喜中奖")</script>
,发现Name输入框有字数限制,Message没有,点击sign
攻击成功。
二、medium级别
还是和low级别的操作一样,先不管它的防御策略,把攻击语句先输进去提交试一下效果,不出所料,失败了
从显示效果上看,显然<script>被过滤掉了,看看源码引证一下猜测
源码中使用htmlspecialchars()函数对message中的预定义字符转换为HTML实体,即浏览器不会把它再作为HTML元素进行解释执行。除了使用htmlspecialchars()函数,还使用了strip_tags()函数剥去字符串中的 HTML 标签。对于message中的字符串的防御可以说是滴水不漏,但是对于name字符串仅仅是做了字数限制和<script>的替换,我们只需要抓包后修改一下name中的内容,替换为xss攻击语句<img src=x onerror=alert(1)>
即可完成攻击
攻击成功
三、high级别
看high级别的源码
message还是滴水不漏,name仅过滤<script>和它的混写,所以medium中的攻击操作仍然有效
攻击成功