要分清命令执行,和 代码执行的区别
什么是命令执行?
我们可以去执行 cmd ,bash 命令,基于一些函数参数的漏洞
挖掘思路
和代码执行一样,首先
1.用户能偶控制函数输入
2.存在可执行代码的危险函数
命令执行 和 代码执行 的区别
代码执行:
执行的效果完全受限于语言本身 ,比如 我是php代码,我就只能用php来执行
命令执行:
执行的效果不受限于语言语法本身,不受命令本身限制
命令执行的类型
代码层过滤不严
system();
系统的漏洞造成命令注入
bash的漏洞
第三方组件存在代码执行漏洞
常见函数
system()函数
exec()
shell_exec()
`` 这个不属于函数,他基于shell_exec()函数的调用
passthru()函数
system函数
要看懂php手册
也可以添加用户,net user admin 123 /add 删除: net user admin /del
net user 查看用户
写入文件
cmd = echo 1121 > 1.txt
写到了,网站根目录下 还是这个网页的 目录下呢???
,那我们可以写入一句话木马?
passthru 函数
Exec函数
没有回显结果,需要放到第二个参数里输出 或者echo
它可以去进行命令执行,但他回显的页面,只有一行
也可以写入文件, 功能都能实现,
shell_exec函数
shell_exec(string $cmd) $cmd 要执行的命令
反引号`` 则调用此函数
没有回显
我们进行输出一下,
有回显了,跟正常一样
netstat -ano 查看进程
dir > 4.txt ,dir命令结果 输出到 4.txt
反引号(``)
`` 就是调用了shell_exec()函数
出来了!
过滤函数,防止命令注入
Escapeshellcmd() 过滤整条命令
Escapeshellarg() 过滤整个参数
替换成了空格,
修复方案
尽量少用执行命令的函数或者直接禁用参数值尽量使用引号包括
在使用动态函数之前,确保使用的函数是指定的函数之一
在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
尽量少用执行命令的函数
对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下使用escapeshellarg函数进行过滤
参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义
而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置