命令注入漏洞 远程命令/代码执行
远程命令执行
漏洞原理
如果目标站点在设计时期过滤功能不严格或数据与代码区分不明显,极易导致命令执行漏洞的存在。
总结下来,原理就是:1. 用户输入未过滤或净化的参数。2. 输入被拼接到系统命令中执行。
常见系统命令执行函数
system() 执行命令输出结果
exec() 执行命令,并返回结果的最后一行
shell_exec() 执行命令,并返回所有结果
passthru() 执行命令输出结果
``(反引号) 功能和shell_exec() 相同,如果shell_exec() 被禁用,则反引号也无法使用,但如果只是被过滤,则可以用反引号代替shell_exec()
$a = popen(要执行的命令,参数) 参数可以是’r’和’w’,为r时返回值为包含执行结果的文件指针
使用fread($a,1024)可以输出返回值
常见系统命令
管道符号
Linux常用管道符
;
前面的执行完执行后面的,排队|
前面命令的打印结果作为后面命令的输入||
当前面的执行出错时,执行后面的&
相当于or,前面无论真假都会执行后面的&&
相当于and,前假后不执行,前真后执行
Windows常用管道符
“|”、“||”、“&”、“&&”和Linux同理
windows 常见命令
netstat -ano 查看端口
tasklist 查看进程
ipconfig 查看ip
kill 杀死进程的
arp -a 探测路由表
whoami 查看当前权限
shutdown 关机 (关闭杀软服务,然后重启主机)
systeminfo 查看系统状态
net user 查看用户
net user a abc123 /add 添加用户
远程代码执行
漏洞原理
以Web木马中的一句话木马为例,在常见的PHP小马 <?php @eval($_POST['x']);?>
中,就以 eval 的方式将 POST 传过来的参数,以PHP的方式加以执行。其中 X 参数由外部传入,也就是成为攻击者可以控制的参数,从而形成远程命令执行的漏洞。
eval() 执行命令
assert() 执行命令并判断结果是否有效
eval()与assert()函数的区别:
eval()与assert()函数在执行效果上基本相同,均可动态执行代码,且接收的参数为字符串。 assert()函数虽然也会执行参数内的代码,但主要用来判断一个表达式是否成立,并返回 True 或 false 。实战中,eval()函数通常会被系统禁用,因此在一句话木马中通常利用 assert() 来实现 代码执行。
eval 参数必须是合法的PHP代码,必须以分号结尾,否则会报错。
而 assert() 函数则不存在此问题,也就是他针对PHP语法规范要求并不明 显。