远程命令执行

漏洞原理

如果目标站点在设计时期过滤功能不严格数据与代码区分不明显,极易导致命令执行漏洞的存在。

总结下来,原理就是: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()函数的区别:

  1. eval()与assert()函数在执行效果上基本相同,均可动态执行代码,且接收的参数为字符串。 assert()函数虽然也会执行参数内的代码,但主要用来判断一个表达式是否成立,并返回 True 或 false 。实战中,eval()函数通常会被系统禁用,因此在一句话木马中通常利用 assert() 来实现 代码执行。

  2. eval 参数必须是合法的PHP代码,必须以分号结尾,否则会报错。

    而 assert() 函数则不存在此问题,也就是他针对PHP语法规范要求并不明 显。