upload-labs
pass01 前端js绕过
上传php一句话木马,我们发现这里只能上传jpg,png,gif类型的文件
从代码不难看出这是JavaScript代码,禁用JavaScript,尝试上传
这一关也可以上传jpg后缀的一句话木马,通过前端验证后抓包修改上传的文件名后缀
pass02 content-type绕过
打开源码发现后端对数据包中的Content-Type进行了验证,那我们抓包修改数据包中的此项为可以验证成功的类别(image/jpeg、image/png、image/gif)即可
上传php文件
抓包修改文件类型
上传成功
pass03 特殊后缀绕过
这一关不能上传.asp,.aspx,.php,.jsp后缀文件
但在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。这里尝试php3后缀,可以直接上传
pass04 .htaccess绕过
这一关过滤了很多后缀,但是没有对.htaccess进行过滤
1 | .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。 |
绕过思路
1 | 创建.htaccess文件,代码如下: |
这里我使用方法二,将所有的png文件都以php文件解析,先上传.htaccess文件,然后上传包含php代码的1.png文件
pass05 .user.ini绕过
这一关提示上传目录存在php文件,可以用到.user.ini文件上传漏洞
.user.ini上传漏洞的前提:.user.ini可以生效,并且该上传目录有php文件
漏洞原理:让上传目录下所有php文件在执行前预先加载指定文件
这一关符合漏洞前提
1 | .user.ini 配置项中有两个配置可以起到一些作用 |
构造.user.iniauto_prepend_file = 1.png
上传.user.ini后上传1.png,访问readme.php即可
pass06 大写绕过
通过源码发现这关与前几关不同,没有将文件名转化为小写,且黑名单中的大写有限,我们构造黑名单中没有的大写后缀即可,如2.Php
上传成功,打开图片
pass07 空格绕过
打开源码发现这里与之前相比少了首位去空的代码,我们可以通过这个绕过文件名过滤
漏洞原理:黑名单里没有php空格的黑名单
上传1.php抓包在后缀名后加上空格
pass08 加点绕过
这里跟上一关相似,这里没有删除点的代码,我们在后缀加上点即可绕过
漏洞原理:Windows系统下,文件后缀名最后一个点会被自动去除
上传1.php抓包在后缀名后加上点
pass09 ::$DATA绕过
前置知识如图
漏洞原理:在php中不会验证附加数据流后缀
打开burp suite拦截选中1.php上传,修改数据包中的文件名后缀
上传成功打开图片,删除后缀::$DATA
,因为windows服务器会自动删除附加数据流后缀
pass10 点空格点绕过
漏洞原理:后端在保存文件时,会先删除末尾的点,再删除空格,最后保存到windows时,系统自动删除末尾的点
pass11 双写后缀绕过
漏洞原理:这一关会根据黑名单删除文件名中的部分内容,但是只会检查一次,如果删除后的文件名中包含黑名单后缀,系统可能发现不了
如.pphphp
后缀,后端删除第一个遇到的php后,会将前面的p
和后面的hp
组合成一个新的php后缀,将php文件保存下来。
pass12 %00截断
前置知识:%00和0x00都表示空(null),一个再url中使用,一个是在编程语言中。
漏洞原理:在数据包中可以直接修改上传文件的保存路径,我们通过00截断修改上传路径即可保存文件。
上传php木马的png文件,修改保存路径为upload下1.php%00
pass13 0x00截断
第13关与12关思路一样使用白名单限制上传文件类型,但上传文件的存放路径可控,
但因为是POST型,需要对%00进行解码或在16进制中修改,POST不会像GET那样对%00进行自动解码。
通过burp suite对路径编码0x00
pass14 字节标识绕过
本关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件使用图片马+文件包含绕过
方法一:修改木马文件后缀,并修改头两个字节,jpg文件为ffd8,png为8950,gif为4749.
方法二:将木马文件添加到正常图片文件后。
方法一只需要用010editor编辑即可,这里只展示方法二。
构造三种类型的木马文件copy pic.jpg/b+1.php hack.jpg
copy pic.png/b+1.php hack.png
copy 1.gif/b+1.php hack.gif
上传所有文件,记录下每张图片上传系统生成的随机文件名2120250303200002.jpg 3320250303121415.png 7820250303200046.gif
打开文件包含网站,file设置为对应的文件名即可
pass15 图片马绕过
这一关采用getimagesize()检查是否为图片文件,不能使用字节标识绕过,可以使用图片马绕过,跟14关一样。
这里只展示部分图片
pass16 图片马绕过
exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快
这里只展示上传的jpg文件
pass17 二次渲染绕过
本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染。
上传正常的gif图片下载回显图片(32243.gif),用010Editor编辑器修改渲染后的gif图片内容(因为渲染过的不会二次渲染),插入PHP一句话,利用路径文件包含成功。
jpg图片也同样可以
png有点复杂了,暂时先不弄
pass18 条件竞争绕过
漏洞原理:将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可通过条件竞争的方式在unlink之前,访问webshell。
使用burp拦截上传18.php的数据包并对数据包发送至intruder模块进行高速重发(上传包)
1 | //18.php |
清除payload位置后,设置重复攻击,并配置线程
同时使用burp截取访问http://192.168.32.1/upload/upload/18.php的数据包也进行重发(访问包)
开启两个重放攻击之后,等一会儿就能在上传目录看到生成小马生成的shell.php
也可以访问shell.php
pass19 apache解析漏洞+条件竞争绕过
apache解析漏洞:Apache对文件名后缀的识别是从后往前进行的,当遇到不认识的后缀时,继续往前,直到识别。
点开源码,发现这一关会对后缀进行检查,直接上传php文件是不行的
利用apache解析漏洞我们可以将php文件上传,并通过条件竞争赶在文件重命名之前执行生成小马,生成shell.php
抓包修改文件名后缀,发送到intruder
同时使用burp截取访问http://192.168.32.1/upload/upload18.php.7z的数据包也进行重发(访问包)。注意,这一关在上传之前就对文件名进行了初步更改,且上传目录与前几关相比不太一样。
开启攻击之后,过一会儿就能访问shell.php了
pass20 后缀绕过总结
这一关比前几关简单,只会根据最后的点之后的后缀判断,用之前的方法就能成功,可以复习一下之前的绕过姿势。
后缀加点绕过
空格绕过
00截断、::$DATA、大写绕过、点空格点都行
pass21 审计+数组后缀绕过
1 | $is_upload = false; |
源码逻辑:
1.检查MIME (通过抓包改Content-Type 绕过)
2.判断 POST参数 save_name 是否为空,
3.判断$file 是否为数组,不是数组以 .分割化为数组
4.取 $file 最后一个元素,作为文件后缀进行检查
5.取 f i l e 第 一 位 和 第 ‘ file 第一位和第file第一位和第‘file[count($file) - 1]
作为文件名和后缀名保存文件
绕过方法:
修改content-type 修改POST参数为数组类型,
索引[0]为1.php,
索引[x]为jpg|png|gif。 x是最大索引
只要倒数第二个索引为空,
$file[count($file) - 1]就等价于$file[x-1],值为空绕过