Upload-Labs 学习记录
前言
Upload-Labs项目链接:
https://github.com/c0ny1/upload-labs
本文靶场环境于2021.5月份在Kali Linux下Docker中搭建
本文内容为Pass1-Pass10,后续Pass会另开一篇文章写
搭建过程中出现的问题
1. github所给出的创建容器指令有误
所给出的
docker run -d -p 80:80 upload-labs:latest
应改为
docker run -d -p 80:80 c0ny1/upload-labs:latest
2. 搭建后容器网站根目录下无upload文件夹,需手动创建并加权
3. 搭建后靶场内配置文件需根据实际操作进行更改,如增加对php5,phtml等类型文件的解析,在做部分Pass时还会因为中间件版本问题,导致已上传的文件的后缀还会有过滤所用的字符。
Pass1-Pass10 学习记录:
—Pass1
拦截方法:使用js对不合法图片进行检查
思路:既然用js,那就把js禁用掉,打开浏览器(本人用的Chrome)调试设置(F12),禁用掉JavaScript,进行上传
上传成功
此处上传的info.php,写的内容为(如下),后续相同
<?php
phpinfo()
?>
访问http://ip:port/upload/info.php
可解析,证明成功
—Pass2
拦截方法:检测文件后缀(包中的Content-Type)
思路:上传文件,burpsuite抓包,修改Content-Typen内容
为image/jpeg
抓包
修改
上传成功,可访问解析,效果和Pass1一样,后续关同样不放图了
—Pass3
拦截方法:对后缀名进行黑名单拦截,检测并禁止上传.asp,.aspx,.php,.jsp后缀文件
思路:可以上传php5,phtml
后缀等服务器同样会解析的类型的文件
此处会遇到的问题为:在docker内搭建的uploadlabs环境的apache2服务器配置文件,没有写对php5,phtml等文件进行解析,需要我们手动去到uploadlabs内的apache2.conf
增添语句
方法:
docker ps
显示正在运行的容器信息
docker exec -it 容器id/容器名称 /bin/bash
进入对应的容器文件夹中
移动到/etc/apache2目录下
对apache2.conf文件进行修改,写入
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
重启apache2及容器,即可上传并解析php5,phtml后缀的文件
注:容器内的编辑器vim需自己手动安装(用自带的vi也行)
扩展知识点:apache的配置文件是httpd.conf,因为容器内的是apache2,所以配置文件是apache2.conf
关于 /etc/apache2/下sites-enable 和 sites-available的区别,enable是要用的配置文件,sites-available是所有的配置,包括临时不启用的站点的配置。即available是所有配置,enable是要用的配置的调用,当有需要更改的配置的时候,只用在enable里删除或增加指向链接即可,无需更改available这个大配置文件。enable依靠available,enable负责配置文件调用进行连接,是软连接,available是负责配置文件的存放。
—Pass4
拦截方法:对后缀名进行黑名单拦截,检测并禁止上传,包括php5,phtml等后缀
思路:Pass4可以看作是Pass3的一个加强版,既然无法解析那就想办法上传一个.htaccess
文件,文件内容为
SetHandler application/x-httpd-php
文件名就是
.htaccess
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。我们要在目录里上传一个配置文件,写的文件内容是让它把所有上传的文件全按照php文件进行解析。
我们先上传.htaccess文件,然后再上传我们的php文件,后缀可以是jpg,gif,因为无论后缀是什么都会被解析成php
上传成功,解析成功
—Pass5
拦截方法:对后缀名进行黑名单拦截,检测并禁止上传特殊文件(全面)
思路:Pass5又是一个黑名单加强版,这次连.htaccess也无法上传了,但是有一个简单的方法,大小写,例如把后缀php
改成phP
,就是这么简单
上传成功,解析成功
—Pass6
拦截方法:对后缀名进行黑名单拦截,但是未过滤空格
思路:在文件后缀加上“ ”
(空格)进行绕过
例如“info.php”
,则改成“info.php ”
上传成功,解析因靶场配置,版本问题未解析成功
—Pass7
拦截方法:对后缀名进行黑名单拦截,但是未过滤“.”
思路:在文件后缀加上“.”
进行绕过
例如“info.php”
,则改成“info.php.”
上传成功,解析成功
—Pass8
拦截方法:对后缀名进行黑名单拦截,但是未过滤“::$DATA”
思路:在文件后缀加上“::$DATA”
进行绕过
例如“info.php”
,则改成“info.php::$DATA”
这里利用的原理是 php在window的时候如果文件名加::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名。
上传成功,解析因靶场配置,版本问题未解析成功
—Pass9
拦截方法:先通过deldot函数删除文件名末尾的点后,再对后缀名进行黑名单拦截
思路:在文件后缀加上“. .”(.空格.)进行绕过
例如“info.php”
,则改成“info.php. .”
这里利用的原理是deldot函数是从后往前检测“.”符号,从检测到第一个“.”开始,遇到空格后停止检测的原理,所以最后文件后缀仍会保留一个“.”和一个空格
上传成功,解析成功(本不应该有后面的%20即空格,但因为靶场配置问题所以加上才能访问,正常服务器应该会自动去除空格,访问info.php.即可)
—Pass10
拦截方法:对后缀名进行黑名单拦截,将有问题后缀名替换为空
思路:文件后缀名双写进行绕过
例如“info.php”
,则改成“info.pphphp”
识别中间的php并变成空格后,剩余字符组成完整的php后缀名。
上传成功,解析成功