命令执行漏洞形成原理是指应用在调用一些执行系统命令的函数时,像php函数。但是并没有在输入口做输入处理、或对危险函数并禁用,从而导致用户能从中利用这些函数将恶意的代码拼接起来到应用中执行,从而造成命令执行攻击。
代码执行漏洞形成原理是说应用程序在调用一些能够将字符串转换为代码的的函数时,没见有考虑用户是否控制 这个字符串,将造成代码执行漏洞。
漏洞产生的原因:
1.有没对用户进行过滤或过滤不严
例如,没有过滤&、&&、|、||等连接符
2.系统的漏洞造成命令注入
bash破壳漏洞(CVE-2014-6271)
3.调用的第三方组件存在在代码执行漏洞
例如:php函数(system、eval、exec、preg_replace等危险函数)
thinkphp代码执行
命令执行 VS 代码执行
命令执行漏洞:
直接调用操作系统命令
代码执行漏洞:
靠执行脚本代码调用操作系统命令
php代码执行&&命令执行函数:
代码执行函数:
1.eval()函数
eval()函数把字符串按照php代码来计算,传入的参数必须 是php代码,以分号结尾。
用户可以将php代码保存成字符串然后传送给eval()函数。这就是我们所说的eval代码攻击。
<?php
$cmd=$_REQUEST["cmd"]
eval($cmd);
?>
?cmd=phpinfo();
这样便可以显示整个php信息
2.assert()函数
assert()函数用来判断一个表达式是否成立。字符串被当作php代码执行。
<?php @assert($_POST['cmd'])?>
?cmd=phpinfo();
3.preg_replace()函数
preg_replace($pattern,$replacement,$subject),搜索subject中匹配pattern的部分,以replacement进行替换,造成危险的是当pattern处出现/e修正符,replacement处的值会被当作php代码运行。
<?echo preg_replace("/test/e",$_GET["h"],"jutst test");?>
输入?h=phpinfo(); phpinfo();函数会被执行
4.call_user_func()函数
call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ),此函数是把第一个参数作为回调函数,其余都是回调函数的参数。
<?php @call_user_fuc(assert,$_GET['cmd'])?>
?cmd=phpinfo();
这样以来它就会执行phpinfo()函数了
5.array_map()函数
array_map(myfunction,array1,array2,array3...),函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。我们用一个例子来说明:
1.<?php function myfunction($v) { if ($v==="Dog") { return "Fido"; } return $v; } $a=array("Horse","Dog","Cat"); print_r(array_map("myfunction",$a)); ?>这样运行出来结果为:Array( [0] => Horse [1] => Fido [2] => Cat)
2.<?php
//?func=system&cmd=whoami
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
//print_r($new_array);?>
命令执行函数
1.system()函数
system()函数可以用来执行一个外部应用程序并将相应执行结果输出
2.exec()函数
execl()函数可以用来执行一个外部应用程序
3.passthru()函数
passthru()函数可以用来执行一个UNIX系统命令并显示原始的输出
4.Shell_exec()函数
执行shell命令并返回输出的字符串
命令执行管道符介绍:
windows下:
& 前面的语句执行为假则执行后面的
&& 前面的语句为假则直接出错,后面的不执行
| 直接执行后面的语句
|| 前面的语句出错则执行后面的语句
linux下:
&、&&、|、||在linux下的使用方法与windows下的用法是一样的,还有;管道符,作用和&一样
BYPASS
空格过滤
1.${IFS}
2.$IFS$9
3.<或者<>重定向
4.%09(需要php环境)
黑名单绕过
比如过滤了flag或者cat
1.变量拼接
2.单引号、双引号绕过
3.编码绕过
4.读文件绕过(当cat被过滤掉)
1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
5.反斜线
6.$1、$2和$@
通配符绕过
?代表一个字符,*代表一串字符
内敛执行绕过
`命令`和$(命令)都是执行命令的方式
编码绕过
使用base64编码进行绕过
绕过长度限制
命令换行
漏洞危害:
反弹shell
控制整个网站
继承整个web服务器程序的权限执行系统命令、读写文件
此漏洞有着巨大的危害,建议进入命令执行的函数或者方法之前,对参数进行过滤; 参数的值尽量用引号包裹(单引号变量不解析),并在拼接前调用addslashes进行转义。
以上建议仅是个人观点,大家都可以提出自己的合理解决方案。