1、前言
命令注入是什么?
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。
当用户可控点可以使用管道符进行命令拼接,或者参数点的过滤不严格,从而可以被绕过,就有可能会导致Web服务器程序权限被继承,去执行系统命令、读写文件、反弹shell、甚至控制整个服务器等危害
PHP常见命令执行函数:system()、exec()、shell_exec()等
2、常见的命令
拼接符单管道符(|)
将前面一条命令的执行结果,作为后面一条命令的执行参数
双管道符(||)
或命令,执行前面的命令,如果前面的命令执行结果错误,则执行后面的命令并返回输出,如果前面的命令执行正确,则只执行前面的命令
双连字符(&&)
与命令,如果前面的命令执行成功则执行后面的命令,反之不执行
3、案例
在某站点使用账号密码进行登录,然后购买某个服务
填写信息--->商标图样自动生成处存在命令注入
在商家名称处输入单引号,页面报错
刚开始,尝试测试SQL注入,但是发现常见函数均未定义,沉思ing…
仔细看了看报错信息,发现有提示Command failed,和‘curl’命令,并且有一些参数设置,开始思考是否存在命令注入
拼接命令
| cmd命令
得知当前用户权限是root
4、防御技巧
禁用部分敏感函数
严格过滤关键字符(管道命令)
使用自定义函数或函数库来代替外部命令
最小特权原则