之前简单了解实践了sql注入,可以发现它提供的权限可谓非常之大,泄露的信息可能数不胜数.
那么web安全中还有没有更危险的攻击方式呢?
就迎来了今天的命令注入 (Command injection)
1. 什么是命令?

以上是常见的命令行窗口(也可以叫终端Terminal).当然实际上他们是对底层语言调用的一个函数封装.通过我们输入命令去触发特定的函数.
考虑到Kali Linux熟悉的人不多,先通过介绍windows上常见的dos命令来上手
2. 命令可以做什么?
常见的如下
- 查看网络,并查找关键字( ipconfig | find “v4”)
- 查看系统用户 /系统注册时间 (net user)
- 查看目录文件/查找 (dir 和 find)

1 2 3 4 5 6
| #特别注意Win下有很多很坑的地方. 一是目录优先这样写 dir c:\\xx\\ #因为C:/基本不支持. C:\可能被转义了. #这几种写法尽量避免,容易出错 (x) cd c:\\ && dir #报错 (x) cd c:\\;type xx.txt #没反馈 #多条语句一起执行要把 & 拼接进去.PHP末尾的双引号会自动添加. 并且需要转义为%26,不然会被视为内部的&
|
写个demo去模拟命令注入.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <?php header("Content-Type: text/html;charset=utf-8"); ?>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="pragram" content="no-cache"> <meta http-equiv="cache-control" content="no-cache, must-revalidate"> <meta http-equiv="expires" content="0"> <meta http-equiv="X-UA-Compatible" content="IE=11">
<title>commandInject</title> </head> <body> <?php if (isset($_GET['type'])) { $type = $_GET['type']; } else { $type = 1; } switch($type){ case 1: exec('ipconfig | find "v"', $output, $status); break; case 2: exec('net user', $output, $status); break; case 3: exec('dir', $output, $status); break; } foreach($output as $value){ echo(mb_convert_encoding($value, "UTF-8", "UTF-8")); echo("<br />"); } ?> </body> </html>
|
比如,如果我们想通过eval()去执行 php的函数 exec(). 然后通过exec执行系统的命令比如ipconfig. 那么需要打印出反馈信息. system()可以直接输出,但是排版很糟糕. 在ctf比赛里面,一般获得了这种高权限,就可以直接输出flag了.
1 2 3 4 5 6
| cmd=exec("ipconfig",$out); foreach($out as $v){ echo htmlspecialchars($v); echo "<br/>"; }
|
3. 命令注入分析
命令注入,其实也像一种中间人攻击. 只不过是加了几个特点限定条件. (3者任一不满足都会失败)
命令注入也多跟文件上传漏洞结合在一起,比如通过文件上传了一个eval.php文件,然后直接访问php文件去执行里面的eval()函数.
需要有可调用的系统函数(bash类) 比如:

这里system,eval,exec是可以嵌套使用的. 也有专门针对的shell_exec. 一个函数利用不成可以试试其他.都属于极高权限的利用了.
需要函数或者它的参数可以修改
需要能拼接注入的命令,常见CTF中就是获取/root/flag.txt 这类文件.一步到位,所以危害很大.
4. 如何防范
PHP来说,最直接粗暴的就是禁掉上述命令. eval模块里关. 因为这些命令一般编程并不会使用,所以这个方法可能最直接有效. 然后就是做权限控制,不允许大部分上传的目录有执行权. 然后对后缀名以及图片进行压缩. 影响伪装和上传.