这篇文章有点旧了,看了喜欢的可以看看,主要是博客更新麻烦,通常我在有道云上做笔记。
http://note.youdao.com/noteshare?id=3a2e27d0d1005f9a8d9f218e523eda6d&sub=7627628443FD46D7975A7381BA71AFC8
1.
前端代码
2.
逻辑绕过
3.
文件内容检测
4.
文件包含、文件备份
5.网站后台
6.
容器及语言特性
7.
畸形报文
8.
系统特性
9.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
),我们可以在文件之中添加一些相应文件的标识,如下表;
类型
|
标识
|
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.gif
,
PHP
代码拿到的文件名是
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.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
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
特殊字符:
当我们上传一个文件的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
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