DVWA-XSS(反射型跨站脚本、存储型跨站脚本)
-
- XSS摘要
-
- 反射型XSS
-
- Low
-
- 漏洞利用
- Medium
-
- 漏洞利用
- High
-
- 漏洞利用
- Impossible
- 存储型XSS
-
- Low
-
- 漏洞利用
XSS摘要
XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。
DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。
反射型XSS
Low
服务器端核心代码
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
## 在此我们看到,代码直接引用了那么name参数,并没有任何的检查和过滤机制,很明显存在XSS漏洞
漏洞利用
输入<script>alert(123)</script>,弹框成功
Medium
服务器端核心代码
<?php
// 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>";
}
?>
## 上面代码可以看到,这里对输入进行了检查或过滤,基于黑名单的思想,我们可以使用str_replace函数将输入中的<script>删除,这种防护措施我们可以用绕过的方式
漏洞利用
我们可以用双写的方式绕过,输入<scr<script>ipt>alert(123)</script>,弹框成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jbi5tU4-1605844306086)(C:\Users\andi_qiyouyin\AppData\Roaming\Typora\typora-user-images\image-20201106101857033.png)]
我们还可以用大小写绕过方式,输入<ScRiPt>alert(123)</script>,成功弹框
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XkBCciWf-1605844306088)(C:\Users\andi_qiyouyin\AppData\Roaming\Typora\typora-user-images\image-20201106102236584.png)]
High
服务器端核心代码
<?php
// 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级别的代码同样使用了黑名单过滤输入,preg_replace()函数用于正则表达式的搜索和替换,这使得双写绕过、大小写绕过(正则表达式中i标识不区分大小写)不在有效
漏洞利用
虽然无法使用<script>标签注入XSS代码,但是可以通过img、body等标签的事件或者ifrname等标签的src注入恶意的js代码,输入<img src=1 onerror=alert(123)>,成功弹框
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V617nb9U-1605844306089)(C:\Users\andi_qiyouyin\AppData\Roaming\Typora\typora-user-images\image-20201106105733688.png)]
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级别的代码使用htmlspecialchars函数把预定义的字符& " ' < > 转换成HTML实体,防止浏览器将其作为HTML元素
存储型XSS
Low
服务器端核代码
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = stripslashes( $message ); $message = mysql_real_escape_string( $message ); // Sanitize name input $name = mysql_real_escape_string( $name ); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); //mysql_close();
}
?>
## 相关的函数解析
trim(string,charlist)
函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。
mysql_real_escape_string(string,connection)
函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义。
stripslashes(string)
函数删除字符串中的反斜杠。
可以看到,对输入并没有做XSS方面的过滤与检查,且存储在数据库中,因此这里存在明显的存储型XSS漏洞。
漏洞利用
我们在name一栏中随意输入,但是不能不输入,在message一栏中输入<script>alert(123)</script>,成功弹框