人过留名,雁过留声
人生天地间,凡有大动静者
必有猪头
Pass 1
① 源码分析
后端没有做任何限制,前端 js 代码使用白名单对可上传文件的后缀做了限制
② 漏洞利用
-
写一个脚本文件 test.php ,内容如下:
-
直接上传 PHP 文件是不行的,因为前端的 js 有白名单限制。
-
将脚本文件后缀名改为白名单中任意一个,上传之后用 Burpsuite 截包修改文件后缀名进行绕过。
-
上传脚本文件之后的关键一步在于找到上传的脚本文件的路径,在这里上传的文件在页面中有回显,可以右键 ”查看图像位置“ ,然后再另一个窗口打开。
ps:还可通过repeater模块查看上传文件存储的位置。
-
前端限制的绕过可以有多种姿势,除却上面提及的一种姿势外还有下面常用的几种。
① 前端直接修改验证代码
在源码中可以得知限制文件上传类型的白名单在 checkFile() 函数中,打开 F12 开发者工具,直接定位元素,发现 form 表单的动作调用了 checkFile() 函数,于是可以直接删除动作来接触前端对文件上传类型的限制。
删除动作之后直接上传 PHP 文件即可。
② 修改白名单
③ 浏览器禁用 JavaScript
如果浏览器禁用 JavaScript,那么在 JavaScript 中的白名单自然也就无法作用了。
在浏览器的搜索栏输入 about:config,在接下来的搜索栏中搜索 javascript.enabled,将 true 转换为 false,重启浏览器即可生效。
Pass 2
① 源码分析
在前端没有做限制,在后端 Content-Type 做了白名单限制,对文件名后缀(文件类型)没做限制。
② 漏洞利用
- 每做新的一个关卡要清空一下上传的文件,以便验证结果。
- Burpsuite 截包修改 Content-Type 的值为白名单中任意一个即可。
- 右键获取脚本地址,在新的窗口读取出来。
ps: 也可以把脚本的扩展名暂时修改为白名单允许的上传的类型,(此时的Content-Type自然也符合要求)然后再用 Burpsuite 抓包再修改过来。
Pass 3
① 源码分析
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
strrchr()查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
设置后缀名的黑名单'.asp','.aspx','.php','.jsp'
提取出后缀名之后再做限制:
1. 删除文件名末尾的点
2. 将后缀名转换为小写
3. 去除后缀名的字符串::$DATA
4. 后缀名结尾去空
② 漏洞利用
黑名单中限制了部分后缀名,针对于限制的后缀名分别由其他的后缀名可代替
asp : asa cer cdx
aspx : ashx asmx ascx
php : php3 php4 php5 phtml
jsp : jspx jspf
exe exee
可以选择对应的后缀名进行替换,然后绕过。(这里选择 .php3)
在替换后缀名的时候,如果需要替换尝试的后缀名多的话可以结合使用 burpsuite 的 repeater 模块进行数据包回放,也可以使用 intruder 模块进行暴力破解
从这里可以得知上传的文件被重命名了,这也是预防黑客攻击的一种手法。
ps:在这里就是由于上传文件被重命名导致 Pass 4 的某些绕过姿势在这里无法复现。
ps:这里需要注意的是,php3 之所以能够被成功解析都是因为 apache 的配置。在 PHP study 的目录下进入 \Apache\conf\httpd.conf
(如果将此项注释掉,那么将连最基本的 PHP 文件都无法解析,显示在浏览器页面的就是一堆源码)
如果在 httpd.conf 文件中没有配置 php3 或其他文件类型的话,可以手动添加,之后重启 apache 服务即可。
Pass 4
① 源码分析
和 Pass 3 相比,Pass 4 的黑名单限制更全
② 漏洞利用
1. 绕过姿势一
虽然黑名单的限制范围很广,但是还是没有对 php6 进行限制。
2. 绕过姿势二
利用中间件 apache 的解析漏洞绕过
在 apache 错误的环境配置下,对未知后缀名的解析,如果由多个后缀名的话,如 test.php.aaa.zhutou apache 会从右往左依次解析能够识别的后缀名为止。
ps:利用此方法绕过的前提是上传的文件没有被重命名。(故此方法不适用于 Pass 3)
3. 绕过姿势三
利用 .htaccess 文件进行解析
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
① 该文件默认开启,启用和关闭在httpd.conf文件中配置。
② 创建htaccess文件,编辑内容为:
SetHandler application/x-httpd-php
意思是将该目录下的所有文件解析为php文件来执行
③ 如果指定文件名的文件,才能被当做PHP解析,内容为:
<FilesMatch "zhutou">
SetHandler application/x-httpd-php
</ FilesMatch>
ps:FilesMatch 使用正则表达式,表示文件名或后缀如果有连续性的像 “zhutou” 这样的字符串即可被当成 PHP 文件解析
在创建 .htaccess 文件的时侯注意文件名必须为空,但是在 Windows 操作系统中会提示必须键入文件名。
可以先随便键入文件名,然后用 Burpsuite 截包再把文件名去除。
这里我的 .htaccess 文件内容以及解析的效果如下:
4. 绕过姿势四
利用 Windows 操作系统下的文件命名规则
文件名不能包含:< > / \ | : * ?
上传不符合 Windows 命名规则的文件名,windows系统自动去掉不符合规则符号后面的内容。
test.php.
test.php(空格)
test.php:1.jpg
test.php:: $ DATA
test.php::$DATA…… .
使用 Burpsuite 截包修改文件名
上传之后在 upload 文件夹上发现上传的文件,但是内容也被清除,所以此方法不完善,但可以有个概念。
Pass 5
① 源码分析
黑名单中添加了 .htaccess 类型,但是仍漏了 php6 (如果apache httpd.conf 的配置中有对 php6 进行解析的话可以使用其进行绕过)
重命名文件名,所以无法利用未知文件后缀名进行绕过。
和 Pass4 源码相比缺少了将后缀名转换为小写的限制
$file_ext = strtolower($file_ext);//转换为小写
② 漏洞利用
大小写绕过
ps:在 Windows 环境中文件名不区分大小写,在 Linux 环境中文件名区分大小写,所以在 Linux 环境中不能进行大小写绕过。
Pass 6
① 源码分析
和 Pass5 源码相比多了将后缀名转换为小写,却少了将首尾去空。
file_ext = trim($file_ext); //首尾去空
② 漏洞利用
在后缀名后面加空格进行绕过
Pass 7
① 源码分析
没有对上传的文件重命名
和 Pass6 的源码相比少了删除文件名末尾的点
$file_name = deldot($file_name);//删除文件名末尾的点
② 漏洞利用
1. 未知后缀名绕过
2. 后缀名加点绕过
Pass 8
① 源码分析
对上传的文件进行重命名(不能利用未知后缀名绕过)
和 Pass7 源码相比,少了在后缀名的后面去除字符串 ::$DATA
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
② 漏洞利用
Windows 文件流特性绕过
PHP 在Windows 上如果 “文件名” + “:: $ DATA” ,则 PHP 会将 “:: $ DATA” 之后的数据当成文件流处理,不会检测 后缀名,且保持 “::$DATA” 之前的文件名。
Pass 9
① 源码分析
红色框框内一波操作猛如虎,又有大量黑名单的加持(不过依然没有过滤 php6),看似天衣无缝,然而却又两处疏漏:
1. 没有对上传的文件重命名
2. 没有对题取后缀名做循环处理
任何一处的失误就导致漏洞产生
② 漏洞利用
用 Burpsuite 将上传的文件 test.php 修改为 test.php. .
ps:其实对于没有对上传文件进行重命名的都可以试试这个绕过姿势(如 :Pass7)
Pass 10
① 源码分析
定义了黑名单(但仍没有 php6,哈哈哈)
用 str_ireplace() 函数将文件名中含有黑名单中的字符串替换为空,且只替换一次。
ps:该函数不区分大小写,所以不能用大小写混淆绕过
② 漏洞利用
双写后缀名绕过
总结
-
如果是前端代码限制,可直接使用开发者工具进行前端代码修改绕过。
-
浏览器禁用 js
-
使用 .htaccess 文件解析绕过
-
使用Windows操作系统下的文件命名规则进行绕过 test.php:1.zhutou
-
利用 Windows 文件流特性进行绕过 test.php::$DATA
-
后缀名大小写,双写绕过
-
后缀名尾部加空格 test.php(空格)
-
后缀名尾部加点 test.php.
-
在没有对上传文件进行重命名的关卡中,可以尝试使用未知后缀名绕过和 test.php. . 的方式绕过
猪头 2020.2.12