pass-01
根据提示:本pass在客户端使用js对不合法图片进行检查
第一种方法:就是通过插件禁用前端js,直接上传php文件
禁用后就可以上传了
第二种方法:先将php文件的后缀更改为网页能接收的形式 ,比如我们这里将其更改为jpg格式
上传时对其抓包
我们将这里的2.jpg的后缀再更改回去,之后关闭代理并丢包
可以看到,上传成功
pass-02
根据提示:本pass在服务端对数据包的MIME进行检查
所以我们只需要在抓包时更改content-type即可
抓包后发送到repeater,可以更改为image/jpeg
成功上传
pass-03
根据提示:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件
通过查询源代码我们发现:Pass-03进行了如下防护操作:1.黑名单为.asp .aspx.php.jsp 2.删除文件名首尾空格 3.删除文件名末尾的点 4.将后缀名转为小写 5.去除::$DATA数据流标记 6.使用随机数重命名文件
那么我们就可以使用php的的别名进行绕过,如phtml
上传成功
pass-04
本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件
通过查看源代码,我们发现此网页几乎禁止了全部后缀,但却没有通过循环判断此文件是否只有多个后缀,所以我们可以构造文件名使最后经过滤的文件后缀名仍为.php
所以我们可以将后缀名加上:点+空格+点,这样一来,在上传时检测不到以php后缀结尾的文件,且在最后过滤时将空格删掉,Windows会自动删除文件名最后的点,最后保存下来的就是.php后缀的文件
上传成功
pass-05
根据提示:上传目录存在php文件(readme.php)
这个提示有没有区别不大,查看源码后发现可使用与pass-04同样的绕过方法,不多赘述
pass-06
根据提示:本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件
通过查询源代码发现:本网页并未将后缀大写改为小写,所以将后缀改为PHP绕过
上传成功
pass-07
根据提示:本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件
通过查看源代码发现本网页在过滤时并未对空格进行处理,所以截包时在后缀加一个空格即可
可以看到filename最后加了一个空格
上传成功
pass-08
根据提示:本pass禁止上传所有可以解析的后缀
通过查看源代码发现,网页没有使用去除后缀的点的函数,所以方法与pass-07的相差不多,只需要在filename最后加一个点即可,这里不做演示了
pass-09
直接查看源代码,发现没有去除字符串的函数,所以在bp中在文件名末尾加上::$DATA即可,也不过多演示了
注:在按照路径访问时别忘记删掉url中的::$DATA
pass-10
根据提示:本pass只允许上传.jpg|.png|.gif后缀的文件
通过分析源代码,发现网页只过滤了一次点,所以使用老办法点+空格+点的方法进行绕过
pass-11
根据提示:本pass会从文件名中去除.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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字符
通过查询源代码我们发现,此网页的过滤方式是将所有黑名单上出现的后缀名都更改为空白,然后无论后缀为什么都会上传,由于此过滤只进行一次,所以我们可以在原本的后缀上加入黑名单中的后缀名,如:可以在php中插入一个jsw,将原本的php后缀更改为:.phjswp,这样一来,在上传后就会被过滤为.php,完成文件的上传,具体过程不做演示
pass-12
在进行此网页的文件上传之前,我们先来了解一下截断漏洞
使用此漏洞的大致方法为:比如我们上传一个文件名为2.php%002.jpg的文件,在文件上传后,网页在过滤时,会发现文件的后缀为jpg,于是就会让文件成功上传,但是在文件保存时,会忽略掉%00后面的东西,于是我们上传的文件就成功绕过变为2.php
根据提示:本pass上传路径可控
并查询源代码发现,我们可以利用此漏洞更改保存路径
首先随意选择一个php文件,在上传时抓包,在上传路径后加上我们要上传的文件名和%00,并且将文件名后缀修改为.jpg
可以看到成功上传
我们查看一下upload
成功上传
注:过本Pass,PHP版本=5.2.17,php.ini中关闭magic_quotes_gpc选项
pass-13
本题原理与pass-12相差不大,唯一区别是此题为post型,在修改路径时直接在明文中添加%00不会被服务器解码,我们需要修改HTTP包中上传路径对应的十六进制值(改为00)进行截断攻击
具体修改方法
以图示为例,首先将上传路径修改为../upload/2.php.jpg,将文件名修改为2.jpg
之后进入hex界面,将如图所示jpg前的点,也就是2e更改为00
之后send就可以上传文件了
上传成功
pass-14
注意:
1.保证上传后的图片马中仍然包含完整的一句话或webshell代码。
2.使用文件包含漏洞能运行图片马中的恶意代码。
3.图片马要.jpg,.png,.gif三种后缀都上传成功才算过关!
4.PHP版本>5.3。
5.必须在php.ini中开启allow_url_fopen选项
这里我们需要提前在pass-14这一文件夹下添加一个include.php文件,具体内容如下:
<?php
include($_GET['page']);
?>
之后通过命令将图片文件与php文件copy到一起,之后上传到网页中
这时,我们的include.php就派上了用场
我们更改url,将图片文件路径传递给此php文件,我们就能在网页中看到结果了
可以看到,成功上传
png,gif与此方法类似,不做演示
pass-15
过程与pass-14相同,同样是以图片马形式上传,这里不做演示了
pass-16
过程与pass-14和pass-15相同,不过必须开启php_exif模块
pass-17
由于软件运行问题,此题不演示操作过程,只解释绕过原理
通过查看源代码,本体是通过二次渲染的方法来防止图片马上传的,而二次渲染会将我们上传的图片马中的php代码删掉,所以我们可以将原图与渲染过后的图片进行对比,查看哪里没有被渲染,我们在其中插入php即可,推荐的对比软件为beyond compare
pass-18
通过提示,此题需要代码审计
我们查看代码过后,发现如果上传的文件后缀不符合白名单,立即删除,这让我们连解析的机会都没有,但如果我们利用爆破功能,在同一时间上传多个文件,且在删除前就进行访问,那么它就无法删除了
所以我们先选择一个php文件,上传时抓包,发送到爆破模块
首先将所有的变量清除,其次将payload type改为null payloads
之后按如下的进行更改
之后把线程调高一点,我们这里调成20
然后就可以开始爆破了
开始爆破后,开始访问127.0.0.1/upload-labs-master/upload/2.php(因为我们上传的文件名就为2.php),如果访问失败就一直刷新,直到成功访问
成功访问
pass-19
通过查询源代码可知,此关还会检查文件后缀,所以不能直接上传php文件,但是我们可以上传图片马,之后的步骤与pass-18相同,访问文件时使用文件包含漏洞即可
pass-20
通过提示:本pass的取文件名通过$_POST来获取
再经过查询源码我们可以得知本Pass只对保存名进行黑名单判断,该做的防护全部没做。所以我们进行大小写绕过,使用BurpSuite截包,直接将保存后缀改为:PHP
上传成功
pass-21
本Pass做了如下校验:1.验证MIME类型 2.验证文件名
我们查看源代码分析验证文件名方法:
1.empty()配合三运运算符检查文件名是否为空
2.如果$file不为数组则将$file打散为数组
3.end()函数提取数组最后一个元素为后缀名
4.确定白名单
5.将文件名设置为数组索引为零的元素与数组索引为元素总个数减一的元素合并
6.上传、改名、移动
首先第一个校验我们通过更改content type就能很好解决
之后
reset()取数组索引为0的元素为文件名,所以将save_name[0]设置为“shell.php”
save_name[1]不设置,使count()结果为2
save_name[2]为jpg
拼接结果为shell.php,$ext值为jpg
接下来对此过程进行解释:
我们设置的数组可以看成:{"upload-20.php"," ","jpg"},一共三个元素,为了便于讲解,我们接下来给这个数组取名为a
由于count函数的特性为:在计算数组内元素个数时不算null,所以count()的结果为2
在函数取保存名称时,会取到count()-1的位置,也就是a[1],在数组中为null
在网页检验文件名后缀时,它实际是在检验此数组最后一个元素是否在白名单内,而我们这个数组最后一个元素为jpg,显然是在其中的
这样一来我们成功上传文件到“upload-20.php ”,此文件名后面的空格在上传时会忽略掉
查看upload
可以看见,成功上传并保存为php格式的文件了