一、前端 JS 检测绕过
上传一个 php 文件,失败了,只允许图片为后缀的文件进行上传。这一关的关键是*“JavaScript 代码对文件后缀进行校验”*。JavaScript 属于前端范畴,而前端校验不会发出数据包,不会与服务器进行交互
第一种方式:浏览器直接 F12,找到checkFile()函数,进行删除。更为极端的方法是F12 --> F1 --> 禁用JavaScript,最后上传 PHP 木马
第二种方式:用 burp 拦截上传数据包, 对文件名进行修改
第一种方式:


**第二种方式:**传一个.jpg格式的图片,用 burp 抓包修改文件名和文件内容


二、MIME 类型检测绕过
MIME 是描述*消息内容类型*的因特网标准——MIME 参考手册
Content-Type 通常出现在 HTTP 请求头部中,指示请求的数据类型,或者是数据的 MIME 类型
1 | # 常见的 MIME 类型 |
这一关的关键是,使用Content-Type字段的值判断上传文件是否合法,只允许 image/jpeg、image/png、image/gif 文件的上传
用 burp 截取并修改数据包中的 Content-Type 类型进行绕过

三、后缀检测-黑名单绕过
黑名单绕过的常见方式有:
- 改变文件后缀名,使用不在黑名单中的文件后缀,例如
php2、php3、php4、php5、phtm - 拼接文件名
- 使用压缩文件
- 修改文件内容
- ……
通过 burp 拦截修改数据包中的文件名后缀为.php5
如果服务器是 Apache,也可用.htaccess来进行绕过,但是文件会在上传的过程中修改文件名

四、后缀检测-黑名单绕过(.htaccess)
.htaccess文件可以被用来限制特定的文件类型的上传或执行。从源码中得知没有对.htaccess限制
上传.htaccess文件,写入以下内容
1 | # .shell 文件会被解析为 php 文件 |
然后上传一个后缀名为.shell的文件,执行 webshell

五、后缀检测-后缀名点空格绕过
双写小数点,. .——中间是空格,围绕着小数点
由于一些操作系统和文件系统*不允许文件名以点号结尾,因此上传时会自动删除*最后一个点号

六、后缀检测-后缀名大小写绕过
观察源代码,发现服务器检查后缀忽视了“大小写”的检测,也就是没出现“strtolower() 函数”。
而“strtolower() 函数”用于将字符串中的所有字符转换为小写字母

七、后缀检测-后缀名空格绕过
观察源代码,发现服务器检查后缀忽视了“空格”的检测,也就是没出现“trim() 函数”。
trim()是 PHP 中的一个字符串函数,用于*删除字符串首尾的空格*或其他指定字符
理应加上$file_ext = trim($file_ext);

八、后缀检测-后缀名点绕过
观察源代码,发现服务器检查后缀忽视了“后缀名点”的检测,也就是没出现“deldot() 函数”。
deldot()函数用于在文件上传*防止后缀名点绕过攻击*。该函数的作用是将文件名中的所有点(包括后缀名点和其他点)都删除,以确保文件名的完整性和正确性。
上传文件并用 burp 抓包,在文件名中添加*额外的点*来绕过文件扩展名的检查

九、后缀检测-特殊字符串
可以通过在文件名中添加::$DATA来告诉 Windows 访问文件的资源,并将其当作可执行代码来执行

十、后缀检测-点空格绕过
同第五关
观察代码,发现先删除文件名末尾点.,再首尾去空格,由此想到
双写小数点,. .——中间是空格,围绕着小数点

十一、后缀检测-后缀名双写绕过
使用了str_ireplace()函数,替换成空,可以用双写绕过
上传文件名 code.p.phphp,上传文件时会删除 .php,最后的上传文件名: code.php

十二、后缀检测-GET方式00截断
%00 截断,用在 php 版本 5.3.29以下,magic_quotes_gpc 为 Off 状态
通过抓包,能够看到上传路径,使用 00 截断,抓包修改上传路径save_path=../upload/code.php%00,即可绕过。
“00截断”(Null byte injection)是一种 Web 应用程序安全漏洞,攻击者通过在输入数据中插入 ASCII 码为 0 的 null 字符(\x00),来绕过字符串截断等安全措施,导致应用程序执行意外的操作或暴露敏感信息。


十三、后缀检测-POST方式00截断
GET 会自行解码%00,POST 不会自行解码

十四、内容检测-文件头检测绕过
检测文件头,源码会根据图片的*前两个字节*来判定文件类型,所以需要把 webshell 的后缀改为图片格式
制作图片木马
1 | copy code.jpg /b + code.php /a webshell.jpg |

十五、内容检测-getimagesize()函数
getimagesize()函数来验证是否是图片。依旧是生成带有 php 代码的图片,进行上传
十六、内容检测-exif_imagetype()函数
使用exif_imagetype函数来检查是否是图片,读取图像的第一个字节并检查其签名。依旧是生成带有 php 代码的图片,进行上传
十七、内容检测-图片二次渲染绕过
图片的二次渲染会把第一次渲染添加的 PHP 代码删掉。
绕过的方式是,查看*图片的渲染后没有修改的位置*,添加一句话木马
未完待续……