文章目录
- 前言
- Pass-01(JavaScript绕过)
- Step1、分析源码
- Step2、修改webshell文件后缀名
- Step3、修改报文重新发送
- Step4、使用webshell程序测试是否能连接
- Pass-02(MIME-Type绕过)
- Step1、分析源码
- Step2、burp抓包,修改数据包
- Step3、使用webshell程序测试是否能连接
- Pass-03(黑名单绕过)
- Step1、分析源码
- Step2、burp抓包,修改数据包
- Pass-04(黑名单之.htaccess绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-05(黑名单之大小写绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-06(黑名单之空格绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-07(黑名单之.绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-08(黑名单之::$DATA绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-09(黑名单之点-空格-点绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-10(黑名单之双写后缀绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-11(白名单之%00截断 GET方法绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-12(白名单之%00截断 POST方法绕过)
- Step1、分析源码
- Step2、抓包,重发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-13(白名单之文件包含漏洞图片马绕过)
- Step1、分析源码
- Step2、制作图片马
- Step3、上传图片马
- Step4、使用webshell程序测试是否能连接
- Pass-14(白名单之文件包含漏洞getimagesize()检测绕过)
- Step1、分析源码
- Step2、制作图片马
- Step3、上传图片马
- Step4、使用webshell程序测试是否能连接
- Pass-15(白名单之文件包含漏洞exif_imagetype()检测绕过)
- Step1、分析源码
- Step2、其他步骤跟Pass-14、Pass-15差不多
- Pass-16(白名单之文件包含漏洞突破二次渲染)
- Step1、分析源码
- Step2、制作图片马
- Step3、上传图片马
- Step4、找到没有被修改的地方,修改被二次渲染的图片
- Step5、再次上传修改后的图片马
- Step6、使用webshell程序测试是否能连接
- Pass-17(条件竞争)
- Step1、分析源码
- Step2、编写适合条件竞争的PHP文件
- Step3、抓包,配置上传的爆破
- Step4、抓包,配置访问文件的爆破
- Step5、开始攻击
- Step6、使用webshell程序测试是否能连接
- Pass-18(条件竞争+文件包含漏洞)
- Step1、分析源码
- Step2、制作图片马
- Step3、上传图片马,抓包查看
- Step4、配置图片马上传的爆破
- Step5、使用文件包含漏洞来访问图片,然后抓包
- Step6、上传和访问同时攻击
- Step7、使用webshell程序测试是否能连接
- Pass-19(move_uploaded_file函数绕过)
- Step1、分析源码
- Step2、抓包,重新发送请求
- Step3、使用webshell程序测试是否能连接
- Pass-20(文件名数组绕过)
- Step1、分析源码
- Step2、抓包,修改数据包重发送
- Step3、使用webshell程序测试是否能连接
前言
upload-labs是一个专门用来练习文件上传的靶场
一共20关,现在,我们开始通关吧。
Pass-01(JavaScript绕过)
Step1、分析源码
这里使用了前端JavaScript来进行过滤,并且只允许上传jpg、png、gif类型的文件。
Step2、修改webshell文件后缀名
把生成的webshell文件1.php改名成2.jpg,上传,然后查看burp数据包
把数据包发送到Repeater模块
Step3、修改报文重新发送
文件存放的路径
Step4、使用webshell程序测试是否能连接
第一关通关。
Pass-02(MIME-Type绕过)
Step1、分析源码
这里是对发送的数据请求包进行了检测,只有符合要求的Content Type字段才能上传成功,也就对MIME-Type类型进行检测。
Step2、burp抓包,修改数据包
直接上传webshell文件,然后抓包
修改数据包Content Type字段类型
Step3、使用webshell程序测试是否能连接
连接成功,第二关通关
。
Pass-03(黑名单绕过)
Step1、分析源码
看源码,这里使用了黑名单绕过,禁止了’.asp’,‘.aspx’,‘.php’,'.jsp’等后缀名命名的文件上传,这就使用不在这个黑名单上面的后缀名吧。
Step2、burp抓包,修改数据包
这里就上传一句话木马
好了,文件上传成功了,第三关通关
。
Pass-04(黑名单之.htaccess绕过)
注意:这里对PHP版本有要求,只有不带nts的PHP版本才有效。
Step1、分析源码
这一关几乎把所有我们能想到的文件类型都禁止掉了,这时后就只能上传一些乱七八糟的格式的文件。
Step2、抓包,重发送请求
上传 .htaccess 文件,内容为:SetHandler application/x-httpd-php
把webshell文件随便修改成任意后缀名的文件
Step3、使用webshell程序测试是否能连接
好了,连接成功,第四关通关
。
Pass-05(黑名单之大小写绕过)
注意:这里对PHP版本有要求,只有不带nts的PHP版本才有效。
Step1、分析源码
这里黑名单加入了 .htaccess ,也就是说不允许上传.htaccess文件了,但源码发现,少了一个转换为小写的函数,也即是说可以使用大小写绕过功能。
Step2、抓包,重发送请求
Step3、使用webshell程序测试是否能连接
这里第5关通关
。
Pass-06(黑名单之空格绕过)
Step1、分析源码
这里没有去除文件中的空格,这个可以利用
这时候就需要普及一个知识:Windows下‘xx.jpg
’和‘xx.jpg.
’两种文件是不被允许存在的,要是这样命名文件,Windows系统会默认删除空格
或者‘.
’
Step2、抓包,重发送请求
Step3、使用webshell程序测试是否能连接
第6关通关
。
Pass-07(黑名单之.绕过)
Step1、分析源码
这里没有去除文件末尾的‘.
’,这个可以利用。
这时候就需要普及一个知识:Windows下‘xx.jpg
’和‘xx.jpg.
’两种文件是不被允许存在的,要是这样命名文件,Windows系统会默认删除空格
或者‘.
’
Step2、抓包,重发送请求
Step3、使用webshell程序测试是否能连接
第7关通关
。
Pass-08(黑名单之::$DATA绕过)
Step1、分析源码
这里没有去除::$DATA
样式的字符串。
NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA
。
Step2、抓包,重发送请求
Step3、使用webshell程序测试是否能连接
第8关通关
。
Pass-09(黑名单之点-空格-点绕过)
注意:该方法只对7.1以下的PHP版本有用。
Step1、分析源码
这里先过滤了一次末尾的‘.
’后过滤了一次空格
。这就能生成一种思路,使用:‘点-空格-点
’的方式来进行绕过。
Step2、抓包,重发送请求
Step3、使用webshell程序测试是否能连接
第9关通关
。
Pass-10(黑名单之双写后缀绕过)
Step1、分析源码
这个代码的意思就是把带有黑名单中的后缀替换为空。
这时我们考虑双写绕过。
Step2、抓包,重发送请求
把 .php
改成 .pphphp
,它就会删掉中间的php,最后保留 .php
Step3、使用webshell程序测试是否能连接
第10关通关
。
Pass-11(白名单之%00截断 GET方法绕过)
注意:这个东西已经是旧时代的产物的,所以有使用条件:
1. php版本小于5.3.4
2. php的magic_quotes_gpc为OFF状态
Step1、分析源码
这里设置了白名单。
save_path是一个可控的变量,后面还有一个后缀名需要绕过,这个时候需要使用%00
截断。
Step2、抓包,重发送请求
修改save_path部分,使用%00截断,然后下面文件名修改成其他类型的后缀名。
Step3、使用webshell程序测试是否能连接
第11关通关
。
Pass-12(白名单之%00截断 POST方法绕过)
注意:这个东西已经是旧时代的产物的,所以有使用条件:
1. php版本小于5.3.4
2. php的magic_quotes_gpc为OFF状态
Step1、分析源码
在POST请求中,%00不会被自动解码,需要在16进制中进行修改00
Step2、抓包,重发送请求
进入16进制编码
页面,把上面输入的空格16进制编码20修改成00
上传成功
Step3、使用webshell程序测试是否能连接
第12关通关
。
Pass-13(白名单之文件包含漏洞图片马绕过)
Step1、分析源码
这里只查看图片编码前2个字节
可以使用文件包含漏洞。
Step2、制作图片马
使用DOS命令:
copy hua.jpg /b + 2.php /a 123.jpg
这里hua.jpg是正常图片,2.php是包含webshell的文件,123.jpg是生成的图片马。
使用记事本打卡查看
Step3、上传图片马
右键在新标签打开图片可以查看图片的路径,可以看到图片是改名字了。
Step4、使用webshell程序测试是否能连接
测试路径是:http://192.168.1.107/upload-labs-master/include.php?file=upload/3520230628175732.jpg
第13关通关
。
Pass-14(白名单之文件包含漏洞getimagesize()检测绕过)
Step1、分析源码
getimagesize()函数将测定任何GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM或WBMP图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通HTML文件中标记中的 height/width 文本字符串。
Step2、制作图片马
这里就直接使用Pass-13的图片马了。
Step3、上传图片马
这里直接把图片的后缀名由JPG改成JPEG了。
Step4、使用webshell程序测试是否能连接
第14关通关。
Pass-15(白名单之文件包含漏洞exif_imagetype()检测绕过)
Step1、分析源码
exif_imagetype是判断一个图像的类型的进程。它会读取一个图像的第一个字节并检查其签名。
注意该实验需要开启php_exif模块
Step2、其他步骤跟Pass-14、Pass-15差不多
Pass-16(白名单之文件包含漏洞突破二次渲染)
注意:这里推荐使用gif文件,经测试jpg和png文件会经常被由头渲到尾,不太好用。
Step1、分析源码
这关会对上传的图片进行二次渲染
Step2、制作图片马
Step3、上传图片马
上传的路径是这里。
下载上传后的图片
对比两张图片很明显,里面的一句话webshell在二次渲染时被覆盖了,只有这一部分没有被二次渲染
Step4、找到没有被修改的地方,修改被二次渲染的图片
这里没有被二次渲染
把代码复制下来对比一下:
覆盖并修改这里
生成新的gif图片,图片略有失真了,不过不要紧
Step5、再次上传修改后的图片马
把图片下载下来,看看新图片木马里面的木马有没有被二次渲染
很好,这次没有被二次渲染
Step6、使用webshell程序测试是否能连接
第16关通关
。
Pass-17(条件竞争)
Step1、分析源码
这种情况,明显符合使用条件竞争的方式绕过
Step2、编写适合条件竞争的PHP文件
命名为777.php,内容为:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["a"]); ?>'); ?>
现在要上传该PHP文件,并且执行它,让它生成一个名为shell.php的一句话webshell。
Step3、抓包,配置上传的爆破
上传一个777.php文件,抓包,发送到攻击模块
Clear所有的标记,然后设置payload
下方的Continue indefinitely也就是无限重放的意思。
Step4、抓包,配置访问文件的爆破
上传一个正常的图片,抓包
找到上传的路径,然后去访问
访问刚才上传的gif图片,抓包,发送到攻击模块
修改访问目标。配置payload
Step5、开始攻击
上面两个操作尽量达到同时攻击
好了,看到这个说明访问成功了!
Step6、使用webshell程序测试是否能连接
第17关通关
。
Pass-18(条件竞争+文件包含漏洞)
Step1、分析源码
从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。
看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。
Step2、制作图片马
这里的图片马使用Pass-18的,把他嵌入到gif文件中,并命名为777.gif
Step3、上传图片马,抓包查看
这里注意,上传的图片马被改名字后就直接保存到根目录,也就说假如执行了图片马,生成的webshell文件也是在根目录。
Step4、配置图片马上传的爆破
这里跟17关一样操作
Step5、使用文件包含漏洞来访问图片,然后抓包
先尝试是否能使用文件包含漏洞
发现能使用文件包含漏洞,就抓这个包
修改访问的文件
Step6、上传和访问同时攻击
跟第17关一样,同时攻击。
Step7、使用webshell程序测试是否能连接
这里得注意了,生成得webshell文件不是在upload目录,而是在跟目录的。
上面这两种访问方式都可以。第18关通关
。
Pass-19(move_uploaded_file函数绕过)
这关有点不一样。
Step1、分析源码
有move_uploaded_file()
这样一个函数,它有一个特性,会忽略
到文件末尾的/.
及后面的内容
并且 move_uploaded_file() 函数中的 img_path 是由post参数 save_name 控制的,这就可以在 save_name 的参数上面改动。
Step2、抓包,重新发送请求
随机上传一个有webshell的php文件
Step3、使用webshell程序测试是否能连接
第19关通关
。
Pass-20(文件名数组绕过)
Step1、分析源码
这里先使用三元运算符判断 save_name 的值是否为空,如果为空,$file
的值就是 upload_file 数组下的 name 的值,不为空就是 save_name 的值。
然后就判断$file
是不是数组,如果$file
不是数组的话,就会将$file
以".
" 分割,打散成数组。
同时,这里也存在 move_uploaded_file 函数,也就是说也有忽略到文件末尾的/.
后面内容的性质。
Step2、抓包,修改数据包重发送
构造数组:
save_name[0]=“2.php/”
save_name[1]为空
save_name[2]=“jpg”
可以简单分析得到,这样构造的数据包也最终会拼接成的路径是:2.php/. .jpg
由于有 move_uploaded_file() 这样一个函数,它有一个特性,会忽略到文件末尾的/.
及后面的内容,所以最终上传的会是2.php
Step3、使用webshell程序测试是否能连接
第20关通关。