标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-718] 作者: ecawen 发表于: [2017-09-26]
本文共 [1004] 位读者顶过
1.前端代码 2.逻辑绕过 3.文件内容检测 4.文件包含、文件备份 5.容器及语言特性 6.畸形报文 4.文件包含、文件备份 8.SQLI方面
上传文件时WAF检测点: 1)请求的url,url是否合法 2)Boundary边界,通过Boundary边界确定内容来检测内容 3)MIME类型,即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),我们可以在文件之中添加一些相应文件的标识,如下表;
或是使用windows下的copy命令来将.php文件内容附加到正常的.png文件,合成后的文件后缀名根据情况修改。 ![]()
4.文件包含、文件备份 假如网站存在文件包含漏洞,可利用文件包含 来包含任意文件,如包含png文件解析一句话木马。 有的网站存在文件备份,数据库备份等一些可以利用的功能,如将.doc文件备份为.php文件,这些都是需要细心注意的。
5.容器及语言特性
PHP 版本 <5.3.4 据说是因为PHP沿用了C语言空字符截断的特性,官方认为这不是一个漏洞,但最后还是修改了。截断漏洞的发生是有条件的。 首先需要知道,在代码层面,假如“文件名不分离”,截断是无法作用的。比如,filename=hack.php%00.gif,PHP代码拿到的文件名是hack.php。但是,有的程序员可能会写下 $_FILES[ 'uploaded' ]['name' ].'png'之类的代码导,也不检查文件名,就导致漏洞的发生。 假如不是在代码层面上检测上传的文件名,这个检测者 WAF 拿到的文件名就是hack.php%00.gif,它认为%00是正常字符串,然后漏洞就发生了。 最后一点,在使用截断%00时需要urlencode 一下。
PHP CGI解析漏洞: IIS7.0/7.5 Nginx < 0.8.3 以上的容器版本中默认php配置文件cgi.fix_pathinfo=1时,上传一个存在于白名单的扩展 名文件shell.jpg,在请求时以shell.jpg/shell.php请求,会将shell.jpg以php来解析。 Apache解析漏洞(Apache1.x 2.x) 文件名解析漏洞,遇到不认识的后缀类型会忽略并继续向前寻找后缀来解析,比如a.php.gif或a.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
6.畸形报文
WAF对报文格式过于信任,没有处理这类问题,可能导致被绕过。
5.1Multi 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
正常的upload请求都是以上这样,然而这个格式也并非强制性的,在IIS6.0下如果我们换一种书写方式,把filename放在其他地方:
边界多了两横杠导致,边界匹配不成功
Win2k3 + IIS6.0 + ASP
基于构造长文件名,需要文件被重命名。
特殊的长文件名,文件名使用非字母数字,比如中文等最大程度的拉长,不行的话再结合一下其他的特性
进行测试:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王
王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王
王王王王王王王王王王王王王王王王王王王王王王.jpg
5.3 文件覆盖
php环境下, 开发者没有意识到一个请求包可能包含“两个文件”,开发者虽然对前面一个进行了十分严格的检测,但是最后一个文件可以覆盖掉前面的文件。如前面文件为 image/gif . xx.gjf
,但后面跟了一个 image/gif xx.php,最终保存的只是后面一个。
下面是一个请求包的示例。
在畸形报文方面,大家应该天马行空地想象,大胆尝试。
7系统特性
Windows特殊字符:
当我们上传一个文件的filename为shell.php{%80-%99}时:
waf可能识别为.php{%80-%99},就会导致被绕过。
Win2k8+ IIS7.0 + PHP
NTFS ADS特性:
ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求
正文的filename匹配不当的话可能会导致绕过。
Windows在创建文件时,在文件名末尾不管加多少点都会自动去除,那么上传时filename 可以这么写shell.php......也可以这么写shell.php::$DATA.......。
Win2k8+ IIS7.0 + PHP ![]()
8.SQLI方面 SQLI漏洞利用 用SQLI漏洞直接写入文件,需要满足四个条件,要求高 1)写的权限,通常为 dba权限方可 2)单引号或双引号没有被过滤,因为文件名必须要用它们括起来 3)知道网站在服务器中的绝对路径 4)文件名不能重复,不算条件的条件 例如:select0xaaaa into outfile “/var/www/html/shell.php” 遇到一些网站虽然有写的权限,但是由于写入的文件名必须要带单引号或是双引号(无法用十六进制的方式),导致无法写入,这也是蛋疼的地方。本人暂时不知道有没有什么办法绕过。
phpmyadmin 假如发现并进入phpmyadmin后台,也可以尝试拿shell,不过还是要知道网站的据对路径信息。 1)利用SQL执行来写入一句话到网站后台中。 ![]()
2)通过日志来GetShell 选择变量功能 ![]() 结合前段时间的学习并知识文章ID716所写。 |