这篇文章有点旧了,看了喜欢的可以看看,主要是博客更新麻烦,通常我在有道云上做笔记。
http://note.youdao.com/noteshare?id=3a2e27d0d1005f9a8d9f218e523eda6d&sub=7627628443FD46D7975A7381BA71AFC8
1.前端代码
2.逻辑绕过
3.文件内容检测
4.文件包含、文件备份
5.网站后台
6.容器及语言特性
7.畸形报文
8.系统特性
9.SQLI方面
 
上传文件时WAF检测点:
1)请求的urlurl是否合法
2Boundary边界,通过Boundary边界确定内容来检测内容
3MIME类型,即content-type
4)文件扩展名
5)文件内容
 
文件上传后导致的常见安全问题一般有:
1)上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。
2)上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似);
3)上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。
4)上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
本文重点是web层面的web shell
 
需要注意的要点:
1)上传后的路径在哪里
2)上传后的文件名是否被修改了
 
有些地方可能内容有些重复,请自行琢磨。
1.前端代码
主要是通过前端的JavaScript进行过滤,可以十分简单地绕过。如正常发包,之后抓包修改。
 
 
2.逻辑绕过
2.1MIME检测
后台代码通过检测客户端请求报文中的Content-Type字段来判断文件类型.,可以先上传正常文件再修改文件内容与文件名进行绕过。
各类文件的mime类型,百度即可,此处不列举。
2.2文件后缀检测
逻辑不严谨,过滤不严谨,导致被绕过
1) 采用黑名单,简单地过滤了“php”,但通过大小写的方式可以绕过WAF;或是替换了php等关键字符,通过双写pphphp 即可绕过,这种简单的过滤方式可以通过上传之后查看文件名来判断。
2) 没有过滤.htacess文件上传。这时可以借助.htaccess文件来上传恶意代码并解析。如:上传一个.htaccess文件,内容为AddTypeapplication/x-httpd-php .jpg,上传的jpg文件就可以当作php来解析
文件上传类型总结
 文件上传类型总结
文件上传类型总结
文件上传类型总结
文件上传类型总结
3) 没有过滤掉可以被解析的.asa.cdx.cer等,所以还应该使用白名单来防御。
2.3二次上传
主要是代码的逻辑漏洞,用户上传一次文件后,网站系统就设置允许用户下一次的上传,不再对用户的上传文件进行检测,这个比较奇葩。
3文件内容检测
1)通过检测文件内容是否含有正常文件的一些关键字符
2)是否含有恶意代码
3)检测文件的大小,如果文件太小了或是太大了都可能上传失败。可以添加一些无用的字符来增加文件的大小。
针对(1),我们可以在文件之中添加一些相应文件的标识,如下表;
类型
标识
JPEG
头标识ff d8 ,结束标识ff d9
.PNG
头标识89 50 4E 47 0D 0A 1A 0A
GIF
头标识(6 bytes) 47 49 46 38 39(37) 61 GIF89(7)a
.BMP
头标识(2 bytes) 42 4D BM
或是使用windows下的copy命令来将.php文件内容附加到正常的.png文件,合成后的文件后缀名根据情况修改。
文件上传类型总结
 
 文件上传类型总结
4.文件包含
假如网站存在文件包含漏洞,可利用文件包含 来包含任意文件,如包含png文件解析一句话木马。

5.网站后台
1)有的网站存在文件备份,数据库备份等一些可以利用的功能,如将.doc文件备份为.php文件,这些都是需要细心注意的。
2)后台可能存在,可以修改PHP配置文件,网站标题等功能。也可以在这些地方尝试。一般是通过查找对应CMS,找到相应的修改方式。没有源代码的话就靠猜测,但是搞不好要写崩后台。
 
6.容器及语言特性
 
 PHP   版本 <5.3.4
据说是因为PHP沿用了C语言空字符截断的特性,官方认为这不是一个漏洞,但最后还是修改了。截断漏洞的发生是有条件的。
首先需要知道,在代码层面,假如文件名不分离,截断是无法作用的。比如,filename=hack.php%00.gifPHP代码拿到的文件名是hack.php。但是,有的程序员可能会写下  $_FILES[ 'uploaded' ][ 'name' ].'png'之类的代码,也不检查文件名,就导致漏洞的发生。
假如不是在代码层面上检测上传的文件名,这个检测者 WAF 拿到的文件名就是 hack.php%00.gif,它认为%00是正常字符串,然后漏洞就发生了。
最后一点,在使用截断%00时需要urlencode一下。
 
 PHP CGI解析漏洞:
