DVWA之Command Injection

本文详细介绍了PHP命令注入漏洞,从lowlevel到impossiblelevel,分析了不同级别下如何利用特殊字符构造恶意命令,以及如何通过过滤和限制输入来防止此类攻击。在最高级别impossiblelevel中,代码对输入进行了严格限制,消除了命令注入风险。
摘要由CSDN通过智能技术生成

Command Injection:命令注入,在PHP文件中存在执行命令的模块,例如在常见的使用ping工具时,通过&||等符号进行拼接,构造恶意的命令,以达到获取用户信息的目的。PHP命令注入是常见的一种形式,好多CMS都曾出现过这种漏洞

low level

查看代码:


<?php

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

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

?>

代码分析:

stristr()函数:搜索字符串在另一字符串中的第一次出现,并且返回字符串的剩余部分;
php_uname(mode)函数:返回运行php系统的相关信息描述;

mode 是单个字符,用于定义要返回什么信息:
‘a’:此为默认。包含序列 “s n r v m” 里的所有模式。
’s’:操作系统名称。例如: FreeBSD。
‘n’:主机名。例如: localhost.example.com。
‘r’:版本名称,例如: 5.1.2-RELEASE。
‘v’:版本信息。操作系统之间有很大的不同。
‘m’:机器类型。例如:i386。

可以看到,源码中对ping功能 模块没有任何限制,可以直接进行测试:

windows和linux都可以用&&进行命令拼接:

e.g:127.0.0.1 && whoami 执行效果:

在这里插入图片描述
当然,这里还可以用其他命令,例如ipconfignet user等等

若是系统在linux下,甚至可以用127.0.0.1 && cat /etc/shadow读取信息,该漏洞危害巨大…

medium level

查看源码:
在这里插入图片描述
这里可以看到,源码对字符&&;进行了删除过滤,但是这只是限制了一部分,还可以用&&&&等等来进行拼接:
在这里插入图片描述
这里&&被删除了,最终执行的是127.0.0.1 & whoami

这里有一点需要注意:
命令1&&命令2 :表示 命令1执行成功才会执行命令2
命令1&命令2 :表示 命令1无论是否成功都会执行命令2
在这里插入图片描述
两者的区别:
在这里插入图片描述

这里有好多方式绕过源码限制:还可以&;合并使用:&;&;
在这里插入图片描述
这里是因为;被过滤删除,最终执行的是127.0.0.1 && whoami,这个可以自己挖掘,只要可以绕过都可以执行~

high level

分析源码:
在这里插入图片描述

这里过滤了好多字符,不过先用之前的测试一下~

用之前的命令测试了一遍都不可以,但是在观察过滤时发现过滤|时后边有个空格这里可以直接用127.0.0.1 |whoami绕过,在敲命令时,我们会习惯性一个命令一个空格,因此这里可以绕过:
在这里插入图片描述

命令1 | 命令2
|是管道符,表示将命令1的输出作为命令2的输入,并且只打印命令2执行的结果。

这个只是黑名单的“漏网之鱼”,所以我们在实战中要仔细认真分析源码,往往会有意外惊喜~

impossible level

分析源码:
在这里插入图片描述

函数分析:

stripslashes():函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。

explode(separator,string,limit):把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目,这里没用这个限制参数。

is_numeric(string):检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE

可以看到,Impossible level的代码对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

<小白初试,请大佬多多指教>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值