1.命令执行漏洞
1.1漏洞原理
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数的参数,并且开发人员对这个参数没有严格的过滤时就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
1.2各类语言的命令执行函数
PHP:exec、shell、system、popen等
ASP.NET:System,Diagnostics,Start,Process、System.Diagnostics.Start.ProcessstartInfo等
Java: java,lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
1.3命令拼接符
1.3.1Windows命令拼接符
| 命令管道符
格式:第一条命令 | 第二条命令 [| 第三条命令...]
将第一条命令的结果作为第二条命令的参数来使用
当上一条语句为真,或者说能正常执行时候,才执行第二条命令
当第一条语句错误时候,第二条不执行
& 组合命令
语法:第一条命令 & 第二条命令 [& 第三条命令...]
按顺序执行,无论前一条语句是否为真,后面的都正常执行
&、&&、||为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是
允许的,而且用的非常广泛。因为批处理认行不认命令数目。
这个符号允许在一行中使用 2 个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。
这里&两边的命令是顺序执行的,从前往后执行。
&& 组合命令
语法:第一条命令 && 第二条命令 [&& 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则 一直执行完所有命令
这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行
遇到错误时候立马停止
|| 组合命令
语法:第一条命令 || 第二条命令 [|| 第三条命令...]
用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
提示:组合命令和重定向命令一起使用必须注意优先级管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令
直到执行到正确的命令后才停止
1.3.2Linux命令拼接符
;:无论拼接的命令是否为真或假,都按照顺序执行
&:无论命令为真或假,都执行,但是不按照顺序执行
&&:顺序执行,遇到假则终止执行;都为真则都执行
遇到假的停止执行
|:如果都为真,则都执行,但是只回显最后一个指令的结果
||:如果都为真,则只执行第一个;如果存在假的指令时,按照顺序执行,当遇到真的指令时,终止执行
1.4系统命令函数
1.4.1system()
把字符串作为系统命令执行,自带输出功能。
在靶场的www目录下创建一个php文件测试
向目标服务器写木马,payload如下
?cmd=echo "<?php @eval($ PosT['shell'])?>"> shell.php
结合burp尝试
如果出现报错,更改请求方式为post
1.4.2passthru()
将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。
1.4.3exec()
exec() 此函数会将字符串当作系统命令执行,不输出结果,执行后返回最后一行,如果想看执行结果需要使用 echo、var_dump 等函数进行输出。
<?php
exec("ping 127.0.0.1");
?>
<?php
echo exec("ping 127.0.0.1");
?>
只显示了最后一行
1.4.4pcntl_exec()
在当前进程空间执行指定程序。
要求:linux系统特有模块,需编译选项中存在 enable-pcntl。
1.4.5shell_exec()
通过 shell 执行命令并将完整的输出以字符串的方式返回。
1.4.6反引号
反引号(`)实际上是使用 shell_exec() 函数。
1.5绕过
- 重定向符,文件读取时,可用cat<>flag.php,单独使用<似乎也可以
- $IFS
- {}
- 空变量绕过
- 系统变量绕过
- 反斜杠绕过
- 通配符绕过
1.6危害
执行系统命令
写入一句话木马
反弹she11
1.7防御
防御方法是在php.ini中禁用这些函数disable_functions=system,exec,尽量不要使用外部命令
使用自定义函数或外部函数库代替外部函数的功能
使用escapeshellarg函数来处理命令参数
2.代码执行漏洞
2.1漏洞成因
在web程序中,有时候程序员为了代码的灵活性与简洁性,会适当调用代码执行的函数执行。但由于没有充分考虑到用户是否会使用与控制,最终导致web应用存在代码执行漏洞。
2.2漏洞产生条件
- 调用的第三方组件存在代码执行漏洞,
- 用户输入的内容作为系统命令的参数拼接到命令中;
- 对用户的输入过滤不严格;
- 可控变量或漏洞函数
2.3漏洞挖掘
像命令执行和代码执行漏洞,通常需要看网站的情况,若网站只是单单的一个页面那么基本上就不可能存在该漏洞,若网站可能存在一些输入ip、调用接口等那么可能存在,但是通常该漏洞多数需要配合代码审计或者拿到源码,否则很难挖掘到。
2.4各类语言的代码执行函数
PHP:eval、assert、preg replace()、+/e模式(PHP版本\<5.5.0)
Javascript:eval
Vbscript:Execute、Eval
Python:exec
2.5代码执行函数
2.5.1eval()
2.5.2assert函数
assert函数是直接将参数传入字符串当成PHP代码执行,不需要以分号结尾(特别注意),有时加上分号不会显示结果。
传参
2.5.3.preg_replace
执行一个正则表达式的搜索和替换。将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
2.5.4create function
创建匿名函数,并返回匿名函数名,创建匿名函数并执行php代码。
2.5.5call user func函数
该函数主要用于通过函数名去调用该函数。
2.6代码执行漏洞利用
读取文件
?txt=var_dump(file_get contents('c:\lwindows\system32\drivers\etc\hosts'));
写webshell
?txt=file put contents('123.php','<?php eval($ REQuEsT[shell]);?>');
2.7危害
暴露服务器信息网站挂马暴露敏感文件
由代码执行漏洞升级为命令执行漏洞
2.8防御
使用addslashes函数将参数转义或使用黑白名单校验禁止或减少使用代码执行函数限制web用户的权限