我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
文章目录
一、文件上传过程详解
1、文件上传过程:5步
- 第一步:客户端选择发送的文件
- 第二步:服务器接收
- 第三步:网站程序判断
- 第四步:生产临时文件
- 第五步:移动到指定的路径
2、客户端上传表单:upload.html
<html>
<head></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /><br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
3、服务器接收资源的脚本程序:upload.php
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
4、文件上传错误代码:5类值
-
值:0; 表示:没有错误发生,文件上传成功。
-
值:1; 表示:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
-
值:2; 表示:上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
-
值:3; 表示:文件只有部分被上传。
-
值:4; 表示:没有文件被上传。
5、网站文件常见的扩展名:asp/php/........
asp
asa
cdx
cer
php
aspx
ashx
jsp
php3
php.a
shtml
phtml
//过滤的时候可以传入这种格式:aspasp、phpphp、Asp、PhP等等
二、文件上传绕过姿势
造成漏洞的原因和绕过姿势
(1)程序代码和系统缺陷:未作任何的限制
文件可以直接上传可执行脚本:moon.php
(2)前端 js脚本验证绕过姿势:
法一:保存页面,修改html
法二:抓包改包
法三:浏览器禁止js文件运行
(3)扩展名黑名单过滤不全:穷举后缀名
扩展名黑名单含义:指定的后缀名是禁止上传的,一般穷举后缀即可绕过
(4)扩展名穷举字典:
php
php1
php2
php3
php4
php5
pht
phtml
html
htm
PhP
PhP1
PhP2
PhP3
PhP4
PhP5
PhT
Phtml
HTML
HTM
php.
php
php::$DATA
php. .
php .
php ..
php.
phphpp
PhPhPP
asp
asa
cdx
cer
aspx
ashx
jsp
php3
php.a
shtml
phtml
ASP
ASA
CDX
CER
PHP
ASPX
ASHX
JSP
PHP3
PHP.A
SHTML
PHTML
Asp
Asa
Cdx
Cer
Php
Aspx
Ashx
Jsp
Php3
Php.a
Shtml
Phtml
(5)扩展名白名单含义:就是允许上传文件后缀,如jpg png gif 等其他图片格式
(6)content-type文件类型的检测:抓包修改文件类型即可
(7)文件头检测:修改文件头或制作图片一句话
JPEG (jpg) 文件头:FFD8FF
PNG (png) 文件头:89504E47
GIF (gif) 文件头:47494638
TIFF (tif) 文件头:49492A00
Windows Bitmap (bmp) 文件头:424D
制作图片一句话:copy test.gif/b+moon.php shell.php
(8)文件名可控且后缀名不可控:
- IIS6.0文件解析漏洞:
漏洞情形:文件名可控,但文件后缀只能是jpg,可利用iis6.0漏洞。
moon.asp;.jpg,可上传,可解析。
moon.asp;jpg,虽不能上传,但是可以解析。
分析:(moon.asp;.jsp)(文件名是moon.asp;)(后缀名是.jpg)(其中文件名的分号,相当于一个注释符号)
- IIS6.0目录解析漏洞:
漏洞情形:上传文件夹为*.asp,只要上传文件到这个文件夹里,后台就会把任何文件当作asp解析执行
注意:IIS6.0 默认的可执行文件除了asp还包含这三种 *.asa *.cer *.cdx
(9)%00截断的应用场景:
场景一:直接截断文件名。
场景二:创建目录可控时,%00截断创建目录,同时利用IIS6.0解析漏洞 上传文件到这个目录里面,即可让任何文件都被当作asp脚本所解析执行。
场景三:截断参数,生成文件。
(10)程序逻辑出错场景:
场景一:双文件上传
场景一:空格文件上传
(11)部署环境出错:
apache开启重写模块:LoadModule rewrite_module modules/mod_rewrite.so
重写解析文件:.htaccess
.htaccess文件内容:
<FilesMatch "qwsn">
SetHandler application/x-httpd-php
</FilesMatch>
// 一旦文件名匹配到了qwsn四个字符,就被当作php解析执行
(12)nginx解析漏洞:Nginx1.4.6
-
原理:
Nginx
拿到文件路径(更专业的说法是URI)/1.jpg/*.php
后,一看后缀是.php
,便认为该文件是php
文件,转交给php
去处理。php
一看/1.jpg/*.php
不存在,便删去最后的/*.php
,又看/1.jpg
存在,便把/1.jpg
当成要执行的文件了,又因为后缀为.jpg
,php
认为这不是php
文件,于是返回Access denied
。
这其中涉及到php
的一个选项:cgi.fix_pathinfo
,该值默认为1
,表示开启。开启这一选项PHP
可以对文件路径
进行修理
。
举个例子,当php遇到文件路径/1.jpg/2.txt/3.php
时,若/1.jpg/2.txt/3.php
不存在,则会去掉最后的/3.php
,然后判断/1.jpg/2.txt
是否存在,若存在,则把/1.jpg/2.txt
当做文件/1.jpg/2.txt/3.php
,若/1.jpg/2.txt
仍不存在,则继续去掉/2.txt
,以此类推。 -
利用姿势:
姿势1:1.jpg/1.php
姿势2:1.jpg%00.php
姿势3:1.jpg/%20\0.php
(13)IIS7.0/7.5/nginx的配置错误: 1.jpg/*.php
-
原理:
IIS7.5 IIS7.0
的漏洞与nginx
的类似,都是由于php
配置文件中,开启了cgi.fix_pathinfo
,而这并不是nginx
或者IIS7.0 | 7.5
本身的漏洞。 -
环境要求:cgi.fix_pathinfo = 1
-
IIS服务器解析漏洞处理过程:当IIS服务器遇到文件路径/1.jpg/test.php时,若/1.jpg/test.php不存在,则会去掉最后的/test.php,然后判断/1.jpg是否存在,该目录下/1.jpg存在,由于服务器配置不当,造成了服务器把1.jpg当做了php脚本执行了。
(14)系统特性:
- 上传文件名a.php:.jpg的时候 会在目录下生成a.php的空白文件
- php+window+iis:利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:
双引号" = 点号.
大于符号> = 问号?
小于符号< = 星号*
文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名
写入filename.<<<
(15) NTFS交换数据流:
形式一::$DATA 创建文件
形式二:::$DATA 创建和写入文件
(16)补充:
window系统里面会把文件名的最后一个点自动去掉 :如上传moon.php.
最后还是会变成moon.php