PHP 文件上传漏洞
文件上传漏洞是因为给用户提供了上传文件的功能, 但是并没有经过足够的验证, 导致恶意代码可以被上传
两道题:
- [ACTF2020 新生赛]Upload
- [极客大挑战 2019]Upload
在这里可以找到: https://buuoj.cn/challenges
[ACTF2020 新生赛]Upload
进入主页可以看到上传文件的控件:
可以直接上传 php 试试
弹了一个 alert 框, 这是是在前端做了验证
直接 f12 进到源代码选项卡下, 发现是在 main.js 中做的验证, 那么先把这个验证删除再尝试上传 php 文件:
发现还是不行, 在后端还有验证, 可以尝试其他后缀
先尝试一下 phtml, 发现成功上传了:
直接访问试试:
成功. 接下来 webshell 拿到 flag 即可
通过查看源码发现, 这里的代码是过滤掉了 php 后缀的文件, 考的就是 phtml 了
[极客大挑战 2019]Upload
这道题跟上一题非常类似, 就是多了些验证条件, 实在后端进行验证的
我们可以上传一个 png 看看
在 Burp Suite 中进行测试:
可以看到成功上传了
这里可以尝试把 png 的内容改成 php 代码:
发现不行, 不允许文件内容中出现 <?
, 可以想到的验证应该有: 后缀验证, Content-Type 验证, 内容中的 <?
那么自然就是尝试 phtml了:
发现这个后缀是可以的, 内容也通过, 但他说这不是一个图片, 这里就要想到他是怎么判断是否是图片的了, 我猜测是通过文件头来判断. 做到这里我去网上搜了一下关键词: "png php 文件头检查绕过", 发现可以利用 getimagesize()
的一个漏洞, 如果文件头是 GIF89a, 就会直接通过检查
尝试上传:
payload:
<script language='php'>phpinfo();</script>
上传成功
接下来就是访问这个文件. 一般路径应该是 upload, 尝试 /upload 路由
访问出来了, 访问我们上传的那个文件即可:
接下来 webshell 拿到 flag 就可以了