dvwa下xss练手实践

xss简介:

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。从而使目标计算机收到危害。

分类:

xss漏洞分为三类,分别是存储和反射。还有第三种不太知名的XSS攻击类型,基于DOM的XSS。

存储的XSS攻击

存储攻击是指注入的脚本永久存储在目标服务器上的攻击,例如在数据库,消息论坛,访问者日志,注释字段等中。受害者在请求存储时从服务器检索恶意脚本。信息。存储的XSS有时也称为持久性或类型 Ⅰ XSS。

反射型的XSS攻击

反射攻击是指注入的脚本从Web服务器反射出来的攻击,例如错误消息,搜索结果或包含作为请求的一部分发送到服务器的部分或全部输入的任何其他响应。反射的攻击通过其他途径传递给受害者,例如在电子邮件中或在其他一些网站上。当用户被欺骗点击恶意链接,提交特制表单,甚至只是浏览恶意网站时,注入的代码会传播到易受攻击的网站,这会将攻击反映回用户的浏览器。然后浏览器执行代码,因为它来自“可信”服务器。反射的XSS有时也称为非持久性或II型XSS。

本文就验证两种xss攻击,因为笔者尚未学习php语言,无法写出实验的网站代码,所以就使用dvwa进行渗透实验。

DVWA网站的安装可以参见以下网站:

https://www.cnblogs.com/amberly/p/6089224.html

在登陆DVWA以及将安全等级调为low等级之后,进行xss

(经笔者实验,在chrome浏览器下不能正常得到攻击后的响应,所以如果要进行实验的话建议使用Firefox等浏览器)

反射型xss:

Low

服务器端核心代码

Low Reflected XSS Source


// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '

Hello ' . $_GET[ 'name' ] . '
';
}

?>

观察到并没有对name进行任何的过滤操作。

那么输入

观察到弹窗。

dvwa下xss练手实践_第1张图片

接下来看中级的xss源代码:

Medium Reflected XSS Source


// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '

dvwa下xss练手实践_第2张图片

或者使用大小写混淆的方法。

dvwa下xss练手实践_第3张图片

成功绕过。

接下来我们看high级别的:

后端源代码:

High Reflected XSS Source


// 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 "

Hello ${name}
";
}

?>

 观察到使用了正则表达式来过滤:

preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i'

那么我们就不能使用大小写绕过和重写的方法来绕过了。

虽然无法使用 语句xss。

发现name栏中只能输入十个数据我们可以使用修改前端的方法将输入限制改到足够进行攻击,也可以使用burp进行抓包改包。

dvwa下xss练手实践_第5张图片

插入语句进行攻击。

dvwa下xss练手实践_第6张图片

dvwa下xss练手实践_第7张图片

可以发现攻击成功。

而且每次刷新界面都会弹窗,在数据库中可以看到用户提交数据

dvwa下xss练手实践_第8张图片

middle:

Medium Stored XSS Source


if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '绕过:

dvwa下xss练手实践_第9张图片

同理观察high级别的源代码:

High Stored XSS Source


if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '

' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );

    //mysql_close();
}

?>

 

同样正则过滤,使用

dvwa下xss练手实践_第10张图片

impossible级别的储存型xss:

Impossible Stored XSS Source


if( isset( $_POST[ 'btnSign' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = stripslashes( $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $name = htmlspecialchars( $name );

    // Update database
    $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
    $data->bindParam( ':message', $message, PDO::PARAM_STR );
    $data->bindParam( ':name', $name, PDO::PARAM_STR );
    $data->execute();
}

// Generate Anti-CSRF token
generateSessionToken();

?>

通过使用htmlspecialchars函数,解决了XSS,所以无法注入。

顺便送上几个检测方法:

 

通常有一些方式可以测试网站是否有正确处理特殊字符:

  • >
  • ='>
  • ">
  • %3Cscript%3Ealert('XSS')%3C/script%3E
  • (这个仅于IE7(含)之前有效) 

 

如有不当之处,希望各位大佬指出,谢谢大家。

你可能感兴趣的:(dvwa下xss练手实践)