漏洞挖掘技巧篇1-文件上传
漏洞挖掘技巧系列的主要内容为搜集,总结和归纳自己所遇,所见的一些关于 src 中的一些奇淫技巧.
同时也给大家推荐一个关于 SRC 技巧的项目,地址: https://github.com/Wh0ale/SRC-experience,
希望大家天天挖到高危!
0x00正文
0x01 压缩包上传解压路径猜测技巧
很多 cms
的后台中都允许模板或者主题类的压缩包上传,并且大多数情况下这个功能点都能成为我们 Getshell
的入口点.不过有时候上传成功后并不会显示解压后的文件地址,这时候就需要我们去猜测路径.
上传压缩包的时候,有些文件解压后可能出现双重目录名的情况.比如我们上传的压缩文件为 1.zip
, 里面有个 2.txt
.这种情况可以去猜测路径为 1/1/2.txt
.
(忘记截图了,抱歉)
0x02一些绕过
0x02-1
我们在头像处上传发现没有办法上传除了jpg以外的图片,我们可以尝试在–后面多加入一个-如下图。(由于是比较敏感的项目,不公开了具体细节之放一张细节图并且打上厚码)并成功解析
来源:深夜笔记本
0x03 Windows后缀绕过(基本)
0x03-1 空格绕过
服务器为Windows平台,在对用户上传的文件名进行处理时,没有使用trim()函数去除字符串收尾处的空白字符。
利用方式:用户上传图片马时,用Burp拦截,在文件尾部加入空格。例如:xxx.jpg空格
。带有空格的后缀可以绕过黑名单的检测,而文件存在在Windows服务器上,会自动去除后缀中的空格。
0x03-2 点绕过
Windows平台,服务端没有使用deldot()删除文件名末尾的点。
利用方式:上传名为 assert.php.
的文件。在Windows服务器中,后缀名之后的点,在保存时,会被自动忽略。
0x03-3 ::$DATA 绕过
原理: 在 Window系统
中,如果文件名 + "::$DATA"
会把 ::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持 ::$DATA
之前的文件名,他的目的就是不检查后缀名.
利用方式: 如果后台对上传的文件做了后缀名黑名单限制,假如后缀黑名单为: .php .php3
, 则我们可以通过上传 1.php::$DATA
绕过黑名单,成功上传,而系统中保存的文件名却是 1.php
.
0x03-4 / \ 符号利用
在文件名中使用 /
或 \
会忽略 \
或 /
前的名字.比如上传的文件名为 1.png/1.php
,实际上使用 $_FILE['NAME']['name']
获取到的文件名为 1.php
. \
也同理.
0x04 解析漏洞
0x04-1 IIS 解析漏洞
version 6.0
;
截断
在IIS 6.0版本中,;
号的功能类似于%00
截断,例如我们上传一个恶意脚本yijuhua.asp;.jpg
,文件后缀为jpg,
可以绕过服务器检测,当我们访问这个文件时,分号后面的内容会被截断,就相当于我们访问的是yijuhua.asp
。
- 文件夹 命名为
xxx.asp
如果一个目录以 xxx.asp
的格式命名,那么该目录下的所有类型的文件都会被当作 asp
文件来解析执行.
很明显普通用户不会创建类似于 xxx.asp
目录,这时候我们就可以自己想办法创建.在上面 Windows
特性中还有一点没有提到, 上传文件名使用 xxx.php::$INDEX_ALLOCATION
其实会创建一个以 xxx.php
为文件名的文件夹,如果我们将其改为 xxx.jsp::$INDEX_ALLOCATION
就可以创建一个以 .jsp
为后缀目录名,接下来想办法将图片传入到这个文件夹下就好了.
version 7.5
原理: 当 IIS 7.5
在 Fast-CGI
运行模式下时,如果服务器开启了 cgi.fix_pathinfo
功能,且去掉了php-cgi.exe
程序的 Invoke handler only if request is mapped to
勾选。那么当访问的文件路径不存在时,会对路径进行修剪。
例如: test.jpg
是我们上传的图片马,直接访问 /test.jpg
无法被php解析。
但是利用路径修剪功能,我们可以访问 /webshell.jpg/.php
,服务器发现为 .php
后缀,便交给php解析。
php发现无法访问该路径后,便会对路径进行修剪,最终解析的是test.jpg文件。
0x04-2 Apache 解析漏洞
原理: Apache
认为,一个文件可以有多个后缀,如:werner.txt.png.mp3
。这一文件,放在 Windows
里,毫无疑问,就是个mp3
文件,Windows
只认最后一个 .
及其后面的字符 mp3
,觉得该文件后缀为 .mp3
,这也是大多数操作系统、应用软件的处理方式、是正常人习惯。
而在Apache中,则可能有所不同,如果有必要,Apache会从后(右)往前(左),一一辨别后缀。何时有必要?当Apache不认识某个后缀时,便有必要。如某文件名为:werner.mp3.html.qwe.arex
,Apache
在处理时,先读取最后一个后缀,为.arex
,一看,这啥玩意啊,不认识,继续读取下一个后缀 .qwe
,一看,呀,这又是啥,还是不认识,继续读下一个后缀 .html
,一看,哦,这是个超文本标记语言文件,俗称网页文件,这回认识了,也就不继续读下一个后缀了。若是所有后缀都看完了没有一个认识怎么办?此时就会把该文件当做默认类型进行处理了,一般来说,默认类型是 text/plain
。据说在Apache
的配置文件中搜索DefaultType
就能看到默认类型的明确定义了,但我却不知为何,没有找到。
哪些后缀 Apache
认识,哪些不认识?有一个名为 mime.types
的文件,其中记录着 Apache
认识的后缀。在 Ubuntu
下,该文件位于 /etc/mime.types
,在 Windows
下,该文件位于 C:/apache/conf/mime.types(类似这样的,注意Apache的安装路径)
利用: 因此,我们可以上传类似于 1.php.xxx
的文件绕过 Apache
的解析.
.htaccess
.htaccess
是 Apache
的又一特色。一般来说,配置文件的作用范围都是全局的,但 Apache
提供了一种很方便的、可作用于当前目录及其子目录的配置文件——.htaccess(分布式配置文件)。
要想使.htaccess文件生效,需要两个条件,一是在Apache的配置文件中写上:
AllowOverride All
二是Apache要加载mod_Rewrite模块。加载该模块,需要在Apache的配置文件中写上:
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
.htaccess
文件可以配置很多事情,如是否开启站点的图片缓存、自定义错误页面、自定义默认文档、设置WWW域名重定向、设置网页重定向、设置图片防盗链和访问权限控制。
但我们这里只关心 .htaccess
文件的一个作用——MIME类型修改。如在 .htaccess
文件中写入:
AddType application/x-httpd-php xxx
就成功地使该.htaccess
文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件。另一种写法是:
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
0x04-3 Nginx 解析漏洞
该漏洞与nginx
、php
版本无关,属于用户配置不当造成的解析漏洞
原理: 由于nginx.conf
的如下配置导致nginx
把以.php
结尾的文件交给fastcgi
处理,为此可以构造http://ip/uploadfiles/test.png/.php
(url结尾不一定是.php
,任何服务器端不存在的php文件均可,比如a.php
),其中test.png
是我们上传的包含PHP代码的照片文件。
配置
server {
listen 80;
server_name test.local;
access_log /work/www/logs/test.access.log main;
error_log /work/www/logs/test.error.log;
location / {
root /work/www/test;
index index.html index.htm index.php;
}
location ~ \.php$ {
root /work/www/test;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fpm.sock;
}
}
但是,在php-fpm.conf
配置文件中的security.limit_extensions
配置项限制了fastcgi
要解析的文件类型(如果该选项未开启,默认只解析.php
)
cgi.fix_pathinfo
该选项位于配置文件php.ini
中,默认值为1
,表示开启。当php
遇到文件路径/test.png/x.php
时,若/test.png/x.php
不存在,则会去掉最后的/x.php
,然后判断/test.png
是否存在,若存在,则把/test.png
当做文件/test.png/x.php
解析,如若test.png
还不存在如果在其前面还有后缀,继续前面的步骤,以此类推。若是关闭该选项,访问/test.jpg/x.php
只会返回找不到文件。
security.limit_extensions
在我的配置文件中,它位于/etc/php-fpm.d/www.conf
中
这个选项开始是被注释了的也就是默认只允许执行php文件,可以在后面添加其它后缀,比如
security.limit_extensions .jpg .php
像这样添加 .jpg
之后,.jpg
文件也能以php
格式来执行
修改了后需要 service php-fpm restart
重启php