说说RCE那些事儿

0x01 引言


如果OWASP给PHP漏洞弄个排行榜,那RCE(远程命令执行)绝对是最臭名昭著漏洞的前十名,其攻击方式灵活,且攻击成功后一般返回继承了web组件(如apache)权限的shell,危害自不必再多描述。那么,今天就来看看代码审计中到底该在哪里寻找命令执行?或者说,哪些功能会导致代码执行?

0x02漏洞寻踪


这是一个最简单的命令执行漏洞

我们可以执行
index.php?cmd=whoami
特别注意如果我们使用了

由于exec() 默认没有回显,所以执行命令之后 我们是看不到结果的, 当然我们能够通过重定向,把他们导入文件中,再来查询

当然这些代码一般情况下是不可能出现在程序中的,我们仅作了解。 那么…… 到底哪里会出现命令执行呢?

Demo #1 实现查询dns的RCE

这是一个实现查询dns命令的php程序片段,由于要和系统产生信息通道,使用了system()函数,过滤不严也导致了RCE。

如果我们请求

dig.php?ns=whoam&host=sirgod.net&query_type=NS&status=digging
明显system ("dig whoami sirgod.com NS"); 是不能执行的

所以我们用“||”分别执行linux命令

dig.php?ns=||whoami||&host=sirgod.net&query_type=NS&status=digging

system ("dig ||whoami|| sirgod.net NS");
那么我们就分离了dig命令和whoami 成功执行

Demo #2 配置信息保存不当的RCE

很多时候php的配置信息是直接保存在.php后缀的文件里面的 比如discuz 如果没有认真过滤…

那么如果正常提交 就是

我们要是提交';system($_GET['cmd']);'

配置文件就会变成

很明显这就是个合法的php文件了,也成为了一个webshell。

Demo #2 缓存写入不当的RCE

这个代码的业务功能就是写入缓存,是下次使用之前直接调用静态文件 如何显示给访客呢

那么我们试试注入shell

访问display.php?cmd=whoami 成功执行

0x03 实例剖析

有人就说了,上面代码是简单的phpdemo而已,实际环境中的审计肯定没有那么简单,那么,当我们面对完整的php程序,他们面对对象,基于各种框架,还怎么去寻找RCE的踪迹呢?

我们来看几个实例

齐博cms缓存写入导致远程代码执行 漏洞文件

这段代码功能很好分析 遍历标签($label)变量,并且写入缓存,

我们看看过滤函数

这里检测key的机制就出问题,,我画了个图

2014110604484020315
简而言之,他只检测最底层的key 所以我们提交label[evilcode][asd]=xx 匹配的key是asd 那么就不会被匹配出 evilcode就不会被检测。

由于qibo是 伪全局

会帮我们注册好提交的变量 所以$label是能够直接控制的

那么也就是当我们提交
label['.phpinfo().'][asd]=sb
提交的key为''.phpinfo().'' 那么写入的本地文件就是
\$label[''.phpinfo().'']=stripslashes();\r\n";
2014110604484193042
这时所有引号全都闭合

缓存文件夹中也就写入了我们的shell

Drupal函数回调导致的RCE

Drupal作为世界上公认最强大的phpweb框架,一直在追求更安全的开发方法 比如,它采用预编译的方法进行SQL交互,使得SQL注入漏洞几乎难以挖掘。然而在近期,由于一个功能中将SQL预编译权利交给了用户。

插入用户输入数据导致sql注入

又由于drupal采用的PDO是支持多行的,所以能执行任意语句,当然这不是今天的重点。 今天我们看看如何漏洞扩大,把SQLI变成RCE 首先讲下call_user_func_array

(PHP 4 >= 4.0.4, PHP 5)
调用回调函数,并把一个数组参数作为回调函数的参数 说明

首先$path作为变量是可控的

包含了文件

通过预编译注入向表中插入一个语句

path 为要执行的代码; include_file 为 PHP filter Module 的路径; page_callback 为 eval; access_callback 为 1(可以让任意用户访问)。 访问地址即可造成 RCE。

2014110604484132478

0x04 写在最后

一般来讲,漏洞形成的原因基本都是“数据与代码未有效分离”,然而RCE是个例外,往往出现rce的地方本来就是供程序执行代码的地方,加上如今php程序功能越来越强大,各种地方相互调用,导致组合利用漏洞。所以程序员写起代码来往往都不知道改怎么去防御,或者说防不胜防。 由于其漏洞实现的灵活性,寻找RCE,还是应该从功能入手,去研究代码实现了什么功能,最后变量进入什么函数,被如何调用,而不是简简单单的去进行关键字搜索,毕竟,如今代码审计已经从“哪里有洞”过渡到“如何绕过”的时代了。