Pass-1 (js前端验证)
提示:本pass在客户端使用js对不合法图片进行检查
这里直接跳出弹窗提示 了,可以看出来这个验证是在前端进行的,众所周知,直接禁用掉就好了 。
Pass-2 (MIME验证)
提示:本pass在服务端对数据包的MIME进行检查!
从源代码中可以看出只对文件类型(type)进行了验证,必须要是image/jpeg或者image/png或者image/gif的格式,没有对后缀进行验证,只需要使用bp抓包将Content-Type:的参数修改成image/jpeg或者image/png或者image/gif其中的一种,进行绕过就好
$_FILES['myfile']['type']文件的MIME类型,需要浏览器提供该信息的支持,例如"image/gif"
MIME 给出的是文件的MIME信息 ,此信息可以用来在HTTP Conten-type 头 信息中发送 正确的信息,如:header("Cotent-type:image/gif")
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream
操作步骤:
第一步:开始BP抓包。
第二步:上传php的 文件,修改Conten-type
上传成功
Pass-3 (黑名单验证,特殊后缀)
提示:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
查看原代码
分析一下代码:
这里使用了数组的方式,设置的黑名单,不允许.asp .aspx .php .jsp的后缀名进行上传。
绕过思路:php不止只有这一个文件名,我们可以使用其他的php的别名进行绕过:.php3 .php4 .php5 .phtml .phtm .phps .phpt .php345 (但是这里是有前提条件的)就是对方的服务器的配置有对这些php其他的文件名配置了解析的设置,否认就算你上传上去了,还是解析失败。配置好了对应的解析,直接修改文件名就好了把1.php修改成你配置的对应的解析的文件名。
比如:1.php修改后1.phtml
Pass-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进行验证,那么我们就可以使用.htaccess进行绕过
.htaccess功能介绍:htaccess文件是Apache服务器中的一个配置文件。这个文件的可以不用获得root的权限,就可以更改这个目录下的所有的文件配置。那么说明只要创建一个.htaccess的文件,并且写入php的 配置,上传到这个服务器上,那么这个.htaccess所在的目录下的所有文件的配置就会都修改成转换成php的解析格式。(.htaccess文件只对Apache服务器有效)。
操作步骤:
1.首先先创建一个.htaccess的文件在文件中写入
<FilesMatch "1.png">
SetHandler application/x-httpd-php
</FilesMatch>
2.把这个文件上传到服务器上。
3.将一句话木马文件名修改成gif/png/jpe其中格式的一种。比如2.png
4.将1.gif(一句话木马的文件)上传到服务器
上传成功。
这里的关键点就是.htaccess这个文件,把所有的目录下的文件的解析方式都修改成了php,
所以我们第二次上传的图片2.png “png”不在黑名单中,但是由于.htaccess文件所以又把他解析成了php的格式,所以可以完成正常的解析。
Pass-5 (黑名单验证,.user.ini)
1.上传一个.user.ini文件, php.ini是php默认的配置文件,其中包括了很多php的配置,而.user.ini实际上就是一个可以由用户“自定义”的php.ini,内容为:
auto_prepend_file=1.png
2.上传.user.ini文件,.user.ini配置参考的PHP 通过.user.ini 绕过黑名单限制,在.user.ini设置auto_prepend_file属性
下方的配置的意思是在.user.ini相同的目录下,所有的php文件都包含5.png这个文件
所以之后我们就可以利用到readme.php包含一个我们上传的木马文件,再连接readme.php文件达到连接一句话木马的目的
Pass-6 (黑名单验证,大小写绕过)
查看源码:
这里和之前的源码进行对比一下,可以发现没有使用strtolower()这个函数,把后缀都转换成小写,那么我们就可以使用大小写的方式绕过黑名单。
操作步骤:
第一步:上传一个.php的文件
第二步:开启bp抓包修改数据
第三步:放包
Pass-7 (黑名单验证,空格绕过)
查看源码:
从源码中可以看出没有对文件名后缀的空白使用trim()进行过滤,借助windows系统的特性,文件名中的空格在最后保存文件时会被作为空处理,最后在保存的时候把后面的空格自动删除掉。
但是在程序中检查代码的时候检查到空格却不能自动删除空格。同时又绕过了黑名单的验证
操纵步骤:
第一步:上传一个.php的文件
第二步:开启bp抓包修改数据,在文件名的后缀添加空格 第三步:放包
Pass-8 (黑名单验证,点号绕过)
提示:本pass禁止上传所有可以解析的后缀!
查看源码
对比发现,没有对末尾的点使用deldot(),进行过滤,没有删除末尾的点,再次利用windows的特性,在文件名的后缀加上点号,在最终保存的文件windows系统自动去除掉后面的点,保存文件。同时绕过黑名单的验证。
操纵步骤:
第一步:上传一个.php的文件
第二步:开启bp抓包修改数据,在文件名的后缀添加点号 绕过
第三步:放包
Pass-9 (黑名单验证,特殊字符::$DATA绕过)
查看源码
对比之前的源码发现这里没有使用 str_ireplace()对::$DATA进行过滤,没有替换成空。
什么是::$DATA呢?
::$DATA这是一种windows操作系统处理文件时的特性,为文件流,如果文件名后有此标记::$DATA
,并且没有做过滤,windows会不检查,直接保存该文件。使用他的目的就是不检查后缀名。
所以我们只要在文件名后面加上::$DATA就可以成功绕过
操作步骤:
第一步:上传一个.php的文件
第二步:开启bp抓包修改数据,在文件名的后缀添加::$DATA绕过第三步:放包
把后面的::$DATA删除掉就可以看到刚刚上传的文件了
Pass-10 (黑名单验证,点+空格+点绕过)
查看源码
抓包修改后缀为php. . .
去掉文件后的点
成功
Pass-11 (黑名单验证,双写绕过)
查看一下源码
这一关重点的是str_ireplace($deny_ext,"", $file_name);这个函数,将文件名中出现在黑名单的这些后缀都替换成空,假如我们上传一个phpinfo.php被过滤后就变成了phpinfo,就没有后缀无法解析了,但是她这次也是使用的是一次性过滤,比如说我们上传phpinfo.phpphp,那么在一次性被过滤后我们原本上传的phpinfo.phpphp,就变成了phpinfo.php。 前面的php被匹配到替换成功,但是后面的第二个php没有被替换成空。
操作步骤:
第一步:上传一个.php的文件
第二步:开启bp抓包修改数据,在文件名的后缀添加php绕过。
第三步:放包
Pass-12 (GET方式00截断绕过)
查看一下源码
分析源码:
1.$ext_arr = array('jpg','png','gif'); 这里使用了数组做了一个白名单
2.$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
截取文件名的后缀从点的位置开始截取,并且使用的是循环的方式截取,不是采用 一次性
对($_FILES['upload_file']['name']进行验证
3. if(in_array($file_ext,$ext_arr)){ 判断上传的文件名后缀是否在白名单中,如果在进入循环。
4. $temp_file = $_FILES['upload_file']['tmp_name']; 进入循环,给上传的文件放在一个临时的目录下,并且生成一个临时文件名
5.$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;(这一步是关键)
使用$_GET['save_path']接受自定义的路径,并且随机从10,99的数组在随机生成一个文件名,
在拼接上$file_Ext 前面截取的后缀名。
6.(move_uploaded_file($temp_file,$img_path)){
最终将前面保存的$temp_file临时文件移动 到$img_path
原理 :
00截断利用的是php的漏洞,php的基础是C语言实现的,在C语言中认为%00是结束的符号,所以就基础了c的特性,在PHP<5.3.4的版本中,在进行存储文件时碰见了move_uploaded_file这个函数的时候,这个函数读取到hex值为00的字符,认为读取结束,就终止了后面的操作,出现00截断
绕过思路:
首先使用的是白名单,从代码中可以看出他首先对上传的文件名的后缀进行了验证。
所以我们在第一步上传$_FILES['upload_file']['name'],文件名的时候必须后缀是.jpg.png.gif的格式。绕过后缀名的验证后,进入到循环。最后重点他保存的文件是
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;,由上传路径决定的,原参数$_GET['save_path'],save_path=../upload/。 那么上传路径可控的 。我们就使用%00截断,把上传的路径修改为文件名。最后利用move_uploade_file这个函数发挥出%00截断的功能。
假如我们没有使用%00截断前最终上传的文件名可能是
../upload/ 237298.png
$_GET['save_path'] rand(10, 99).date("YmdHis") $file_ext;
使用%00截断后
../upload/1.php%00237298.png
$_GET['save_path'] rand(10, 99).date("YmdHis") $file_ext;
最后 保存的文件就变成了
../upload/1.php
操作步骤:
第一步:上传一个.php的文件
第二步:开启bp抓包修改数据,filename="phpinfo.png" 后缀修改成图片格式,
替换文件中的内容。修改?save_path=../upload/1.php%00
访问图片 地址
将后面的参数删掉 ,因为我们最终保存在目录下的是1.php
上传成功
注意:过这关和下一个需要把php换成<5.3.4的版本,并且php.ini中关闭magic_quotes_gpc选项。
Pass-13 (POST方式00截断绕过)
这关原理和上一关一样,不过是使用POST 方式进行传参的。所以需要在%00的时候进行编码。
GET会自动解码%00
比如说你在url输入空格,他自己会进行判断并且把他进行编码知道你想要的%00,在url干嘛的。
但是POST里面 加%00 POST不会自动解码,你在POST中输入的%00 他会认为是普通文本的%00,那么普通文本他就会编码成%25%30%30.不是我们想要的%00,所以我们需要自己把他先进行编码 。
操作步骤:
第一步:上传一个.php的文件
第二步:开启bp抓包修改数据,filename="phpinfo.png" 后缀修改成图片格式,
save_path"=../upload/1.php%00
选中%00进行编码
第三步:放包
Pass-15 (文件内容检测,图片马绕过)
查看一下源代码
代码分析:这一关对图片的内容进行了验证,本题给了提示此关检查的是文件头部信息,通过检查文件的前2个字节,检查上传文件二进制的头部信息,来进行判断文件的类型。所以这一关修改后缀是没有用的。使用图片码的方式绕过。
操作步骤:
1。制作图片码 准备一张图片,在准备一个一句话木马的php文件
2.打开cmd 使用命令制作图片码
copy 1.jpg /b + 1.php /a shell.php
复制图片链接地址
4.点击"文件包含漏洞"的地址,进行传参。
Pass-16 (文件内容检测,exif_imagetype函数绕过)
注意!!!先开启php_exif模块(点击phpstudy中其他选项菜单—>PHP扩展及设置—>PHP扩展—>找到php_exif,确保其打勾)
查看源码,查看提示发现有重新渲染
imagecreatefromjpeg()函数,二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
按照前几关的方式上传,可以上传,但是包含漏洞无法解析。原因就是二次渲染将图片马里面的php代码删了。接下来把原图和修改后的图片进行比较,看哪里没有被渲染,在这里插入php代码。推荐使用beyond compare。为了方便大家测试,这里再推荐网上大佬的二次渲染专用图片https://wwe.lanzoui.com/iFSwwn53jaf
把上传的图片在右键保存本地,看没有被渲染的地方,加入php代码
再重新上传