IIS 7.0/7.5     Nginx < 0.8.3
以上的容器版本中默认php配置文件cgi.fix_pathinfo=1时,上传一个存在于白名单的扩展
名文件shell.jpg,在请求时以shell.jpg/shell.php请求,会将shell.jpgphp来解析。
 Apache解析漏洞(Apache1.x 2.x
文件名解析漏洞,遇到不认识的后缀类型会忽略并继续向前寻找后缀来解析,比如a.php.gifa.php.aaa.
 IIS 6.0
1)目录名,包含 .asp .asa .cer,则该目录下的文件都将被解析为.asp文件
文件上传类型总结
文件上传类型总结 
2)文件名中,分号本身以及后面的都会被系统忽略 a.asp;.gif
文件上传类型总结
文件上传类型总结 
3)文件名,文件后缀名字中为 .asp .asa .cer之一,都会被解析为 .asp文件
文件上传类型总结
文件上传类型总结 
 Nginx 
1)版本 0.5.* | 0.6.* | 0.7 - 0.7.65 |  0.8 - 0.8.37
利用0截断,如shell.png%00.php
2)版本 0.8.41-1.5.6
利用0截断,如shell.png%20%00.php
 
7.畸形报文
WAF对报文格式过于信任,没有处理这类问题,可能导致被绕过。
5.1 Multi Content-Disposition
IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个
Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过。
 
Win2k8 + IIS7.0 + PHP
文件上传类型总结
 文件上传类型总结
 
5.2请求正文格式问题
1)顺序
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
IIS6.0下将请求正文顺序稍作变换,把filename放在其他地方:
文件上传类型总结
 文件上传类型总结
2)插入特殊字符
 一个空格导致安全狗被绕过:
Win2k3 + IIS6.0 + ASP
文件上传类型总结
 文件上传类型总结
边界多了两横杠导致,边界匹配不成功
Win2k3 + IIS6.0 + ASP
文件上传类型总结
 文件上传类型总结
3)长度
数据过长导致的绕过:
waf如果对Content-Disposition长度处理的不够好的话可能会导致绕过,例如:
文件上传类型总结
 
 文件上传类型总结
基于构造长文件名,需要文件被重命名。
文件上传类型总结
 
 文件上传类型总结
文件上传类型总结
 文件上传类型总结

 
5.3 文件覆盖
php环境下, 开发者没有意识到一个请求包可能包含“两个文件”,开发者虽然对前面一个进行了十分严格的检测,但是最后一个文件可以覆盖掉前面的文件。如前面文件为 image/gif . xx.gjf
,但后面跟了一个  image/gif   xx.php,最终保存的只是后面一个。
下面是一个请求包的示例。
文件上传类型总结
 文件上传类型总结
在畸形报文方面,大家应该天马行空地想象,大胆尝试。
8系统特性
 Windows特殊字符:
当我们上传一个文件的filenameshell.php{%80-%99}时:
waf可能识别为.php{%80-%99},就会导致被绕过。
Win2k8 + IIS7.0 + PHP
文件上传类型总结
 文件上传类型总结
 
 NTFS ADS特性:
ADSNTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求
正文的filename匹配不当的话可能会导致绕过。
 
文件上传类型总结
 文件上传类型总结
Windows在创建文件时,在文件名末尾不管加多少点都会自动去除,那么上传时filename
可以这么写shell.php......也可以这么写shell.php::$DATA.......
 
Win2k8 + IIS7.0 + PHP
文件上传类型总结
 文件上传类型总结
 
 
 
9.SQLI方面
 SQLI漏洞利用
SQLI漏洞直接写入文件,需要满足四个条件,要求高
1)写的权限,通常为 dba权限方可
2)单引号或双引号没有被过滤,因为文件名必须要用它们括起来
3)知道网站在服务器中的绝对路径
4)文件名不能重复,不算条件的条件
例如:select 0xaaaa into outfile  “/var/www/html/shell.php”
遇到一些网站虽然有写的权限,但是由于写入的文件名必须要带单引号或是双引号(无法用十六进制的方式),导致无法写入,这也是蛋疼的地方。本人暂时不知道有没有什么办法绕过。
 
 phpmyadmin
假如发现并进入phpmyadmin后台,也可以尝试拿shell,不过还是要知道网站的据对路径信息。
1)利用SQL执行来写入一句话到网站后台中。
文件上传类型总结
 文件上传类型总结
如果网站的my.ini文件中没有包含secure_file_priv=这句话,就会提示如下错误信息。
文件上传类型总结
 
 文件上传类型总结
文件上传类型总结
 文件上传类型总结
如果提示写入失败可以尝试其他目录,多试试,名字为uploads等的目录能够被写的可能性更高。
2)通过日志来Get Shell
选择变量功能
文件上传类型总结
 文件上传类型总结
搜索关键字 log 找到,下面两个东西,将"general log"编辑为“ON”,且修改“general log file”位置为网站的绝对路径
文件上传类型总结
 文件上传类型总结
 
之后在“SQL”执行功能中输入一句话并执行就OK了,log将记录这一句话。
文件上传类型总结
 
 
 文件上传类型总结
 
结合前段时间的学习并下面文章所写。
参考
我的WafBypass之道(upload篇)https://xianzhi.aliyun.com/forum/read/458.html
 
 
 
 
 
 

相关文章: