今天我们开始另一篇幅的内容,web文件上传相关的知识
当你的才华
还撑不起你的野心时
那你就应该静下心来学习
目录
文件上传
额外扩展知识
1.文件上传详细信息及绕过方法
菜刀种类
遗留思考题
文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。
文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。
这里需要特别说明的是上传漏洞的利用经常会使用WebShell,而WebShell的植入远不止文件上传这一种方式
任意文件上传漏洞简介
由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。
客户端检测一般在源文件里有专门检测文件上传的javascript代码,最常见的就是检测扩展名是否合法, 这种检测很容易被绕过,但本质还是在客户端检测,不能相信客户端的检测,因为这是可控的,真正有效的检测要放在服务端。
此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后缀后的这几类脚本。
· m 上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接自动运行;
· m 上传文件是WebShell时,攻击者可通过这些网页后门执行命令并控制服务器;
· m 上传文件是其他恶意脚本时,攻击者可直接执行脚本进行攻击;
· m 上传文件是恶意图片时,图片中可能包含了脚本,加载或者点击这些图片时脚本会悄无声息的执行;
· m 上传文件是伪装成正常后缀的恶意脚本时,攻击者可借助本地文件包含漏洞(Local File Include)执行该文件。如将bad.php文件改名为bad.doc上传到服务器,再通过PHP的include,include_once,require,require_once等函数包含执行。
此处造成恶意文件上传的原因主要有三种:
· m 文件上传时检查不严。一些应用在文件上传时根本没有进行文件格式检查,导致攻击者可以直接上传恶意文件。一些应用仅仅在客户端进行了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查,攻击者可以通过NC,Fiddler等断点上传工具轻松绕过客户端的检查。一些应用虽然在服务器端进行了黑名单检查,但是却可能忽略了大小写,如将.php改为.Php即可绕过检查;一些应用虽然在服务器端进行了白名单检查却忽略了%00截断符,如应用本来只允许上传jpg图片,那么可以构造文件名为xxx.php%00.jpg,其中%00为十六进制的0x00字符,.jpg骗过了应用的上传文件类型检测,但对于服务器来说,因为%00字符截断的关系,最终上传的文件变成了xxx.php。
· m 文件上传后修改文件名时处理不当。一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。如应用只能上传.doc文件时攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php。
· m 使用第三方插件时引入。好多应用都引用了带有文件上传功能的第三方插件,这些插件的文件上传功能实现上可能有漏洞,攻击者可通过这些漏洞进行文件上传攻击。如著名的博客平台WordPress就有丰富的插件,而这些插件中每年都会被挖掘出大量的文件上传漏
upload 1
此处代码省略不写
一个攻击流程示意图:
图上的解析攻击是什么意思?
解析攻击
主要是各web应用程序解析漏洞,直接解析或配合解析。还有服务端文件内容检测、文件扩展名(黑名单和白名单)以及路径检测等等
举例:Apache解析漏洞Test.php.XXX。
建议在单独配置的环境下进行测试,集成环境也行,不过可能会受影响,我测试的在集成环境下解析不了单独环境下就可以,可能是我配置问题。
Nginx 解析漏洞
任意文件名/任意文件名.php | 任意文件名%00.php。
比如原本文件名是test.jpg,可以添加为test.jpg/x.php。
IIS解析漏洞
2003+IIS 6.0
<%eval request(1)%>
当然也存在其它变种木马,如
Webshell:大马、小马
大马:代码量多,功能多
小马:代码量少,功能也少
例如:一句话木马 单引号可不加,只能接受php代码
eval($_GET[.a']);
//echo preg_replace("/test/e", $_POST[a], "jutst test");
//$data = $_GET['data'];
//echo "\$ret = strtolower(\"$data\");";
//eval("\$ret = strtolower(\"$data\");");
//echo $ret;
//systera($_POST[a]);
//exec($_POST[a], $array);
//var_dump($array);
//echo shell_exec($_POST[a]);
实例:DVWA 靶场
线上DVWA靶场链接,默认账号:admin 密码:password
http://43.247.91.228:81/login.php
DVWA 文件上传实战教程网上有很多,大家可自寻搜索
1.1文件以http协议上传,将以 POST 请求发送至 web 服务器
1.2web 服务器接收到请求后并同意后,用户与 web 服务器将建立连接,并传输数据
1.3上传文件,检验文件类型
1.3.1通过客户端端验证(javascript 扩展名检测)
- 用反向代理工具(如burp 之类)修改文件扩展名或禁用 js 绕过客户端端验证
1.3.2服务端验证Content-type (Mime type) (http request 包检测)
- 用反向代理工具(如burp 之类)进行 Content-type 伪造
1.3.3服务端验证绕过(扩展名检测)
1.3.3.1黑名单检测
- 找黑名单扩展名的漏网之鱼 - 比如上面就漏掉了 asa 和 cer 之类
- 可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类
- 特别文件名构造 - 比如发送的 http 包里把文件名改成 help.asp. 或 help.asp_(下划线为空格)
- IIS 或 nginx 文件名解析漏洞 - 比如 help.asp;.jpg 或 help.jpg/2.php
- 0x00 截断绕过 - 这个是基于一个组合逻辑漏洞造成的
- 双扩展名解析绕过攻击(1) - 基于 web 服务的解析逻辑
- 双扩展名解析绕过攻击(2) - 基于 web 服务的解析方式
- 危险解析绕过攻击 - 基于 web 服务的解析方式
1.3.3.2白名单检测
- 特别文件名构造 (同黑名单攻击第 3 条)
- IIS 或 nginx 文件名解析漏洞 (同黑名单攻击第 4 条)
- 0x00 截断绕过 (同黑名单攻击第 5 条)
1.3.3.3htaccess 文件攻击
- 在 PHP 安全没配置好的情况下,用自己的.htaccess 覆盖服务上原文件
1.3.4服务端验证绕过(文件完整性检测)
- 文件头检测
只校验了文件头和文件完整性
- 图像分辨率检测
在文件开始伪装图像大小数据
- 文件加载检测
用工具对文件空白数据区或注释区进行代码注入绕过
(图像仅能绕过渲染测试,而不能绕过二次渲染)
用恶意文件去攻击加载器本身
1.3.57.二次上传漏洞
最新的上传漏洞方法,主要是利用逻辑漏洞。程序代码只对第一次上传的文件进行验证,这样情况下第一次上传正常文件,第二次上传webshell,利用这个漏洞需要上传组件支持一次多文件上传。
1.3.6相互关系与组合情况
首先客户端端验证和服务端验证是相互独立的,所以分开绕过就行了
主要难点是在服务端验证的组合上
文件完整性检测已经包含文件头检测和图像大小及相关信息检测, 但不包含文件扩展名检测
它是以加载来作为检测的方式,比如用图像渲染函数去渲染一张图片
文件扩展名检测和文件头检测都是同级的,相互独立
所以如果是文件扩展名+文件头检测可以同时分开绕过
· 中国菜刀:基本都有后门,强烈不推荐使用
· cknife(C刀):一般
· 蚁剑:js开发,中国菜刀js版,推荐使用,github有
· 打开antsword.exe,选择antsword文件夹
· 冰蝎:自带加密,木马没有特征,极力推荐使用,github有
· 开山斧:由python开发,不支持数据库管理功能,推荐使用
· k8飞刀:推荐使用,工具多
· Xise
一句话连接菜刀的原理:
位运算木马:
";
$__ .= ("." ^ "~");
echo $__ . "
";
$__ .= ("/" ^ "`");
echo $__ . "
";
$__ .= ("|" ^ "/");
echo $__ . "
";
$__ .= ("{" ^ "/");
echo $__ . "
";
// ${$__}[!$_](${$__}[$_]);
// $_POST[0]$_POST[2]
// 0=assert&1=system('dir')
// eval属于php解 释 器 ,不属于函数
?>
echo是为了显示位运算结果,并不是木马本身的代码,结果如下:
_
_P
_PO
_POS
_POST
[Finished in 1.0s]
网上流传比较老,过狗的一种思路(就是上上张图片我们上传的代码图片),如下
$_POST[0] [!$_]->[!1]->[0] (${$__}[$_])->($_POST[1])
?>
打开中国菜刀,输入网站的地址加路径然后密码连接:
什么时候用大马?什么时候用小马?什么时候用过狗马?
PS:大家可以想想,答案会在下一篇文章揭晓
参考文章链接:
http://www.h3c.com/cn/d_201408/839582_30008_0.htm
我不需要自由,只想背着她的梦
一步步向前走,她给的永远不重