xss漏洞原理就是:利用HTML和javascript代码盗取别人的cookie或者整个页面的源码。
xss漏洞与mysql注入漏洞原理类似,但xss漏洞注入的是HTML,JavaScript和css。
举个简单的例子,用GET传参
echo $_GET['a'];
?>
这个时候,在页面上输入?a=
就会直接弹窗“1”出来。
DVWA xss(DOM) low级别:
先观察Low级别的源码,发现
源码上直接说了是没有任何保护的,那就直接怼上去就可以了。
即在网站输入?default=English
xss(DOM) Medium级别:
依然是先观察源码,看看增加了什么花样。
可以看到这里多了个stripos()函数,查询资料后可知
Stripos()函数——查找字符串在另一字符串中第一次出现的位置(不区分大小写)
根据源码一定要等于false,否则的话就会返回default。那么我们可以先试用一下刚才的弹窗指令?default=English
发现啥也没有弹出来。也就是说script被过滤掉了。
那我们可以换一种思路,即用漏洞
输入?default=English
回车后,跟刚才的不太一样,虽然都没有显示,但是
后面直接什么都没有了。
但是输入完后,在English后面还跟着输入进去的弹窗指令。
但是也还是没有弹出任何东西。
既然后面还跟着东西,也就是说输入的指令是对的,只不过应该是被某些东西给挡下来了。那我们可以进去HTML代码里面看看。
可以看到指令被写到 option value里面去了。
那就得绕过value把指令拿出来。
于是,?default=English
结果还是在里面出不来,那就直接把select给过了。
?default=English</option></select><img src=1 onerror=alert(1)>
这样就出现了弹窗了。
正常来说,xss漏洞写进来,它是单独一行的,应该不会写到option函数里面去的。那这个DOM型medium级别的xss漏洞就提供了一种思路。
如果所写的东西出现在HTML代码里面,但是没有弹窗,只是中间被什么东西给过滤了,这时候就绕过过滤的函数了。
high级别:
依然是先看源码
源码里面“#”是Ok 的
php的注释符有“#”
HTML的注释符并没有“#”
那只要一个“#”就可以绕过了。
?default=English#
impossible级别(xss(DOM)漏洞的保护)
意思是,不需要做任何事情,保护在客户端处理。
xss本身在IE上是有保护的,window默认会过滤掉xss,只不过写php的时候基于一些原因会把启用xss筛选器给禁用。
xss(Reflected) low级别:
依然没有任何防御,直接怼。
<script>alert(1)</script>
medium级别
出现了个str_replace()函数。
str_replace()函数以其他字符替换字符串中的一些字符(区分大小写)
因为区分大小写,所以可以用大小写绕过
<sCript>alert(1)</script>
high级别
这里出现了个正则匹配preg_replace()
preg_replace 函数执行一个正则表达式的搜索和替换。
如:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
其意思为搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
返回到题目中来,其意思为无数次匹配script的大小写,一旦发现就给注释掉。
既然不给用script,那就改用img咯
即可以用
impossible(抵挡xss(Reflected)漏洞)级别:
这里出现了htmlspecialchars() 函数
把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体
直接把弹窗指令所需要的“<”和“>”都变没了,那还怎么搞xss攻击?