题目

考点
本关是文件上传漏洞的入门关:服务端对上传的文件没有任何校验,直接允许上传.php文件。思路:上传一个webshell——内容为php代码、能读服务器文件的脚本,访问它就能在服务器上执行代码。
开始打靶
首先我们利用题目提供的账号凭据登录账号

我们发现这里账户有一个可以上传头像的功能,我们首先尝试上传一张正常的图片去访问

右键上传的图片检查可以在源代码中看到图片上传的路径

我们现在构造php代码,尝试上传后去读取/home/carlos/secret文件的内容
<?php echo file_get_contents("/home/carlos/secret");?>

这是一个最简单的webshell:file_get_contents()负责读取服务器上指定文件的完整内容,echo把它输出到页面。因为文件后缀是.php,服务器会把它当PHP脚本执行,所以访问这个文件等于在服务器上运行了这段代码,这就是”远程代码执行”。
将获取到的内容提交

修复措施
这种”什么都不校验”是最原始的上传漏洞,修复要点:
- 扩展名白名单:只允许业务需要的类型(如.jpg/.png),白名单之外一律拒绝,不要用黑名单。
- 校验文件真实内容:用
getimagesize()或finfo_file()读文件头判断是不是真图片,不能只信后缀。 - 服务端重命名:不要用用户提供的文件名,由服务端生成随机文件名(如uuid.jpg),
.php想落盘都落不了。 - 存储目录不可执行:图片目录放在没有脚本执行权限的位置,或者单独用对象存储/CDN托管,就算传上去也解析不了。