赞
踩
作者:永不落的梦想
作者主页:传送
座右铭:过去属于死神,未来属于自己
本文专栏:Web漏洞篇
今日鸡汤:成功是由日复一日的点滴努力汇聚而成的
目录
将客户端数据以文件形式封装,通过网络协议发生到服务端,文件在服务端被解析,最终作为真实文件保存在服务端硬盘上;
①服务器配置不当
②文件上传限制被绕过
③开源编辑器的上传漏洞
④文件解析漏洞导致文件执行
攻击者通过上传恶意文件传递给解释器执行,进而可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理、命令执行等恶意操作,甚至控制网站、服务器;这个恶意文件称为WebShell;
①图片上传功能
②头像上传功能
③文档上传功能
①客户端JavaScript检测
②服务端MIME类型检测
③服务端目录路径检测
④服务端文件扩展名检测
⑥服务端文件内容检测
原理
通常在上传页面含有专门检测文件上传的JavaScript代码,最常见的就是检测文件类型和文件扩展名是否合法;
绕过
①在本地浏览器客户端禁用JS即可(火狐浏览器的插件Javascript Switcher专门用于禁用JS);
②修改前端JS代码;
③使用合法的文件扩展名通过前端验证再用bp抓包将文件扩展名改非法的扩展名,如上传xx.jpg使用bp改为xx.php;
常见MIME类型
.html文件 | text/html |
.txt文件 | text/plain |
.php文件 | application/octer-stream |
.jpg文件 | image/jpg |
.png文件 | image/png |
.gif文件 | image/gif |
原理
检测文件上传中http请求包的Content-Type字段的值判断上传的文件是否合法;
绕过
使用bp抓包修改http请求包中的Content-Type字段的值为合法MIME类型;
原理
根据上传文件的后缀是否在一个包含非法后缀的黑名单中判断文件上传是否合法(在则非法);
绕过
①后缀大小写绕过:一般未对后缀名统一小写或大写处理,可通过后缀大小写绕过,如.PhP可绕过仅对.php的检测;
②空格绕过:未对后缀名去空格处理,可利用windows文件名特性通过空格绕过,如.php (注意:这有个空格)可绕过对.php的检测(需在bp中加空格);
③点绕过:未对后缀名去 . 处理,利用windows文件名特性可绕过检测,如.php.可绕过对.php的检测(需在bp中加点);
④::$DATA绕过:未对后缀名去::$DATA处理,利用windows文件系统特性可绕过检测,如.php::$DATA可绕过对.php的检测(需在bp中加::$DATA);
⑤Apache解析漏洞:Apache解析文件名从右往左识别,直到识别到可用的后缀名,利用Apache这一解析特性可绕过检测,如.php.hah可绕过对.php的检测并且会被当作.php文件解析;
⑥.htaccess文件:.htaccess文件是当前目录的分布式配置文件,可上传自定义的.htaccess文件改变解析文件的配置,如修改配置把.jpg文件当作.php文件解析,这时上传的.jpg合法文件会被当作非法的.php文件执行;
- //.htaccess文件内容如下,可把.jpg/.png文件当作.php文件执行
- AddHandler application/x-httpd-php .jpg .png
⑦.user.ini文件:.user.ini可配置执行.php文件时自动包含指定文件,如上传配置为包含.jpg文件的.user.ini文件后,访问index.php时将自动包含.jpg文件(版本php>5.3);
- //.user.ini文件内容如下在执行.php文件时可自动包含3.jpg文件
- auto_prepend_file=3.jpg
⑧特殊后缀绕过:.php3/.phtml/.phps/.php5/.pht等后缀名绕过;
⑩双写绕过:服务器将检测到的非法后缀替换为空且只替换了一次,可以双写后缀名绕过,如.pphphp经服务器处理后为.php;
原理
只有当上传文件的后缀名在一个包含合法后缀的白名单中时,文件上传是合法的、能通过检测;
绕过
①%00截断:服务器解析文件后缀时是从右往左的,而解析文件名时是从左往右的,当文件名中包含%00时,可将通过检测的合法后缀截断并暴露出隐藏在文件名中的非法后缀,从而绕过检测实现非法文件的上传,如上传的文件hello.php%00.jpg能通过检测并在被截断后当作hello.php文件上传(版本php<5.3.4);
②0x00截断:原理与%00截断一致,区别是%00截断是针对文件名在url(即get请求)中的绕过,而0x00截断针对文件名在请求体(即post请求)中的绕过,需注意的是0x00截断并非直接加0x00,而是要加空格并将空格对应的20编码改为00(在bp中操作);
eldot($s)
删除字符串$s末尾的点,直到字符串末尾不是点为止;
in_array(a,b,true)
判断a值是否在数组b中,true表示需要比较类型,默认为false;
intval(a,b)
把a当作b进制数返回对应十进制整数,转换失败返回0,b=0时自动检测进制数,如intval(“0x12”,0)返回18,intval(“44”,3)返回0,intval(s),将字符串s转换为十进制整数,如intval(“123abs”)返回123;
strrchr(a,b)
返回字符串a从最后一个字符b处起后面的子串,b为单个字符或字符串的首个字符或ASCLL码对应的单个字符;
strtolower(s)
字符串s变小写并返回;
strrpos(a,b,c)
返回子串b在字符串a中最后一次出现的位置,c指定从字符串a的c位置开始匹配,默认为0即从头开始;strpos返回首次出现的位置,strripos返回最后一次出现的位置并且匹配时不区分大小写,i表示不区分大小写;
str_ireplace(a,b,c,d)
用b替换c中的a,d限定最大替换次数;
strstr(a,b,c)
返回a中首个b出现的位置起后面的子串,c为true时返回前面部分;
substr(a,b,c)
返回字符串a的第b+1个字符起c长度的子串;
trim(s)
去除s首位空白字符并返回;
原理
通过检测上传文件内容开始处的文件幻数来判断文件是否合法,通常根据文件的前十个字节即可确定文件类型;
绕过
①在文件内容开头写文本GIF89a即可绕过对文件幻数的检测;
②制作图片马绕过,使用命令copy 1.jpg/b + 2.php/a 3.jpg可将1.jpg文件和2.php文件合成图片马3.jpg文件;
原理
检测文件内容的代码判断是否合法;
绕过
使用JS格式替换php格式的一句话木马;
- 检测到非法:<?php @eval($_POST['cmd']);?>
- 可替换为:<script language="php">eval($_POST['cmd'];<?script>
原理
包含恶意代码的图片被重新生成(渲染),导致代码失效无法执行;
绕过
代码注入绕过:将经过渲染的上传图片与未渲染的图片对比(使用工具winhex),找出渲染前后未发生改变的地方插入恶意代码,即在不破坏文件渲染的情况下找一空白区(一般是图片的注释区)进行代码填充,这样既能保证文件完整也能上传恶意代码文件;
原理
文件上传后服务器对文件进行非法检测,若合法保留文件,否则删除文件;
绕过
上传非法文件后,在文件被删除前访问该文件执行恶意代码,可在服务器生成一个websell文件,通过新的webshell文件攻击服务器;
- //上传的非法文件内容如下,可新生成一个webshell文件
- <?php fputs(fopen('test.php','w'),'<?php @eval($_POST['cmd']);?>');?>
Apache解析文件后缀从右往左识别,直到识别到可用的后缀名,利用这一特性可绕过文件后缀名黑名单检测,如hello.php.ttt文件被解析为hello.php文件
目录解析
服务器默认会把.asp目录下的文件都解析为.asp文件,如xx.asp/xx.jpg中xx.jpg会被解析为xx.asp文件;
文件解析
服务器默认不解析;号后的内容,如xx.asp;.jpg会被解析为xx.asp文件;
在任意文件名后加/任意文件名.php可被解析为.php文件,如hello.jpg加/xx.php后可被解析为.php文件
在任意文件名后加/任意文件名.php(或加%00.php)可被解析为.php文件,如hello.jpg加/xx.php(或加%00.php)后可被解析为.php文件;
①自己在phpstudy上搭建upload-labs靶场,搭建过程在我的专栏——环境搭建篇,靶场源码可在我的资源下载或在GitHub上下载;
②直接使用在线靶场,如buuctf等许多平台都有在线靶场;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。