命令执行漏洞
1.产生原因
命令执行漏洞产生原因:应用未对用户输入做严格的检查过滤,导致用户输入的参数被当成命令来执行。攻击者可以任意执行系统命令,属于高危漏洞之一,也属于代码执行的范畴。
RCE:远程命令和代码执行。
2.漏洞危害
①继承web服务程序的权限去执行系统命令或读写文件。
②反弹shell,获得目标服务器的权限。
③进一步内网渗透。
3.远程命令执行
在PHP中,有时需要调用一些执行命令的函数.如:eval()、assert()、preg_replace()、create_function()
等,如果存在一个使用这些函数且未对可被用户控制的参数进行检查过滤的页面,那么这个页面就可能存在远程命令执行漏洞。
php相关:
eval()
和assert()
函数:
eval()
和assert()
函数都可以执行参数内的代码,且接受的参数为字符串。
例子:
<?php @eval($_POST[‘cmd’]);?>
<?php @assert($_POST[‘cmd’])?>
注意:eval()函数传入的参数必须为php代码,即要以分号结尾;
assert()函数是直接将传入的参数当成php代码执行,不需要以分号结尾。
preg_replace()
函数:
preg_replace
(‘正则规则’。‘替换字符’,‘目标字符’)
例子:
<?php preg_replace(“/test/e”,$_POST[“cmd”],”just test”);?>
原理:PCRE修饰符e:preg_replace()
在进行了对替换字符串的后向引用替换之后,把替换后的字符串作为php代码执行(eval函数方式),并使用执行结果作为实际参与替换的字符串。
array_map()
函数:
将用户自定义函数作用到数组中的每一个值上,并返回用户定义函数作用后的带有新值的数组。
例子:
<?php
$func=$_GET[‘func’]; //GET方式传参
$cmd=$_POST[‘cmd’]; //POST方式传参
$array[0]=$cmd;
$new_array=array_map($func,$array);
Echo $new_array;
?>
类似函数:
create_function()
call_user_func()
all_user_func_array()
array_filter()
uasort()
GET和POST传参的区别:
1.post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。
2.post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节.
3.post顾名思义,就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post的信息作为http请求的内容,而Get是在Http头部传输的。
get和post的区别
1、get方式传递的参数可以在页面上看见,安全性不高,反之post安全性高
2、get方式传递的速度快。
4.系统命令执行
利用PHP的系统命令执行函数来调用系统命令并执行.这类函数有system()、exec()、shell _exec()、passthru()、penti_exec()、popen()、proc_open()
等,此外还有反引号命令执行,这种方式实际上是调用shell_ exec()
函数来执行。
eval():
将输入的字符串参数当做PHP程序代码来执行
system():
执行外部程序.并且显示输出; 成功则返回命令输出的最后一行,失败则返回 FALSE;
exec():
执行一个外部程序,不会主动返回执行结果,且只是返回结果的最后一行。
shell_exec() :
通过shell 环境执行命令,并且将完整的输出以字符串的方式返回。当进程执行过程中发生错误,或者进程不产生输出的情况下,都会返回 NULL。
passthru():
执行unix系统命令(外部程序)并且显示原始输出;用来执行外部命令,但直接将结果输出到浏览器(未经任何处理的 原始输出),没有返回值;
pcntl_exec() :
在当前进程空间执行指定程序
popen():
打开进程文件指针
proc_open():
执行一个命令,并且打开用来输入/输出的文件指针
`(反单引号)
命令执行常用特殊字符
cmd1|cmd2 :管道符,无论cmd1是否执行成功,cmd2将被执行(最终只显示cmd2)
cmd1||cmd2 :仅在cmd1执行失败时才执行cmd2,否则只执行前面的
cmd1&cmd2 :先执行cmd1和cmd2,无论cmd1是否执行成功
cmd1&&cmd2 :仅在cmd1执行成功后时才执行cmd2
cmd1;cmd2 :无论cmd1是否执行成功,cmd2将被执行。
参考《Web安全深度剖析》一书命令执行漏洞相关内容。
5.常见命令
Net ViewI–作用:显示域列表、计算机列表或指定计算机的共享资源列表。
Net User–作用:添加或更改用户帐号或显示用户帐号信息。
Net Use–作用:连接计算机或断开计算机与共享资源的连接,或显示计算机的连接信息。
Net Time–作用:使计算机的时钟与另一台计算机或域的时间同步。
Net Config–作用:显示当前运行的可配置服务,或显示并更改某项服务的设置。
常见系统命令与功能
windows
Ping:测试网络连通性
Ipconfig:显示计算机中网络适配器的ip地址,子网掩码及默认网关
Netstat:查看网络开放端口及连接状态
Net user:查看、增加、删除当前系统账号
Net localgroup:查看、增加、删除当前系统用户组
Dir:查看当前目录下的文件和子目录信息
Systeminfo:查看当前计算机的综合信息
Tasklist:显示当前运行的进程信息(可查看pid),即计算机有哪些软件正在进行
linux
Ifconfig:查看当前ip、mac等信息
Netstat:查看网络开放端口及连接状态
Whoami:查看当前用户
Cat/etc/password:查看所有用户信息
Ls:查看当前目录下的文件和子目录信息
Useradd:添加账户
Userdel:删除账户