Upload-labs 文件上传靶场
环境部署
upload-labs是一个使用PHP编写的开源靶场,专门用于学习和测试文件上传漏洞,特别是在渗透测试和CTF(Capture The Flag)竞赛中常见的场景。
c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场
更方便的windows集成环境:
Releases · c0ny1/upload-labs
按照步骤利用phpstudy搭建好环境后 访问127.0.0.1即可
Pass01
先直接上传一个php后门文件 看看什么情况
限制了上传的文件后缀
那么我们通过抓包看看
注意: 抓包无法抓到127.0.0.1 我使用的是google的一个插件Zero Omega来解决这个问题
要改成你所用的内网IP访问该网站 但是BP设置仍然抓取127.0.0.1
在选择文件和校验的时候都没有数据包 说明是前端JS验证
刷新页面 抓取页面 也能发现相应的JS代码
采用了白名单过滤 只允许.jpg .png .gif文件上传
绕过:禁用JS绕过前端验证
绕过原理:
上传文件没有数据流量交互,表明是在线页面的程序,即仅包含前端验证程序。通过禁用JS,也把就前端JS验证程序禁用了
便可以畅通无阻的上传我们的后门木马
<?php@eval($_POST['pass']);
?>
这个图片的URL即保存的地方
直接用蚁剑连接
Pass02
第二关采用了后端认证
绕过:修改Content-type绕过后端CT验证
绕过原理:
对于上传的文件类型,只通过Content-type判断。然而该参数可以被抓包伪造绕过
抓包看看
将content-type改为image-jpeg
发现上传成功了
原来后端只验证了content-type
也是成功蚁剑连接
Pass03
这次使用了黑名单后端过滤
并且还会对上传的文件重命名
绕过:
多个php可执行后缀绕过黑名单
绕过原理:
我们发现只过滤了php
但是别忘了我们还有许多php可执行后缀
如
.php3
.php4
.php5
.php7
.phps
.php-s
.pht
.phar
.phtml
上传php5后缀成功
直接蚁剑连接
Pass04
黑盒测试多种方法 没有绕过
查看源码
".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"
这么多后缀都加入了黑名单
然而我们发现一个重要的.htaccess后缀没有过滤
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
通过上传.htaccess改变文件扩展名绕过
绕过原理:
通过修改后缀执行逻辑,使png等文件按照php程序来执行
payload1
<FilesMatch "\.png">SetHandler application/x-httpd-php</FilesMatch>
payload2
AddType application/x-httpd-php .png
注意
.htaccess文件不能起名字
这些payload都会将png文件按照php文件解析
但是本题payload2无法使用
选择payload1 先上传该htaccess文件 然后上传一个以.png为后缀的php木马
使用蚁剑成功连接
Pass05
这关把htaccess也禁用了
查看源代码 发现
没有大小写过滤的函数 xxx.PhP随便绕
绕过原理:
只过滤了php 没有过滤大小写函数,导致绕过如Php,pHP,PhP,pHp等等
Pass06
这关添加了大小写过滤
然而捡了芝麻 丢了西瓜
去空格的函数trim不见了
缺少首位去空的trim函数 通过空格绕过黑名单
绕过原理:
上传的后缀为 .php
能够绕过黑名单
蚁剑成功连接
Pass07
缺少去除末尾点的deldot函数 通过点绕过黑名单
绕过原理:
在Windows系统上 .php. 会被识别为.php 实现黑名单绕过
访问的是空白 不过没关系 windows解析会自动识别为php文件
蚁剑成功连接
Pass08
查看代码
没有对::DATA进行过滤 使用::DATA绕过黑名单
绕过原理:
Windows系统在解析后缀名称的时候,会把::$DATA之后的数据当成文件流处理,而不会检测后缀名
如修改为xxx.php::$data文件 解析后变成xxx.php成功绕过黑名单
访问的时候去掉::$data
成功连接
Pass09
查看源代码
未循环验证导致的绕过
绕过原理
这次从首位去空,末尾去点,去除::$data函数都有了,
但是我们发现它没有循环验证,去除首位空格,删除末尾的点,去除::$DATA,都只验证了一次。
并且在Windows系统上.php. 会被识别为.php 这实现了黑名单绕过
所以我们的绕过思路就很简单,抓包把后缀名设置为
.php. .
(注意中间有一个空格)
首先去除末尾的一个点,这时变成
.php.
又去除末尾的一个空格,得到最终的
.php.
成功连接蚁剑
Pass10
查看源码
str_ireplace函数将所有匹配黑名单中的值的后缀全部用替换为空,这导致我们前面那些绕过都无效了,因为php的后缀没有了
双写php绕过 黑名单替换
绕过原理:
虽然php会被直接替换为空,但是仅仅过滤一次 未经过循环验证,通过双写pphphp,实现绕过
函数发现第一个php将其替换为空,剩下的p和后面的hp拼接成php实现绕过
Pass11
当我们上传文件时候发现
GET参数 任意路径保存+%00截断绕过
这个一个GET请求 我们发现URL多了一个保存路径
这意味着我们可以任意修改保存路径,同理保存文件名称文件后缀也能自己决定
准备一个图片马 即在正常图片文件中嵌入php后门
php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00
对于GET请求 URL会自动解码 通过使用%00截断后面的代码
然后访问1.php文件
蚁剑连接
Pass12
POST参数 任意路径保存+%00解码截断绕过
绕过原理同Pass11
这次URL里面没有显示 变成了post请求 与上题目的区别是保存路径参数 从get变成了post的
抓包能发现该保存路径
路径改为888.php%00
注意:post请求不会自动解码 因此我们手动解码一下%00 变成空格
随后访问888.php 蚁剑成功连接
Pass13
图片马+文件包含漏洞绕过
图片马即包含php后门文件的图片文件
文件包含漏洞意味着我们能使用文件包含函数,该函数可以直接解析文件里面的代码,当发现<?php?>时 会使用php解析器执行里面的代码
蚁剑连接成功
同理jpg gif都成功
Pass14
第十四关加了判断文件头字符串,来判断是否符合图片的要求
因此对于图片马 我们最好是
用图片来插入后门绕过
而不是直接将php文件改成图片后缀
同Pass13绕过
Pass15
15关同样验证图片的真实性
exif_imagetype() 读取一个图像的第一个字节并检查其签名。
本函数可用来避免调用其它 exif 函数用到了不支持的文件类型上或和 $_SERVER['HTTP_ACCEPT'] 结合使用来检查浏览器是否可以显示某个指定的图像。
真实图片插入后门绕过
Pass16
16关相较于前两关 加入了更加严格的检测 加入了二次渲染
相关函数为imagecreatefromjpeg()
二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败
我们上次之前的payload成功 但是发现蚁剑无法连接 下载下来发现php后门不见了
后门插入未变化部分绕过二次渲染
对比两份文件 找出没有变化的部分
把后门插入在没有变化的地方
但是注意不要破坏前面的文件特征字符串
不然就会变成这样
因此必须借助工具来帮我们插入
使用010Editor 的比较功能
选取匹配的结果
插入代码
尝试多次 未绕过。。
Pass17
审计代码
条件竞争绕过
绕过原理:
我们发现先执行1区块 这里面文件被上传了
然后执行2区块 开始过滤文件
利用条件竞争 我们能在上传的一瞬间访问该文件
抓取上传phpinfo后门的包 发送至intruder 设置无限发包
设置好资源池
点击开始攻击后
你要做的就是不断的刷新
直道出现目标
Pass18
代码审计后
发现这关同样需要条件竞争 但是无法直接上传php文件了
必须要利用到图片马 还要文件包含解析功能
条件竞争+图片马+文件包含绕过
intruder无限发包上传图片马
不停访问图片马
Pass19
抓包我们可以看到
由于是$_POST接收 利用%00截断绕过
注意由于post请求不会自动解码 这里进行了解码
解码完不会显示出来 实际存在
成功上传
利用move_uploaded_file()特性绕过
move_uploaded_file()有这么一个特性,会忽略掉文件末尾的 /.
访问成功
蚁剑连接成功
Pass20
本关利用数组绕过
检测的是jpg
蚁剑成功连接