前言
由于最近在做XSS方面的测试,于是找到了DVWA平台进行实验测试,通过这三篇文章让大家了解XSS方面的大概内容,这三篇文章只是把你领进XSS的大门,要想真正深入的学习XSS,你还需要去学习很多东西来提升自己。
网站测试分为黑盒测试和白盒测试,在这里采用白盒测试来对网站进行XSS漏洞测试,XSS漏洞分为三种:反射型XSS、存储型XSS、DOM型XSS,分别用三篇文章来进行阐述。
XSS攻击形成原理
XSS中文名是“跨站脚本攻击”,英文全称是“Cross Site Scripting”。
XSS也是一种注入攻击,长期以来被列为客户端web安全中的头号大敌,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中时,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器解析执行导致用户被攻击。
OWASP TOP 10 威胁多次把XSS列在榜首,常见的危害有:cookie窃取、session劫持、钓鱼攻击、蠕虫、ddos、获取用户真实IP、识别用户浏览器 ··········
dvwa反射型xss
反射型XSS:只是简单地把用户输入的数据反射给浏览器,一般出现在URL参数中及网站搜索栏中,只有用户点击恶意链接触发恶意代码的URL,才能受到攻击,只能触发一次,也被称为“非持久型XSS(Non-persistent XSS)”。
漏洞测试
low级别
在输入框里面随便输入一个String(admin),发现显示:Hello admin这句话,同时可以知道数据提交是以GET请求的方式
查看源码:并没有什么Protect,这是最危险的
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
构造payload,执行最简单的XSS攻击
http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C/script%3E
当用户触发该URL时就会受到XSS攻击,有弹框出现
后续测试,利用此漏洞,你也可以尝试去获得用户登陆的Cookie,在这里就不多说了,很容易实现的
medium 级别
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
经过代码审计,可以发现medium级别进行了Protect,对GET请求到的的内容进行''
字符串匹配,将内容里出现的该字
符串替换成空,避免<script>
标签造成的XSS攻击,但是<script>
标签真的就不能使用了吗,答案是可以使用的,回过头来继续分析此str_replace()函数
str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。
在这里可以利用str_replace()函数区分大小写的缺点来进行XSS攻击
构造payload,继续使用<script>
标签进行XSS攻击
http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CsCript%3Ealert%28%271111%27%29%3C%2Fscript%3E#
成功绕过<script>
标签的匹配
另一种绕过方法不使用<script>
标签进行XSS攻击,既然str_repalce()函数匹配的是<script>
标签,而不匹配其它标签,所以在这里也可以利用<img>
标签进行XSS攻击
构造payload
http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#
<img>
标签绕过str_replace()
high 级别
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
代码审计之后,发现high级别存在另外一种的Protect,利用preg_replace()函数进行匹配“< s r i p t”
等字符,将其置为空,此时<script>
标签是不能使用的,不管是大小进行区分写都不可以
小写<script>
标签被过滤
http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C%2Fscript%3E#
大小写混合<script>
标签被过滤
http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CScripT%3Ealert%28%22_XSS_%22%29%3C%2FscriPt%3E#
上面的既然都不行,就需要利用其它标签进行XSS攻击,此处可以利用 medium 级别 中提到的<img>
标签进行绕过preg_replace()函数的Protect
构造payload
http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#
<img>
标签成功绕过preg_replace()
impossible 级别
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
impossible 级别的Protect不能被绕过,由于htmlspecialchars()函数的保护作用
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
它的语法如下:
htmlspecialchars(string,flags,character-set,double_encode)
其中第二个参数flags需要重要注意,很多开发者就是因为没有注意到这个参数导致使用htmlspecialchars()函数过滤XSS时被绕过。因为flags参数对于引号的编码如下:
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
默认是只编码双引号的
因为输入的所有标签都被转义,所以此处不存在XSS攻击,但是要注意flags属性,使用不当过滤XSS时就会被绕过。