DVWA-XSS 通关挑战

此文章是XSS漏洞练习,靶场是 DVWA 。

XSS分为反射型、存储型和DOM型,由于DOM型并不常见,故在此演示前两种类型的通关过程。

反射型(Reflected)

Low

先随意输入字符,发现会回显至页面中,故直接输入弹框代码进行尝试,发现成功弹框。

<script>alert(/xss/)</script>

Medium

键入原始弹框标签进行尝试,发现页面显示过滤了 <script> 标签。

 我们可以尝试变换大小写的方式进行输入,即可执行成功,由此证明只是过滤了小写的 <script> 标签。

<scRipt>alert(/xss/)</script>

High

 查看源码发现其对 <script> 标签进行了过滤,防双写,防大小写替换。

 但并未对其他标签进行过滤,故在此可以利用其他标签进行绕过。

<?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>";
}

?

利用图片标签配合事件响应的方式进行绕过,即执行成功。

<img src = '#' onerror = "alert(/xss/)">

存储型(Stored) 

Low

在 message 中输入弹框代码点击 sign 提交,即为执行成功。

<script>alert(/xss/)</script>

 Medium

查看源代码,我们发现该页面将 Message 中对所有可能的 xss 攻击标签都进行了转义或过滤,但对 Name 只是设置了 <script> 标签的过滤,故我们依旧还是可以尝试在 name 中进行大小写转换、双写等操作。

<?php

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( '<script>', '', $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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?> 

在这里需要注意一个问题,在 Name 中进行输入的时候,我们发现输入长度有限,故F12查看页面源代码,发现限制 Name 长度为10,可以讲长度改为100继续操作。

在这里使用大小写转换的方式输入弹框标签,即可成功。

<scRipt>alert(/xss/)</script>

High

在 High 等级中,也依照上方的操作进行对 name 的输入,提交后显示被过滤。

 故查看源代码发现,name 框中对 <script> 标签进行了过滤,包括大小写和双写。

 我们需要尝试其他方法进行弹框,例如其他标签 <a>、<img>或事件响应等。

<?php

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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?> 

在此我应用的是 <img > 标签与 事件响应 相结合的方式进行弹框,执行成功代码如下。

<img src = '#' onerror = "alert(/xss/)">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值