前端代码
逻辑绕过
文件内容检测
文件包含、文件备份
容器及语言特性
畸形报文
系统特性
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)上传后的文件名是否被修改了
主要是通过前端的JavaScript进行过滤,可以十分简单地绕过。如正常发包,之后抓包修改。
逻辑不严谨,过滤不严谨,导致被绕过
采用黑名单,简单地过滤了“php”,但通过大小写的方式可以绕过WAF;或是替换了php等关键字符,通过双写 pphphp 即可绕过,这种简单的过滤方式可以通过上传之后查看文件名来判断。
没有过滤.htacess文件上传。这时可以借助.htaccess文件来上传恶意代码并解析。如:上传一个.htaccess文件,内容为AddTypeapplication/x-httpd-php .jpg,上传的jpg文件就可以当作php来解析
SetHandler application/x-httpd-php
这个时候就上传一个文件名字是pino,这个时候我们上传一个文件名字叫做pino的文件,不要后缀名,然后里面是一句话木马,用菜刀连接,可以成功!
主要是代码的逻辑漏洞,用户上传一次文件后,网站系统就设置允许用户下一次的上传,不再对用户的上传文件进行检测,这个比较奇葩。
通过检测文件内容是否含有正常文件的一些关键字符
是否含有恶意代码
检测文件的大小,如果文件太小了或是太大了都可能上传失败。可以添加一些无用的字符来增加文件的大小。
针对(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文件,合成后的文件后缀名根据情况修改。
copy 1.jpg/b+2.php/a 1.jpg
假如网站存在文件包含漏洞,可利用文件包含 来包含任意文件,如包含png文件解析一句话木马。
有的网站存在文件备份,数据库备份等一些可以利用的功能,如将.doc文件备份为.php文件,这些都是需要细心注意的。
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 一下。
文件名解析漏洞,遇到不认识的后缀类型会忽略并继续向前寻找后缀来解析,比如a.php.gif或a.php.aaa
PHP CGI解析漏洞
在默认Fast-CGI开启状况下,访问以下网址,服务器将把xx.jpg文件当做php解析并执行。
http://www.xxx.com/xx.jpg/.php
http://www.xxx.com/a.jpg\0.php
WAF对报文格式过于信任,没有处理这类问题,可能导致被绕过。
在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个
Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过。
Content-Disposition: form-data; name=“file1”;filename=“shell.asp”
Content-Type: application/octet-stream
正常的upload请求都是以上这样,然而这个格式也并非强制性的,在IIS6.0下如果我们换一种书写方式,把filename放在其他地方:
2. 插入特殊字符
一个空格导致安全狗被绕过:
Win + IIS6.0 + ASP
边界多了两横杠导致,边界匹配不成功
Win2k3 + IIS6.0 + ASP
数据过长导致的绕过:
waf如果对Content-Disposition长度处理的不够好的话可能会导致绕过,例如:
基于构造长文件名,需要文件被重命名。
特殊的长文件名,文件名使用非字母数字,比如中文等最大程度的拉长,不行的话再结合一下其他的特性进行测试:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
php环境下, 开发者没有意识到一个请求包可能包含“两个文件”,开发者虽然对前面一个进行了十分严格的检测,但是最后一个文件可以覆盖掉前面的文件。如前面文件为 image/gif . xx.gjf,但后面跟了一个 image/gif xx.php,最终保存的只是后面一个。
下面是一个请求包的示例。
在畸形报文方面,大家应该天马行空地想象,大胆尝试。
Windows特殊字符:
当我们上传一个文件的filename为shell.php{%80-%99}时:
waf可能识别为.php{%80-%99},就会导致被绕过。
Win+ IIS7.0 + PHP
ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过。
Windows在创建文件时,在文件名末尾不管加多少点都会自动去除,那么上传时filename可以这么写shell.php…也可以这么写shell.php::$DATA…。
SQLI漏洞利用
用SQLI漏洞直接写入文件,需要满足四个条件,要求高
写的权限,通常为 dba权限方可
单引号或双引号没有被过滤,因为文件名必须要用它们括起来
知道网站在服务器中的绝对路径
文件名不能重复,不算条件的条件
例如:select0xaaaa into outfile “/var/www/html/shell.php”
遇到一些网站虽然有写的权限,但是由于写入的文件名必须要带单引号或是双引号(无法用十六进制的方式),导致无法写入,这也是蛋疼的地方。本人暂时不知道有没有什么办法绕过。
假如发现并进入phpmyadmin后台,也可以尝试拿shell,不过还是要知道网站的据对路径信息。
如果网站的my.ini文件中没有包含“secure_file_priv=
”这句话,就会提示如下错误信息。
如果提示写入失败可以尝试其他目录,多试试,名字为uploads等的目录能够被写的可能性更高。
2)通过日志来GetShell
选择变量功能
搜索关键字 log 找到,下面两个东西,将"generallog"编辑为“ON”,且修改 “general log file”位置为网站的绝对路径
之后在“SQL”执行功能中输入一句话并执行就OK了,log将记录这一句话。
有时木马上传会被waf查杀,但waf查杀木马需要时间。所以如果上传的文件命令是生成一个新的木马时,则可能绕过
具体做法是:
文件上传后马上访问此文件,使得在未被查杀前生成一个新的木马,新的木马不在检测范围之内,于是成功绕过
博客内容转自:https://mp.weixin.qq.com/s?__biz=MzU1MzE3Njg2Mw==&mid=2247483678&idx=1&sn=3be9bad41fd1b0f405f8323073ce415b&chksm=fbf79b6ecc801278abcfb113a2bbf02d97f8a04645cffa7ab3a98e05de38101132a14dfce38e&mpshare=1&scene=23&srcid=0403E5T7waRwwBC04A9sExdv#rd
服务器配置不当
重新配置好服务器。
服务器PUT方法配置不当可参见HTTP请求方法(PUT)。
开源编辑器上传漏洞
若新版编辑器已修复漏洞,请更新编辑器版本。
本地文件上传限制被绕过
在服务器后端对上传的文件进行过滤。
过滤不严或被绕过
建议使用白名单的方法对文件进行过滤。
文件解析漏洞导致文件执行
升级web服务器版本或安装相应的官方补丁。
文件路径截断
使用随机数改写文件名和文件路径,不要使用用户定义的文件名和文件路径。
除了以上的方法之外,还可将被上传的文件限制在某一路径下,并在文件上传目录禁止脚本解析。