通过webshell上传进行远程代码执行

题目

image-20261013143739900

考点

本关是文件上传漏洞的入门关:服务端对上传的文件没有任何校验,直接允许上传.php文件。思路:上传一个webshell——内容为php代码、能读服务器文件的脚本,访问它就能在服务器上执行代码。

开始打靶

首先我们利用题目提供的账号凭据登录账号

image-20261013144112007

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

image-20261013150844903

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

image-20261013150932829

我们现在构造php代码,尝试上传后去读取/home/carlos/secret文件的内容

<?php echo file_get_contents("/home/carlos/secret");?>

image-20261013151152523

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

将获取到的内容提交

image-20261013151223979

修复措施

这种”什么都不校验”是最原始的上传漏洞,修复要点:

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