条件:
- 有上传点(可能有存在上传代码,函数。。。)
- 上传文件可以被解析
- 上传文件可以被访问
可能存在的地方
- 可以上传文件的任意地方
- 上传头像
- 上传附件
- 上传资料
解析漏洞
IIS6.0 => web容器 [windows server 2003自带]
IIS => windows server(asp aspx)
IIS => asp apsx
apache => php jsp
nginx => php xxx
IIS6.0 中,.asa
.cer
cdx
会当作asp处理(特性),这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll
aspx兼容asp
asp一句话:``
区别
解析漏洞:让文件当作php来执行
文件上传:通过一些方法将文件上传
防御
- 客户端检测:浏览器(JS检测)==》没有检测,可以绕过
- 服务端检测:目标主机(后端代码检测)
检测分为两种:
- 黑名单:不允许xxx
- 白名单:只允许xxx 最常见
.jpg
.png
.gif
靶场实操
Pass-01(前端验证)
方法一:
通过抓包,将相应的数据包进行修改,删除JS部分,然后就可以绕过JS,无限制上传一句话
抓包

将请求发出

拦截到相应的数据包

删除该部分,即可无限制上传


菜刀连接获得webshell
方法二:
将一句话木马后缀修改为图片格式

绕过前端验证后抓包,修改文件后缀名即可上传
第一关的防御方式:后缀检测
Pass-02(Content-Type方式绕过)
与第一关第一种方法一样,上传jpg文件,然后修改后缀名即可
Content-Type
是文件类型
pass-03(黑名单绕过)
PHP中上传文件的函数move_uploaded_file
绕过方法:
.php =>phtml php3 php4 php5
.jsp => jspx jspf
.asp => asa cer aspx
.exe =>exee

pass-04(.htaccess文件绕过)
.htaccess
=> 分布式配置文件 是apache中特有的
.htaccess
并不是默认开启的。
.htaccess
全称是Hypertext Access(超文本入口).htaccess
文件也被称为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。
.htaccess
的功能:
文件夹密码保护、用户自定义重定向、自定义404页面,拓展名伪静态化、禁止特定IP的用户、只允许特定的IP的用户、禁止目录列表
AddType application/x-httpd-php .jpg # 这个指令代表.jpg文件会被当作php来解析
先上传.htaccess
文件,然后上传1.jpg
文件,就会使得jpg当作php解析
pass-05(后缀大小写)
将后缀名大小写混写就可以绕过
pass-06(文件后缀(空)绕过)
.php
与.php空格
是不同的后缀
因为windows会自动去后缀末尾的空格,所以上传.php空格
文件就可以绕过后端的后缀验证
抓包修改后缀


pass-07(文件后缀(点)绕过)
因为windows会自动去后缀末尾的点,所以上传.php.
文件就可以绕过后端的后缀验证

pass-08(::$DATA(Windows文件流绕过))
windows文件流(NTFS格式)
可以寄生文件

这条命令执行后生成了123.txt 但是文件大小却为0k,是空文件,那123被写到哪里了?

dir
也招不到
dir /r
可以找到隐藏的文件

对于windows而言,文件名后+::$DATA
windows会把::$DATA
之后的数据当作文件流处理,不会检测后缀名

成功将123写入1.txt


上传成功!
pass-09(构造文件后缀绕过)
本关可以利用源码中的规则对后缀名进行改变,

根据代码,可以将后缀名更为成.php. .
上传成功

这种方法需要知道源码的前提下进行分析
- github gitee 找源码
- CMS魔改
- 源码泄露 www.zip
- 官方提供
- 了解公司的开发风格
- 建模、强测
pass-10(双写文件后缀绕过)
源码中有这样一行代码
$file_name = str_ireplace($deny_ext,"", $file_name);
str_ireplace()
该函数可以替换字符串中的一些字符,不区分大小写
str_replace()
功能一样,区分大小写
更改后缀名为.pphphp


上传成功!
pass-11(%00截断绕过)
麦克风: over 计算机中是00 源于电报
php缓存文件(Temp)->移动文件并重命名
%00
是URL编码00
move_uploaded_file($temp_file,$img_path)将文件移动到新的地方$temp_file 移动的文件$img_path 要移动文件的位置$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;rand是随机数date("YmdHis")获取当前时间转换成数字


pass-12(00截断(POST传参))
因为POST传参并不会进行URL编码,所以只需要00截断即可
这里需要用16进制的编辑器修改为00,手动敲的0对应的是30


pass-13(图片马绕过)
图片马:图片+马
制作命令:copy 1.png/b + 1.php/a 2.png
- /b是二进制形式打开
- /a是ascii方式打开
2.png 是生成的图片马

图片马只能够保证可以上传,并不可以解析
解析漏洞(中间件的问题)、文件包含
CGI解析漏洞:任何后缀后加上/.php
都会当作php文件来解析

pass-14(getimagesize图片类型绕过)
与13同种绕过方式
pass-15(php_exif模块图片类型绕过)
直接上传图片马
pass-16(二次渲染)
绕过方法:gif动图格式可以绕过
制作gif图片马,采用十六进制编辑器写入

pass-17(条件竞争)
条件竞争:
上传文件的流程:
- 先检测:检测合格再上传 - 先上传:先上传后检测,不合格删除
检测是需要时间的
在检测的空挡时间,如果可以访问到php代码,就可以被执行
马生马:生成在与该文件目录一致
')>
本关在本地测试

先随便上传了一个图片,查看一下路径

然后跑数据包,一个是上传555.php的包,另一个是访问555.php的包;当访问了555.php,就会执行里面的写马的代码,于是生成了666.php


pass-18(条件竞争(二))
方法相似,进行一下绕过
pass-19(move_uploaded_file()截断)
依然可以00截断


这里直接访问php文件就行

pass-20(IIS6.0解析漏洞(一))
本关,上传asp一句话,抓包,修改后缀名为.cer
就可以绕过。


上传成功

菜刀连接得到shell
pass-21(IIS6.0解析漏洞(二))
1.asp;.jpg
1.asp/2.txt 1.asp是文件夹 2.txt是一句话 会将2.txt当作.asp
文件来执行
都会当作asp进行解析
本关采用;
对后缀名进行截断
上传


pass-22(IIS6.0解析漏洞(三))
1.asp/2.txt 1.asp是文件夹 2.txt是一句话 会将2.txt当作.asp
文件来执行
需要配合:后台使用,你有建立文件夹的权限
pass-23(CGI解析漏洞)
常见组合:Nginx + PHP
Nginx默认是以CGI的方式来支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设SCRIPT_FILENAME
。
当访问www.xx.com/phpinfo.jpg/1.php
这个URL时,$fastcgi_script_name
会被设置“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME
(绝对路径)传递给PHP CGI,如果开启了cgi.fix_pathinfo
=1选项(这个默认值就是1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME
(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO
,所以就会phpinfo.jpg作为PHP文件来解析了.
也是一个逻辑问题,所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析
访问文件:1.jpg
解析根据:/.php

直接上传1.gif文件


Comments NOTHING