漏洞成因及原理总结
漏洞成因:脚本语言优点是简洁,方便,但也伴随着一些问题,如速度慢,无法解除系统底层,如果我们开发的应用需要一些除去web的特殊功能时,就需要调用一些外部程序。
命令执行漏洞概念:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
命令执行漏洞简介
用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码
命令执行 VS 代码执行
命令执行漏洞:
直接调用操作系统命令
代码执行漏洞:
靠执行脚本代码调用操作系统命令
命令执行 AND 代码执行 原理
命令执行原理:
在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令
代码执行原理:
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popenproc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
利用条件:
1.应用调用执行系统命令的函数
2.将用户输入作为系统命令的参数拼接到了命令行中
3.没有对用户输入进行过滤或过滤不严
命令函数的利用
1. System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:
string system(string command, int&return_var)其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。
2. Exec:exec函数可以用来执行一个外部的应
用程序string exec (string command, array&output,
int &return_var)其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。
3.Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:void passthru (string command, int&return_var)其中,command是要执行的命令,return_var存放执行命令后的状态值。
4. Shell_exec:执行shell命令并返回输出的字符串,函数原型如下:string shell_exec (string command)其中,command是要执行的命令。
5.符号:
command1&command2 两个命令同时执行
command1&&command2 只有前面命令执行成功,后面命令才继续执行
command1;command2 不管前面命令执行成功没有,后面的命令继续执行
command1||command2 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
command1|command2 将command1的输出作为command2的输入,并且只打印Command 2执行的结果.
经验心得
我们通常不会说是去特定挖一个命令执行的漏洞,因为很多情况下我们都是利用一个第三方组件存在的事件型漏洞进行渗透测试之后,才意识到原来这属于命令执行漏洞。因此,在挖掘漏洞漏洞前,我们很有必要弄清楚,我们挖的漏洞究竟属于哪一类。命令执行漏洞通常分为以下三种:
1.代码层过滤不严
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用:system("/bin/program --arg $arg");
2.系统的漏洞造成命令注入bash破壳漏洞(CVE-2014-6271)
3.调用的第三方组件存在代码执行漏洞:如WordPress中用来处理图片的ImageMagick组件JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
4.ThinkPHP命令执行
危害
1.继承Web服务程序的权限去执行系统命令或读 - 写文件
2.反弹shell
3.控制整个网站甚至控制服务器进一步内网渗透
防御
1.尽量少用执行命令的函数或者直接禁用
2.在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
3.参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义
4.对PHP语言来说,不能完全控制的危险函数最好不要使用
5.能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用
6.对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
7.在使用动态函数之前,确保使用的函数是指定的函数之一
8.而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置。