DVWA练习-Command Injection

文章详细介绍了命令执行漏洞的概念,常见于网络设备的Web管理界面,通过管道符等手段可能导致恶意命令执行。从低到高难度展示了不同级别的防护措施,包括简单的参数过滤到IP地址验证和CSRF令牌,提醒开发者在编写命令执行接口时应加强用户输入的验证和安全控制。

命令执行漏洞

漏洞简述

命令执行漏洞常见于路由器、防火墙、入侵检测等设备的web管理界面中,这些界面常常会提供给用户进行远程命令操作的接口。

例如:提供给用户ping操作的web界面,用户从web界面输入IP,后台会根据用户输入的内容来做ping操作。如果后台未作严格的安全控制,则可能会导致攻击者通过该接口提交恶意命令。如,在ping检测功能中 提交: 192.168.56.137 & whoami ,这段字符串分两部分,通过管道符 & 连接,后台则会ping完IP地址后,执行后续的 whoami 指令,由此黑客获得服务器管理员的用户名,以下是其他常见管道符:

管道符效果
A | B无论A=1 or 0,B都会执行
A ; B无论A=1 or 0,B都会执行
A & B无论A=1 or 0,B都会执行
A || B仅当A=0时,B执行
A && B仅当A=1时,B执行

常用的cmd命令:

命令效果
whoami查看当前用户名
ipconfig查看网卡信息
shutdown -s -t 0立即关机(-s代表shutdown,-t代表time,0表示0s后shutdown)
net user [username] [password] /add增加一个用户名为username,密码为password的新用户
type [file_name]查看名为filename文件内容

难度-Low

过程

web页面给的入口是IP测试,我们输入回环地址进行测试,测试结果:
在这里插入图片描述
可以看到,服务器反馈的结果是正常ping通地址的结果
在low等级里,我们可以通过简单地在地址后添加“管道符+指令的方式”来利用漏洞:
&whoami 让服务器显示用户名:
在这里插入图片描述
在反馈信息中可以找到用户名的域和用户名

源码:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // isset()函数用于判断括号内变量是否为空,返回bool值
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // stristr(A,B)函数查找B在A中的第一次出现,并返回B及其后面的字符串
        // stristr()不区分大小写,strstr()区分大小写
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
        // shell_exec()通过shell环境执行命令,并且将完整的输出以字符串的方式返回
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>

源码解析:
判断浏览器是否提交 → 若提交 → 将提交内容传给$target → 判断服务器系统 → 使用shell执行响应命令,并将命令传给$cmd → 打印$cmd

总结

  • 攻方:
    在面对web命令执行接口时,我们要抓住潜在的漏洞,该漏洞可以通过在要上传的字符串后添加管道符和攻击指令来对服务器造成影响。

  • 守方:
    在编写命令执行接口时,一定要对用户输入的字符串做甄别,消除潜在威胁。

难度-Medium

过程

Medium难度的服务器源码增加了黑名单,将用户输入的字符串进行甄别,除去或替换可能攻击服务器的字符串

源码:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Set blacklist
    $substitutions = array(
        '&&' => '',
        ';'  => '',
        // 此处创建了一个关联数组,但这里的名单没有写全,“&”仍可以使用
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
    // 注意这里str_replace()的用法,str_replace(A,B,C),函数将C中的A替换成B,此处的A位置,使用了array_keys()函数,为关联数组$substitutions中的keys值另外创建一个数组,此处的替换,是使用了映射替换,两个数组之间元素关系一一对应。

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>

在这里插入图片描述
因为medium难度黑名单不全,所以可以通过其他管道符来攻击该漏洞:
在这里插入图片描述

总结

  • 攻方:
    在针对命令执行漏洞的攻击中,我们可以多尝试管道符,或许服务器的黑名单不全,从而导致出现漏洞。

  • 守方:
    在编写有关命令执行类接口时,我们要注意黑名单是否齐备,天网恢恢,疏而不漏

难度-High

过程

High难度相比于Medium的变化是,对黑名单做了进一步补全,让我们看一下源码:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = trim($_REQUEST[ 'ip' ]);

    // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
        // 黑名单进一步补全了可能造成威胁的字符
    );

    // Remove any of the characters in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>

