第一次搞,希望师傅们喷轻点
本文章旨在技术交流。已脱敏处理
可以添加打印模块
上传点
check白名单
读了png
上传双后缀
发现php成功上传
找路径
成功getshell
漏洞点挺多,但是主要是为了学习代码审计,黑盒就随便玩玩
注:这个cms有些垃圾,高版本会报错,用了5.3版本的PHP,xdebug没有适配的,所以不再用debug进行调试
文件结构
可以看到是tp二开的。tp3
直接看Application可以看到
多了Controller.class。虽然能猜出个大概,但是还是老老实实,先看路由
./index.php
引入./ThinkPHP/ThinkPHP.php
在倒数第二行中,我们发现这个文件名的端倪,在加载核心Think类时,进行了拼接
CORE_PATH通过回溯发现为./ThinkPHP/Library/Think
回溯EXT
,开头定义了EXT,const用于声明常量,且不能被更改
后续的路由规则都差不多
所以只是文件名稍微改了一下而已。
(这也是tp3的特点)控制器文件的命名方式是:类名+class.php(类文件后缀)
发现上传
访问
$src由$upload_path拼接$newname而成。
$newname由$xname[0]拼接$xname[1];$xname[0]时随机生成,不可控。而上一行代码可以看到,$xname由.
分隔$file['name'],取第一个元素和第二个元素。直接找到$name
正着读代码:文件名传给了$name;通过strrpos函数获取最后
一个.
的位置。并用substr提取出来,进行check
通过前面的$newname可知,我们将文件名中的.
分割为数组元素,后缀取的是第二个点,但是check是check最后一个点的位置。于是就有了双后缀绕过。
上传文件名123.php.jpg
.jpg被进行check
.php被进行拼接
这个上传点需要配合截断使用,但是是练习,所以进行记录。方便日后的复习
跟进
该方法名为ajax_upload
全局搜索调用情况
不存在调用。但第三个有调用,恰好在模块内,可以直接调用
先不着急往下跟,看看$path是否可控
$xqid可控(var_dump为笔者调试时所写)
就是在获取参数。这也是tp3的做法,用I
直接获取指定参数
因为路径可控,所以我们继续往下看ajax_upload_xq
,位置Admin/common/function.php
对path进行了拼接
做了上传
这是tp3保存文件的方法,跟进看看
获取后缀
白名单
获取文件名
跟进getSaveName
文件名命名规则
所以文件名不可控
在一开始,我们是控制住了Path
现在发挥作用了
最后生成的文件就是路径可控,文件名和后缀没办法控制
通过upload()保存文件后
继续下面
随后利用上传的图片生成新的缩略图,删除并覆盖
特定环境下,我们能截断路径,从而达到上传php
./install/index.php
没有过滤,可直接注入,但是过于鸡肋,因为在install时才能注入
我直接就标出来大伙,一眼就看出来了。但是seay没扫出来
构造出payload
- $rule = preg_replace_callback('/{(\w+)\|(\w+)}/', function($match){return $match[2]($_GET[$match[1]]);}, $rule);
可以看到其用了preg_replace_callback
与replace相似,但是第二个参数是回调函数,
他会将第三个参数中符合第一个参数的正则作为匿名函数的参数传入
例如:
$match作为一个数组,match[0]为完整匹配,而match[1]为子匹配
结合原语句,构造出利用方法
本文作者:硝基苯
本文链接:https://www.c6sec.com/index.php/archives/528/
最后修改时间:2022-02-01 00:20:25
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!