PHP 文件上传漏洞

54

文件上传漏洞是因为给用户提供了上传文件的功能, 但是并没有经过足够的验证, 导致恶意代码可以被上传

两道题:

  1. [ACTF2020 新生赛]Upload
  2. [极客大挑战 2019]Upload

在这里可以找到: https://buuoj.cn/challenges

[ACTF2020 新生赛]Upload

进入主页可以看到上传文件的控件:

2024-06-20-22.22.35

可以直接上传 php 试试

2024-06-20 22.24.15

弹了一个 alert 框, 这是是在前端做了验证

直接 f12 进到源代码选项卡下, 发现是在 main.js 中做的验证, 那么先把这个验证删除再尝试上传 php 文件:

2024-06-20 22.28.29

发现还是不行, 在后端还有验证, 可以尝试其他后缀

先尝试一下 phtml, 发现成功上传了:

2024-06-20 22.32.46

直接访问试试:

2024-06-20 22.33.38

成功. 接下来 webshell 拿到 flag 即可

通过查看源码发现, 这里的代码是过滤掉了 php 后缀的文件, 考的就是 phtml 了

[极客大挑战 2019]Upload

这道题跟上一题非常类似, 就是多了些验证条件, 实在后端进行验证的

2024-06-20 21.38.15

我们可以上传一个 png 看看

在 Burp Suite 中进行测试:

2024-06-20 21.43.29

可以看到成功上传了

这里可以尝试把 png 的内容改成 php 代码:

2024-06-20 21.56.18

发现不行, 不允许文件内容中出现 <?, 可以想到的验证应该有: 后缀验证, Content-Type 验证, 内容中的 <?

那么自然就是尝试 phtml了:

2024-06-20 21.53.57

发现这个后缀是可以的, 内容也通过, 但他说这不是一个图片, 这里就要想到他是怎么判断是否是图片的了, 我猜测是通过文件头来判断. 做到这里我去网上搜了一下关键词: "png php 文件头检查绕过", 发现可以利用 getimagesize() 的一个漏洞, 如果文件头是 GIF89a, 就会直接通过检查

尝试上传:

payload:

<script language='php'>phpinfo();</script>

2024-06-20 22.12.45

上传成功

接下来就是访问这个文件. 一般路径应该是 upload, 尝试 /upload 路由

2024-06-20 22.14.25

访问出来了, 访问我们上传的那个文件即可:

2024-06-20 22.15.06

接下来 webshell 拿到 flag 就可以了