服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

PHP代码审计-某cms逻辑漏洞导致getshell

日期: 来源:黑白之道收集编辑:N1eC

前言 如果存在exec进行拼接的漏洞,该如何绕过 <mark>一黑俩匹配 </mark>?当前如果是拼接和编码这种手法就不说了,现在在看的师傅您是审计大牛的话,这文章可以忽略不看。黑名单...

前言

如果存在exec进行拼接的漏洞,该如何绕过 <mark>一黑俩匹配 </mark>?
当前如果是拼接和编码这种手法就不说了,现在在看的师傅您是审计大牛的话,这文章可以忽略不看。

黑名单

$_GET[
$_POST[
$_REQUEST[
$_COOKIE[
$_SESSION[
file_put_contents
file_get_contents
fwrite
phpinfo
base64
`
shell_exec
eval
assert
system
exec
passthru
pcntl_exec
popen
proc_open
print_r
print
urldecode
chr
include
request
__FILE__
__DIR__
copy
call_user_
preg_replace
array_map
array_reverse
array_filter
getallheaders
get_headers
decode_string
htmlspecialchars
session_id
strrev
substr
php.info

第一个匹配:

/([\w]+)([\x00-\x1F\x7F\/\*\<\>\%\w\s\\\\]+)?\(/i

第二个匹配:

这里不能有$符号,这里是重点 ,当然如果你想编码也可以,或者啥的手法都行,不过我在此之前没想到过,可以继续往下看

/\{pboot:if\(([^}^\$]+)\)\}([\s\S]*?)\{\/pboot:if\}/

正文

先看效果

审计流程

通过审计工具半自动筛选出漏洞点。

跟进该漏洞点文件:apps/home/controller/ParserController.php

最终是通过了$matches[1][$i]进入到eval函数中。

第一个黑名单

接着往上看,这里有黑名单,如果$matches[1][$i]有黑名单就会跳出解析

<mark>这里的\\是社区编辑器默认加上防止转义,太多就懒得改了</mark>


// 过滤特殊字符串

if (preg\_match('/(\\(\[\\w\\s\\.\]+\\))|(\\$\_GET\\\[)|(\\$\_POST\\\[)|(\\$\_REQUEST\\\[)|(\\$\_COOKIE\\\[)|(\\$\_SESSION\\\[)|(file\_put\_contents)|(file\_get\_contents)|(fwrite)|(phpinfo)|(base64)|(\`)|(shell\_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(pcntl\_exec)|(popen)|(proc\_open)|(print\_r)|(print)|(urldecode)|(chr)|(include)|(request)|(\_\_FILE\_\_)|(\_\_DIR\_\_)|(copy)|(call\_user\_)|(preg\_replace)|(array\_map)|(array\_reverse)|(array\_filter)|(getallheaders)|(get\_headers)|(decode\_string)|(htmlspecialchars)|(session\_id)|(strrev)|(substr)|(php.info)/i', $matches\[1\]\[$i\])) {

$danger = true;

}

// 如果有危险函数,则不解析该IF

if ($danger) {

continue;

}

黑名单分别是拦截以下内容:


$\_GET\[

$\_POST\[

$\_REQUEST\[

$\_COOKIE\[

$\_SESSION\[

file\_put\_contents

file\_get\_contents

fwrite

phpinfo

base64

\`

shell\_exec

eval

assert

system

exec

passthru

pcntl\_exec

popen

proc\_open

print\_r

print

urldecode

chr

include

request

\_\_FILE\_\_

\_\_DIR\_\_

copy

call\_user\_

preg\_replace

array\_map

array\_reverse

array\_filter

getallheaders

get\_headers

decode\_string

htmlspecialchars

session\_id

strrev

substr

php.info

这可以看出过滤了好多函数,当然既然是黑名单就有绕过的方式,这里可以是加密形式绕过,不过加密后的密文做成payload就逆向解密不了了,因为是由特殊不可见数据流存在就会导致反解密会不到原来的明文。

这里可以用file和fputs函数绕过

第一个过滤

继续往上看,看到这个if判断,这里也是将$matches[1][$i]进行过滤,保证用户输入的字符串是无危害的,简单来说就是‘括号前面不能有字母、数字字符串’。


// 带有函数的条件语句进行安全校验

if (preg\_match\_all('/(\[\\w\]+)(\[\\x00-\\x1F\\x7F\\/\\\*\\<\\>\\%\\w\\s\\\\\\\\\]+)?\\(/i', $matches\[1\]\[$i\], $matches2)) {

foreach ($matches2\[1\] as $value) {

if (function\_exists(trim($value)) && ! in\_array($value, $white\_fun)) {

$danger = true;

break;

}

}

foreach ($matches2\[2\] as $value) {

if (function\_exists(trim($value)) && ! in\_array($value, $white\_fun)) {

$danger = true;

break;

}

}

}

当然这里也是黑名单,直接/*--*/绕过

4.3. 第三个过滤

这个就比较好过了就是指定的标签语法,使用这个{pboot:if(312313)}(13123){/pboot:if}

4.3.1. 注意:

这里不能有$符号,这里是重点


$pattern = '/\\{pboot:if\\((\[^}^\\$\]+)\\)\\}(\[\\s\\S\]\*?)\\{\\/pboot:if\\}/';

if (preg\_match\_all($pattern, $content, $matches)) {

}

构建payload

由于这里不能用美元符号”$“,前面第一个过滤说过,可用file函数绕过,如下图:

通过上面file函数获取的美元符号,并且通过fputs进行写文件,当然需要绝对路径才能读取美元符,这里就比较简单了,直接让cms报错就好了。

调用链


ParserController.php:84, app\\home\\controller\\ParserController->parserAfter()

TagController.php:47, app\\home\\controller\\TagController->index()

IndexController.php:50, app\\home\\controller\\IndexController->\_empty()

2:2, core\\basic\\Kernel::axqjlxzuuxaapu328937ae1368b88e8bf79cb6b342866a()

2:2, core\\basic\\Kernel::run()

start.php:17, require()

index.php:23, {main}()

访问首页就会进入到apps/home/controller/IndexController.php的_empty()方法,需要get的参数带有tag就可进入该判断

跟进到apps/home/controller/TagController.php的inde()方法,跟进第47行并跟进到apps/home/controller/ParserController.phpparserAfter()方法,最后就会到84行的漏洞方法中。

目前新版本未发现有该处函数

文章首发在:奇安信攻防社区

https://forum.butian.net/share/2142


黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文


END

多一个点在看多一条小鱼干

相关阅读

  • “干净”的代码,贼差的性能

  • 作者 | Casey Muratori
    译者| 核子可乐
    策划| 褚杏娟
    如今很多机构里传授的所谓编程“最佳实践”,压根就是随时可能爆炸的性能灾难。 很多程序员还是一个“小萌新”时
  • 如果你进步慢,强烈建议看下这篇文章!

  • 前段时间,我和一个同学聊天 ——我之前有一次很焦虑的时候,突然看到一句话 ——焦虑的本质是,同时做很多事情,又想要很快看到结果。于是,我对照了一下,发现自己就属于这种情况。所
  • 医者仁心 诠释新时代“雷锋精神”

  • 邹利平问诊后,帮病人配药。罗展 摄◎星沙时报记者 罗展“您肝火比较旺,平时要少喝酒,晚上不要熬夜……”3月1日,在位于长沙县高桥镇维汉村的邹利平中医诊所,医生邹利平正在叮嘱就
  • 7天瘦9斤?!狠还是虞书欣狠…...

  • 姐妹们晚上好呀,我是阿花~有道是:每逢过年胖三斤,但总有人,偏不随波逐流!没错,说的就是美女子虞书欣!过完年居然瘦到上了热搜
  • 【ES6 教程】第五章 JavaScript 箭头函数简介

  • 英文 | https://www.javascripttutorial.net翻译 | 杨小爱在今天的教程中,我们将一起来学习如何使用 JavaScript 箭头函数为函数表达式编写更简洁的代码。JavaScript 箭头函
  • 关于自律,15种常见的思维误区

  • 人们常说「自律给人自由」,但空有口号远远不够,我们还需要了解大脑的运作方式,用科学的方法论指导我们的行为。推荐给大家一篇Marshall Goldsmith博士的文章,希望能给同学们一些
  • 一文看懂 Linux 性能分析|perf 源码实现

  • 我们在《一文看懂Linux性能分析|perf 原理》一文中介绍过,perf 是基于采样来对程序进行分析的。采样的步骤如下:通过设置一个定时器,定时器的触发时间可以由用户设定。定时器被

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 一键shiro反序列化漏洞利用工具

  • 项目地址https://github.com/j1anFen/shiro_attack免责声明该项目仅供合法的渗透测试以及爱好者参考学习,请各位遵守《中华人民共和国网络安全法》以及相应地方的法律,禁止使
  • PHP代码审计-某cms逻辑漏洞导致getshell

  • 前言 如果存在exec进行拼接的漏洞,该如何绕过 <mark>一黑俩匹配 </mark>?当前如果是拼接和编码这种手法就不说了,现在在看的师傅您是审计大牛的话,这文章可以忽略不看。黑名单..
  • 福贡首次发现国家一级保护植物彩云兜兰

  •   彩云兜兰,你见过吗?这是国家一级濒危重点保护植物。近日,被高黎贡山国家级自然保护区福贡管护分局发现了!这是福贡地区首次发现,也是中国目前唯一记载的野生居群。  为了调
  • 网络安全,WiFi密码爆破教程建议收藏吃灰

  • 来自公众号:入门小站本文仅供技术学习。前言暴力破解攻击是指攻击者通过系统地组合所有可能性(例如登录时用到的账户名、密码),尝试所有的可能性破解用户的账户名、密码等敏感信