一般的添加管道符+指令无法攻击漏洞:
在这里插入图片描述
然而,在关联数组的第三对元素里,这个后端程序员犯了一个小错误,'| ' => ''|符号后多写了一个空格,导致黑名单只能识别| ,竖杠和空格的组合,从而我们仍可以使用管道符|来破解,只需少写一个空格即可绕过黑名单:
在这里插入图片描述

总结:

  • 攻方:
    High难度的漏洞是由于程序员的疏忽导致的,我们不得不承认,程序编写习惯也可能导致一些出乎意料的错误,所以我们往往可以在攻击时在将这一部分考量进去,这次的演练中,在攻击时就可以多试试留出空格和不留出空格两种执行方式。

  • 守方:
    这提醒我们在编写后端白名单时需要留意字符的正确书写方式,事无巨细,要多在步骤的细节处把控好,防止漏洞的出现。

难度-Impossible

过程

源码:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    // 该行和代码最后一行都时为了预防CSRF跨站请求伪造攻击

    // Get input
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target );
    // 首先删除用户可能输入的反斜杠“\”

    // Split the IP into 4 octects
    $octet = explode( ".", $target );
    // 由于正常情况用户输入的是ip地址,使用explode()函数将字符串打散,以“.”为准,分成若干个元素,每个元素对应一个八位字节,这些元素重新组成数组,对数组的每个八位字节做进一步的检测

    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
        // If all 4 octets are int's put the IP back together.
        // 如果所有4个八位字节都是数字类型或数字字符串类型,就保留到下一步操作
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
        // 将检查完的4个八位字节用“.”重新连接成一个字符串

        // Determine OS and execute the ping command.
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
            // Windows
            $cmd = shell_exec( 'ping  ' . $target );
        }
        else {
            // *nix
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }

        // Feedback for the end user
        echo "<pre>{$cmd}</pre>";
    }
    else {
        // Ops. Let the user name theres a mistake
        // 检查显示这4个八位字节中有非正常的数据类新,则报错,不再进行下一步操作
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?>

总结

  • 攻方:
    如果后台使用了Impossible难度的代码,那么将无法被攻破,只能寻求其他途径攻击。

  • 守方:
    impossible的防御正如其名,不可能被攻击,是安全开发人员的典范,其他后端语言也可实现相应的算法。对于命令执行漏洞,我们需要对用户输入的字符串做严格的检查,检查通过后才可以送至后台做操作。针对IP检测的接口,我们需要先将字符串中的“\”删除,再以“.”为准,分隔字符串,分隔出若干元素组成数组,再将数组的每个元素进行检查,检查他们是否都为数字,若不是,则报错;若是,则将这些数字重新通过“.”连接,生成新的字符串。最后对这串字符串做服务器的操作。扩展开来,在其他命令执行操作接口的后端编写中,我们可以按照标准输入的特点来编写检查步骤,将不符合标准的可能输入内容筛选剔除,从而保证最后进入系统控制台的字符串不会引起多余的操作。

该数据集通过合成方式模拟了多种发动机在运行过程中的传感器监测数据,旨在构建一个用于机械系统故障检测的基准资源,特别适用于汽车领域的诊断分析。数据按固定时间间隔采集,涵盖了发动机性能指标、异常状态以及工作模式等多维度信息。 时间戳:数据类型为日期时间,记录了每个数据点的采集时刻。序列起始于2024年12月24日10:00,并以5分钟为间隔持续生成,体现了对发动机运行状态的连续监测。 温度(摄氏度):以浮点数形式记录发动机的温度读数。其数值范围通常处于60至120摄氏度之间,反映了发动机在常规工况下的典型温度区间。 转速(转/分钟):以浮点数表示发动机曲轴的旋转速度。该参数在1000至4000转/分钟的范围内随机生成,符合多数发动机在正常运转时的转速特征。 燃油效率(公里/升):浮点型变量,用于衡量发动机的燃料利用效能,即每升燃料所能支持的行驶里程。其取值范围设定在15至30公里/升之间。 振动_X、振动_Y、振动_Z:这三个浮点数列分别记录了发动机在三维空间坐标系中各轴向的振动强度。测量值标准化至0到1的标度,较高的数值通常暗示存在异常振动,可能与潜在的机械故障相关。 扭矩(牛·米):以浮点数表征发动机输出的旋转力矩,数值区间为50至200牛·米,体现了发动机的负载能力。 功率输出(千瓦):浮点型变量,描述发动机单位时间内做功的速率,取值范围为20至100千瓦。 故障状态:整型分类变量,用于标识发动机的异常程度,共分为四个等级:0代表正常状态,1表示轻微故障,2对应中等故障,3指示严重故障。该列作为分类任务的目标变量,支持基于传感器数据预测故障等级。 运行模式:字符串类型变量,描述发动机当前的工作状态,主要包括:怠速(发动机运转但无负载)、巡航(发动机在常规负载下平稳运行)、重载(发动机承受高负荷或高压工况)。 数据集整体包含1000条记录,每条记录对应特定时刻的发动机性能快照。其中故障状态涵盖从正常到严重故障的四级分类,有助于训练模型实现故障预测与诊断。所有数据均为合成生成,旨在模拟真实的发动机性能变化与典型故障场景,所包含的温度、转速、燃油效率、振动、扭矩及功率输出等关键传感指标,均为影响发动机故障判定的重要因素。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>首先,用户的问题是关于DVWA中的命令注入漏洞测试。用户提到:“我想用户意图是在使用DVWA靶场时尝试进行命令注入(Command Injection)攻击,可能是为了测试或学习安全漏洞利用方法。” 所以,我需要提供关于如何在DVWA中测试命令注入漏洞的指导。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 引用站内引用:引用[1]是关于DVWA的CSRF教程,引用[2]是关于命令注入的笔记。这些引用是提供的参考,我需要尽可能参考用户的问题和我的回答。 用户的问题具体是:“请问DVWA command injection vulnerability test”,所以我应该直接回答如何测试命令注入漏洞。 结构化回答: 1. **引言**:解释命令注入漏洞是什么,以及它在DVWA中的位置。 2. **步骤**:逐步指导如何在DVWA中测试命令注入漏洞。 3. **示例**:提供一些命令注入的示例代码或命令。 4. **安全提示**:提醒用户在测试时注意安全,因为这是在学习环境中。 5. **生成相关问题**:在末尾添加相关问题。 引用处理: - 在回答中,如果引用到提供的引用内容,需要添加引用标识。例如,提到DVWA模块时引用[^1],提到命令注入语句时引用[^2]。 - 引用[1]:DVWA模块包括命令注入。 - 引用[2]:给出了具体的命令注入语句。 回答必须使用中文。 生成相关问题: - 在末尾添加“相关问题”部分,列出2-3个相关问题。 确保LaTeX使用正确: - 用户的问题中没有数学表达式,所以可能不需要。但如果涉及公式,比如在解释漏洞时,可能需要使用。但DVWA命令注入主要是文本命令,可能不需要数学公式。所以,我可以避免使用,除非必要。 内容大纲: 1. **介绍命令注入漏洞**:简要解释什么是命令注入,以及为什么在DVWA中测试它。 - 引用[^1]:DVWA有命令注入模块。 2. **设置DVWA**:如果需要,简述如何设置DVWA环境(但用户可能已经设置好)。 3. **测试步骤**: - 访问命令注入模块。 - 输入示例命令进行注入。 - 展示结果。 - 提供示例命令,如引用[^2]中的。 4. **示例代码**:可能不需要代码块,因为命令注入是输入命令,而不是代码。但可以展示输入示例。 5. **安全注意事项**:强调只在授权环境中测试。 6. **相关问题**:生成相关问题。 相关问题想法: 1. 如何防止命令注入漏洞? 2. DVWA中其他漏洞的测试方法? 3. 命令注入漏洞的常见利用场景? 最终回答结构: - 开头:直接回答问题。 - 主体:逐步指导。 - 结尾:相关问题。</think>### DVWA命令注入漏洞测试指南 命令注入(Command Injection)漏洞允许攻击者通过输入字段执行任意系统命令,这可能导致服务器被完全控制。在DVWA(Damn Vulnerable Web Application)中,Command Injection模块专门设计用于学习和测试这种漏洞[^1]。下面我将逐步指导您如何在DVWA中安全地进行命令注入漏洞测试。整个过程基于DVWA的低安全级别(Low Security Level),确保操作简单易懂。测试前,请确保您已在本地或隔离环境中部署DVWA,避免对真实系统造成风险。 #### 步骤1: 设置DVWA环境 1. **登录DVWA**:访问您的DVWA实例(例如 `http://localhost/dvwa`),使用默认凭据登录(用户名:`admin`,密码:`password`)。 2. **调整安全级别**:在DVWA左侧菜单中,进入“DVWA Security”,将安全级别设为“Low”。这简化了测试,因为低级别未对输入进行过滤。 3. **进入命令注入模块**:导航到“Command Injection”模块(位于DVWA主菜单中)。您会看到一个表单,提示输入IP地址进行ping测试[^1]。 #### 步骤2: 执行命令注入测试 命令注入的原理是通过输入字段注入额外命令。DVWA的表单设计为ping一个IP地址,但我们可以添加特殊字符(如`|`、`&`或`;`)来串联其他命令。以下是关键测试方法: - **基础注入**:在输入框中输入一个合法IP地址(如`127.0.0.1`),后接管道符`|`和额外命令。例如: - 输入:`127.0.0.1 | whoami` 这将执行ping命令后运行`whoami`(显示当前用户),输出结果会显示在页面上,例如: ``` PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.05 ms ...(ping输出)... root # whoami命令的输出 ``` 这确认漏洞存在,因为用户命令被成功执行。 - **进阶注入**:使用更复杂的命令来测试系统权限或创建用户。参考常见注入语句[^2]: - 输入:`127.0.0.1 | net user` 列出系统用户,检查服务器权限。 - 输入:`127.0.0.1 | net user test 123 /add` 尝试添加新用户(用户名为`test`,密码`123`),成功后可在系统中验证。 - 输入:`127.0.0.1 | net localgroup administrators test /add` 将用户`test`提升为管理员组(仅在高权限环境有效)。 **关键技巧**: - 使用`&&`或`;`确保命令顺序执行(例如`127.0.0.1 ; ls` 列出目录)。 - 在Windows系统中,命令可能需调整(如用`dir`代替`ls`)。 - 如果输出被截断,尝试重定向到文件(如`127.0.0.1 | echo "test" > output.txt`)。 #### 步骤3: 分析结果和风险 - **漏洞确认**:如果额外命令的输出显示在页面上,说明注入成功。这暴露了服务器未对用户输入进行过滤的风险。 - **安全注意事项**: - 仅在本地或虚拟环境中测试,避免非法入侵。 -DVWA的高安全级别下,测试会失败(因为输入被消毒),这有助于学习防御机制。 - 测试后,恢复DVWA状态(例如删除添加的用户)。 命令注入漏洞源于应用程序未对用户输入进行转义或验证,常见于Web表单调用系统命令的场景[^2]。通过DVWA的测试,您可以深入理解漏洞原理,并为实际防御提供基础。 #### 相关问题 1. 如何防止命令注入漏洞在Web应用中出现? 2. DVWA中文件上传(File Upload)漏洞的测试方法是什么? 3. 命令注入漏洞在真实网络攻击中有哪些典型案例? [^1]: DVWA包含多个模块,如Command Injection,用于安全学习。引用来源:新手指南:DVWA全级别教程之CSRF。 [^2]: 命令注入语句示例,如`net user`操作。引用来源:DVWA笔记(二)Command Injection(命令注入)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值