【代码审计】dvwa命令执行漏洞的代码(高级)

本文详细介绍了如何在dvwa靶场环境中利用PHP的trim、str_replace、array_keys和stristr函数进行命令执行,以及php_uname用于检测操作系统的过程。重点展示了如何通过POST请求过滤输入并执行不同操作系统的ping命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境搭建:

环境系统Windows
靶场dvwa靶场

命令执行漏洞high源码:

 <?php

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

    // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

    // Remove any of the charactars 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>";
}

?>

运行原理

1.通过post方式上传一个参数(如果不是post参数则不执行)

2.利用trim()函数,删除上传命令首尾的空白字符和预定义字符,然后再将$target。(过滤预定义字符:括号、引号、运算符等)

3.创建一个数组

4.利用array_keys将原数组的key(键名)生成一个新的数组

5.利用str_replace()函数将查看上传的数据有没有array_keys生成的新数组值(如果有则将数据中与新数组值一样的值替换成原数组的vale值.(过滤)

6.利用php_uname()函数获取主机信息

7.利用stristr()函数对上传的数据进行搜索,判断数据中有没有'Windows NT',如果有是Windows输出,否则是nix输出.

重点函数使用 

  • trim

trim() 是 PHP 中的一个函数,用于删除字符串首尾处的空白字符或其他预定义字符。 这个函数接受两个参数:第一个参数是要修剪的字符串,第二个参数是一个可选的字符串,指定要删除的字符。如果没有提供第二个参数,那么 trim() 将默认删除字符串两端的空白字符(空格、制表符、换行符等)。 下面是一个使用 trim() 函数的例子:

$text = " Hello, world! "; 

echo trim($text);

输出 Hello, world!

因为在字符串的开头和结尾处分别有一个空格,这些空格已经被 trim() 函数删除掉了。 需要注意的是,trim() 函数并不会删除字符串中间的空白字符

  • str_replace

str_replace() 是 PHP 中的一个内置函数,用于替换字符串中的一部分内容。 这个函数接受三个参数:第一个参数是要搜索的目标字符串,第二个参数是要被替换的新字符串,第三个参数是要在其中进行替换的操作字符串。 下面是一个使用 str_replace() 函数的例子:

$old_string = "Hello, World!"; 

$new_string = str_replace("World", "Earth", $old_string); 

echo $new_string;

输出 Hello, Earth!

因为我们在 Hello, World! 这个字符串中用 Earth 替换了 World。 需要注意的是,str_replace() 函数只会替换字符串中第一次出现的目标字符串,如果您想替换所有出现的目标字符串,可以使用 str_ireplace()preg_replace() 函数。

  • array_keys

array_keys() 是 PHP 中的一个内置函数,用于返回数组中所有的键名作为新的数组。 这个函数接受一个数组作为参数,并返回一个新数组,其中包含了原数组的所有键名。 下面是一个使用 array_keys() 函数的例子:

$array = array("apple" => 0, "banana" => 1, "cherry" => 2); 

print_r(array_keys($array));

输出:

Array 
( 
[0] => apple 
[1] => banana 
[2] => cherry 
)

这就是因为 array_keys() 函数返回了一个新数组,其中包含了原数组 $array 的所有键名:apple、banana 和 cherry。

  • stristr

stristr() 是 PHP 中的一个函数,用于在字符串中搜索一个子串,忽略大小写。 这个函数接受两个参数:第一个参数是要搜索的目标字符串,第二个参数是要搜索的子串。如果找到了匹配的子串,那么就返回包含该子串及其后面部分的字符串;否则返回 FALSE。 下面是一个使用 stristr() 函数的例子:

$string = "Hello, World!"; 
$search = "world"; 
$result = stristr($string, $search); 
echo $result;

输出 rld!

因为它是在忽略大小写的条件下搜索 world 子串的结果。 需要注意的是,stristr()函数只会返回找到的第一个匹配项及其后面的部分,

  • php_uname

php_uname() 是 PHP 中的一个函数,用于获取系统的信息。 这个函数返回一个包含系统信息的字符串,包括操作系统名称、版本号、主机名等内容。 下面是一个使用 php_uname() 函数的例子:

$info = php_uname(); 
echo $info;

输出:

Linux localhost 4.4.0-19041-Microsoft #267-Microsoft Thu Dec 12 14:58:½
### 复现DVWA命令执行漏洞 #### 准备工作 为了成功复现命令执行漏洞,需确保已安装并配置好DVWA(Damn Vulnerable Web Application)。该应用提供了一个可控环境来测试各种类型的Web安全漏洞。设置完成后,访问DVWA界面并将所有保护级别调整至最低。 #### 实验环境描述 实验环境中使用的工具和服务包括但不限于Apache HTTP服务器、PHP以及MySQL数据库服务。这些组件共同构成了一个典型的LAMP栈架构,在此基础上部署了DVWA平台[^1]。 #### 构造恶意输入 当尝试模拟攻击时,重点在于找到可以被利用的入口点。对于命令执行漏洞而言,通常涉及对用户输入缺乏适当校验的情况。例如,在DVWA中的“Command Execution”模块下有一个表单允许用户查询给定IP地址的相关信息。此时可作为注入点: ```plaintext 8.8.8.8; ls / ``` 上述输入不仅会正常显示关于`8.8.8.8`的信息,还会额外列出根目录下的文件列表,这表明成功的实现了基本级别的命令注入[^2]。 #### 提升权限与进一步探索 一旦确认基础命令能够被执行,就可以考虑更复杂的场景。比如读取敏感文件内容或获取当前用户的shell访问权等操作。需要注意的是,在实际渗透测试过程中应当遵循合法授权范围内的活动准则,严禁超出许可的行为。 #### 利用PHP内置函数实现命令执行 在某些情况下,开发者可能会直接调用像`shell_exec()`这样的危险函数来处理来自前端的数据而未做充分的安全检查。这种做法极易引发严重的安全隐患。以PHP为例,下面是一段可能存在风险的代码片段: ```php <?php $ip = $_GET['ip']; $output = shell_exec('ping ' . $ip); echo "<pre>$output</pre>"; ?> ``` 这段代码接收未经验证的GET请求参数,并将其拼接到系统命令中去执行,这就为潜在的攻击者提供了机会来进行命令注入攻击[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值