精华内容
下载资源
问答
  • 文件上传利用
    千次阅读
    2022-01-22 19:15:21

    前言

    收集了几个在文件上传利用中常见的函数。
    对这些函数的深入理解应该有助于文件上传利用的顺利进行。

    索引

    1. deldot
    2. in_array
    3. intval
    4. strrchr
    5. strtolower
    6. strrpos
    7. str_ireplace
    8. strstr
    9. substr
    10. trim

    常见函数

    1. deldot

    deldot函数为upload-lab中一个常见的函数,它实际为一个自定义函数,定义于common.php中,函数定义如下:

    function deldot($s){
    	for($i = strlen($s)-1;$i>0;$i--){
    		$c = substr($s,$i,1);
    		if($i == strlen($s)-1 and $c != '.'){
    			return $s;
    		}
    
    		if($c != '.'){
    			return substr($s,0,$i+1);
    		}
    	}
    }
    

    即从字符串的尾部开始,从后向前删除点.,直到该字符串的末尾字符不是.为止。
    因此对于如下输入,

    echo deldot("hello world")."\n";
    echo deldot("hello world.")."\n";
    echo deldot("hello world....")."\n";
    echo deldot("hello.world.")."\n";
    

    输出为

    hello world
    hello world
    hello world
    hello.world

    2. in_array

    in_array(mixed $needle, array $haystack, bool $strict = false): bool
    

    其中第一个参数$needle为待搜索的值,$haystack为被搜索的数组,第三个参数决定是否进行类型比较。

    第三个类型默认为false,即不考虑类型是否相同。
    对于如下输入:

    if(in_array("AAA",$arr,false)) echo 1;
    if(in_array("aaa",$arr,false)) echo 2;
    if(in_array("AAA",$arr,true)) echo 3;
    if(in_array("aaa",$arr,true)) echo 4;
    

    输出

    13

    3. intval

    intval(mixed $value, int $base = 10): int
    

    intval 函数用于获取变量的整数值。

    第一个参数$value为要获取整数值的变量,可以为字符串、数值和数组。
    第二个参数$base指定了转换所使用的进制,当且仅当要转换的变量为字符串时有效。

    当第二个参数为0时,会检测变量的格式来决定使用的转换进制。

    • 当存在前置的0x0X时,使用16进制。
    • 当存在前置的0时,使用8进制。
    • 否则使用10进制。

    intval函数返回的数值为一个int类型的数值。当转换不成功时,返回0。

    特别要注意,使用该函数返回的值有上限。当转换的数值大于php的整数范围时,返回的结果为整型数值的取值上限。

    echo intval("111");
    echo "\n";
    echo intval("111a");
    echo "\n";
    echo intval("0x333");
    echo "\n";
    echo intval("888",8);
    echo "\n";
    echo intval("122",3);
    echo "\n";
    echo intval("11111111111111111111111111111111111");
    echo "\n";
    echo intval("2222222222222222222222222222222");
    

    输出为

    111
    111
    0
    0
    17
    9223372036854775807
    9223372036854775807

    4. strrchr

    strrchr(string $haystack, mixed $needle): string
    

    strrchr函数在字符串$haystack中查找$needle,并将最后一次查找到的$needle及其后面的字符串返回。如果没有在该字符串中查找到$needle,则返回false

    注:

    • 如果第二个参数不是不是单个字符,则只使用该字符串的第一个字符进行查找匹配。
    • 如果第二个参数是一个数值,则将该数值转换为对应的ASCII码进行匹配。
    $S = "hhhahahaha2333";
    echo strrchr($S,'h')."\n";
    echo strrchr($S,'hwweraer')."\n";
    echo strrchr($S,104)."\n";
    if(strrchr($S,'k') == false) echo "false";
    

    ha2333
    ha2333
    ha2333
    false

    5. strtolower

    strtolower(string $string): string
    

    将字符串$string中的各个英文字符转换为小写并返回。

    $S = "HaHaHaHa,Hello!!";
    echo strtolower($S);
    

    hahahaha,hello!!

    6. strrpos

    strrpos(string $haystack, string $needle, int $offset = 0): int
    

    返回字符$needle最后一次出现的位置。
    在php4中,$needle只能为单个字符。如果$needle中存在多个字符,仅使用第一个字符做匹配。
    strrchr相似,如果$needle是一个数值,则使用该数值对应的ASCII码字符进行匹配。
    从php5开始,$needle可以为多个字符。
    从php5开始,strrpos新增一个参数$offset,可以指定从$haystack的哪儿位置开始进行匹配。

    返回匹配的下标位置,没有匹配到时返回false

    注意:

    • 因为返回值可能为零,所以在判断返回值是否为false的时候必须使用全等于符号===
    • 该函数区分大小写。与该函数相似的函数有:
      • stripos:查找首个出现的位置,不区分大小写。
      • strpos:查找首个出现的位置,区分大小写。
      • strripos:查找最后一个出现的位置,不区分大小写。
      • 即出现“i”则为不区分大小写,出现"rr"则为查找最后一个。
    $s = "Phpphphpphpp";
    echo strrpos($s,"php");
    echo strrpos($s,"h");
    echo strrpos($s,"P");
    if(strrpos($s,"PHP") === false) echo "No exist";
    

    输出:

    890No exist

    注:测试使用的PHP版本为5.3.3。
    在PHP4中结果可能不一样。

    7. str_ireplace

    str_ireplace(
        mixed $search,
        mixed $replace,
        mixed $subject,
        int &$count = ?
    ): mixed
    

    str_ireplace函数用于对数组中的元素或字符串中的子串进行替换。

    第一个参数$search为需要替换的内容(子串或数组),第二个参数$replace为替换成的内容(字符串或数组),第三个参数$subject为被替换的字符串。

    • 如果$search$replace都为字符串,那么将会把$subject中匹配的子串$search替换为$replace
    • 如果$search$replace都为数组时,将会进行映射替换。如果$replace的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。
    • 如果$search为数组而$replace为字符串,则对于$subject中出现的每一个search的元素,都会使用$replace做替换。

    $count可以用于限定替换次数。

    注:

    • 替换从左到右进行。
    • 该函数替换不区分字母大小写。(另外一个函数str_replace区分大小写)
    <?php
    echo str_ireplace("php","","hello.php")."\n";
    echo str_ireplace("pHP","","hello.Php")."\n";
    echo str_ireplace("php","","hello.phPHpp")."\n";
    echo str_ireplace("php","p","hello.phphp")."\n";
    echo str_ireplace("php",""."phpphpphpphpphp.php",3)."\n";
    echo str_ireplace(array("php","html"),"","hello.php.html")."\n";
    echo str_ireplace(array("php","html"),array("1","2"),"hello.php.html")."\n";
    echo str_ireplace(array("php","html","css"),array("1","2"),"hello.php.css.html")."\n";
    echo str_ireplace(array("php","html","css"),"1","hello.php.css.html")."\n";
    foreach (str_ireplace(array("php","html","css"),array("1","2","3"),array("hello.html","hello.css","hello.html")) as $it){
    	echo "$it ";
    }
    ?>
    

    hello.
    hello.
    hello.Hpp
    hello.php
    3
    hello…
    hello.1.2
    hello.1…2
    hello.1.1.1
    hello.2 hello.3 hello.2

    8. strstr

    strstr(string $haystack, mixed $needle, bool $before_needle = false): string
    

    查找字符串$needle$haystack中首次出现的位置,并将$needle及其之后的字符串返回。

    PHP5起新增第三个参数$before_needle,如果$before_needle取值为true,则返回$needle前面的部分。

    $s = "123phpphp.php";
    echo strstr($s,"php")."\n";
    echo strstr($s,"php",true)."\n";
    

    phpphp.php
    123

    9. substr

    substr(string $string, int $offset, ?int $length = null): string
    

    返回字符串$string中的子串。

    $offset指定子串首个字符在$string中的下标位置,$length指定截取的子串长度。

    $length的取值:

    • $length为默认取值时,函数会将$offset$length的字符串截取并返回。
    • $length取正数时,会从$offset开始将最多$length个字符截取返回出来。
    • $length取0时,返回一个空字符串。
    • $length取负数时,会将$offset至字符串$string倒数第$length前的字符返回出来。
    $s = "123456789";
    echo substr($s,1,3)."\n";
    echo substr($s,1,-1)."\n";
    echo substr($s,1)."\n";
    echo substr($s,1,0)."\n";
    

    234
    2345678
    23456789

    10. trim

    trim(string $str, string $character_mask = " \t\n\r\0\x0B"): string
    

    去除字符串$str的首尾的空白字符。
    当第二个参数保持默认时,去除的字符为:

    • " " 空格
    • “\t” 制表符
    • “\n” 换行符
    • “\r” 回车符
    • “\0” 空字节符
    • “\x0B” 垂直制表符
    $s = "\n   1   23456789\t\n123456789\r";
    echo trim($s);
    

    1 23456789
    123456789


    参考资料

    PHP官方

    注意:本文只做技术分享,请勿用于非法用途,否则后果作者概不负责。

    原创不易,感谢支持。

    更多相关内容
  • 详细 | 文件上传利用总结

    千次阅读 2022-01-15 19:23:46
    文件上传利用总结

    目录

    客户端检查

    服务端后缀黑名单

    上传特殊可解析后缀

    上传.htaccess

    上传.user.ini

    配合解析漏洞

    利用NTFS ADS特性

    其他

    服务器后缀白名单

    检查内容

    文件头检查

    MIME

    getimagesize()、exif_imagetype()函数检查

    二次渲染

    条件竞争

    绕过WAF

    云WAF

    构造畸形的数据包,“打乱”waf的检测

    上传成功后寻找返回路径

    其他一些情况

    技术交流


    目录

    客户端检查

    服务端后缀黑名单

    上传特殊可解析后缀

    上传.htaccess

    上传.user.ini

    配合解析漏洞

    利用NTFS ADS特性

    其他

    服务器后缀白名单

    检查内容

    文件头检查

    MIME

    getimagesize()、exif_imagetype()函数检查

    二次渲染

    条件竞争

    绕过WAF

    云WAF

    构造畸形的数据包,“打乱”waf的检测

    上传成功后寻找返回路径

    其他一些情况


    找到上传点,先初步判断一下做了什么防御手段:

    客户端检查

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

    服务端后缀黑名单

    上传特殊可解析后缀

    asp|asa|cer|cdx
    
    aspx|ascx|ashx|asax|asac
    
    php|php2|php3|php4|php5|asis|htaccess|.user.ini|phtm|phtml、pht(是否解析需要根据配置文件中设置类型来决定)
    
    jsp|jspx|jspf
    
    htm|html|shtml|pwml|js
    
    vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini

    上传.htaccess

    .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置。

     .htaccess 文件生效前提条件为:

    mod_rewrite 模块开启

    AllowOverride All

    上传.user.ini

    原理:

    1、.user.ini 有点像.htaccess,php运行时,会检索加载所有目录下的.ini配置文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。

    2、.user.ini是一个能被动态加载的ini文件,这点和php.ini不同。也就是说修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

    利用:

    上传.user.ini:

    auto_prepend_file=1.gif       # 要访问的文件加载之前加载,

    或者

    auto_append_file=1.gif # 要访问的文件加载之后加载

    上传一个包含webshell代码的1.gif:

    GIF98A <?php eval($_REQUEST['a']);?>

    访问本目录下任意文件附带参数?a=xxx 就可以实现命令执行

    ?a=phpinfo(); ?a=system('whoami');

    配合解析漏洞

    IIS:

    目录解析漏洞(/test.asp/1.jps)

    文件名解析漏洞(test.asp;.jpg)

    畸形解析漏洞(test.jpg/*.php)

    Nginx:

    畸形解析漏洞(test.jpg/*.php)

    %00空字节代码解析漏洞

    CVE-2013-4547(%20%00)

    Apache:

    文件名解析漏洞(test.php.owf.xdx)

    详细参考:文件解析漏洞总结(IIS,APACHE,NGINX) - yokan - 博客园

    利用NTFS ADS特性

    其他

    点绕过、空格绕过、后缀双写绕过、后缀大小写绕过、%00绕过、0x00绕过

    GET:

    shell.php%00.jpg

    POST:

    (hex里面改)

    shell.php%20%00.jpg
    
    shell.php.
    
    shell.php. .

    服务器后缀白名单

    00截断、MIME、点、空格、点空格点、::$DATA

    shell.php::$DATA

    shell.php

    shell.php.

    shell.php. .

    GET:

    shell.php%00.jpg

    POST:

    (hex里面改)

    shell.php%20%00.jpg

    检查内容

    文件头检查

    木马文件中插入 允许上传的文件类型的文件头。

    如gif

    1.php

    GIF98A <?php eval($_REQUEST['a']);?>

    MIME

    正常上传木马文件,burp抓包修改 Content-Type:image/jpg 等

    getimagesize()、exif_imagetype()函数检查

    生成图片马:

    制作方法:

    copy 1.jpg/b + 1.php/a 2.jpg      b表示二进制文件  a表示ASCII文件

    也可以使用edjpgcom.exe工具

    然后结合文件包含漏洞利用

    二次渲染

    (1)上传gif图片:先将普通的gif图片上传,会被渲染,渲染之后再下载下来,与原git图片对比,找到渲染前后没有变化的位置,然后在这些位置插入php一句话,再上传即可。

    (2)上传jpg、png图片:这两种格式图片的二次渲染绕过要难很多很多:png(索引类型图,写入 PLTE 数据块或写入IDAT数据块),jpg(成功性不大),具体参考   https://xz.aliyun.com/t/2657#toc-3

    技巧点:在目标网站渲染的过的图片再修改,修改后的再传两次

    条件竞争

    由于代码逻辑问题,其先将我们上传的图片保存,然后再进行处理,删除原图片,因此我们可以利用条件竞争,在我们上传的图片马被删除之前触发它。

    方法:

    利用burp不断发包,不断触发

    1.php

    <?php fputs(fopen(‘a.php’,’w’),‘<?php eval($_POST[cmd])?>’); ?>

    绕过WAF

    云WAF

    通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制

    例如

    传shell时发现存在某云WAF,需进一步绕过

    通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制

    构造畸形的数据包,“打乱”waf的检测

    WAF如何拦截:

    文件名:

    解析文件名,判断是否在黑名单内

    文件内容

    解析文件内容,判断是否为webshell

    目前,市面上常见的是解析文件名,少数WAF是解析文件内容,比如长亭。下面内容,都是基于文件名解析。

    绕过:

    获取文件名的地方在Content-Disposition: form-data; name="file_x"; filename="xx.php"Content-Type里,所以绕过的地方也就在这两个地方了。

    1、去掉引号

    2、双引号变单引号

    3、多加一个引号

    4、大小写

    对这三个固定的字符串进行大小写转换

    比如name转换成Name,Content-Disposition转换成content-disposition。

    5、空格

    在: ; =添加1个或者多个空格,不过测试只有filename在=前面添加空格,上传失败。

    在filename=后面添加空格上传成功

    6、去掉或修改Content-Disposition值

    有的WAF在解析的时候,认为Content-Disposition值一定是form-data,造成绕过。

    7、删掉content-type

    同上

    8、交换name和filename的顺序

    规定Content-Disposition必须在最前面,所以只能交换name和filename的顺序。

    有的WAF可能会匹配name在前面,filename在后面,所以下面姿势会导致Bypass:

    Content-Disposition: form-data; filename="xx.php"; name=file_x

    9、多个boundary

    最后上传的文件是test.php而非test.txt,但是取的文件名只取了第一个就会被Bypass。

    10、多个filename

    最终上传成功的文件名是test.php。但是由于解析文件名时,会解析到第一个。正则默认都会匹配到第一个。

    11、多个分号

    文件解析时,可能解析不到文件名,导致绕过。

    12、header头,Content-Type :  multipart/form-DATA

    这种绕过应该很少,大多数都会忽略大小写。php和java都支持。

    13、header头在boundary前添加任意字符

    php支持,java不支持

    14、filename换行

    filen

    ame="hhh

    .

    p

    hp"

    15、filename文件名添加单引号(‘)分号(;)等

    filename==”hh' h.php”

    filename=”hh;h.php”

    16、filename==或者filename===绕过

    17、name 和filename之间添加任意字符或者是大量字符

    18、form-data用+拼接

    19、Content-Disposition:*

    20、filename="1.jpg .Php"类似这种的各种尝试

    上传成功后寻找返回路径

    正常情况下,在返回包中可以找到文件上传路径,如果未返回路径或找不到,可以尝试以下方法:

    1、

    刷新, f12  network/浏览器history搜索shell名字,或点击下载文件可能就知道了路径或相似路径。有些时候改名字的wordpress插件,编辑器等等,就可以通过这种方式发现

    2、

    返回了一些参数但不包括路径的情况,比如file_id 等等,那么文件路径可能存储在数据库中,可以结合sql注入 sqlmap的--search -C参数找到字段和值

    3、

    什么都没返回的情况,只返回了ok,true等等。重新加载,抓包看响应,或许某个接口的响应就包括对应的路径。

    比如头像位置上传上去了,但是没有返回路径,那么想办法让他在加载一遍,比如退出重新登陆,一个包一个包的放。可能有些包的响应中就包含路径。

         另外可能存在其他服务器、或者其他站点的其他路径,也是抓包查看,看一下加载过程的路径在哪或者看一下html、js

    4、

    只返回了文件名,没有路径

    一种是fuzz,看其他同类型文件的路径,f12或者如果有文件下载的地方,下载抓包,看文件地址。

    另一种是 尝试上传的时候目录穿越,一次一次尝试,看能否穿到站点根目录或者知道的目录下面。修改不如表单的其他参数、或者filename参数的值

    5、

    尝试访问日志文件,看能否发现一些敏感目录或上传目录

    比如泛微

    6、

    上传上去没有访问直接下载,当前文件夹没有执行权限

    这种情况,尝试目录穿越的方式,穿到其他目录下,比如根目录,来绕过限制

    ../->%C0%AE%C0%AE/

    /../      \..\

    其他一些情况

    1、当前上传接口无法绕过时,注意观察文件名,fuzz相似接口

    uploadImg.cspx

    uploadfile.cspx

    uploadtest.cspx

    upload_test.cspx

    upload_2018.php

    upload2019.php

    upload2020.jsp

    temp、test等等接口

    fck编辑器的漏洞就是这样的,

    例子:

    2、尝试修改表单其他字段,看是否会影响后缀,(参数的优先级)

    例子:

    测试中发现了一个上传点,但waf拦截jsp、html等后缀,更改后缀重放数据包会导致reset,如下:

    fileName和fileType参数可控,且当存在两个不同的后缀时,最上层的filename参数优先级为最高,可导致任意文件上传

    发现上传成功的jsp文件其回显的type类型为image/png类型

    删除最下层filename的Content-Type: image/png,文件上传类型即可被绕过

    技术交流

     关注微信公众号 Z20安全团队 , 回复 加群 ,拉你入群 一起讨论技术。

    展开全文
  • 用友NC任意文件上传漏洞利用工具,用友NC6.5的某个页面,存在任意文件上传漏洞。漏洞成因在于上传文件处未作类型限制,未经身份验证的攻击者可通过向目标系统发送特制数据包来利用此漏洞,成功利用此漏洞的远程攻击...
  • .htaccess文件上传利用

    千次阅读 2019-06-30 12:43:00
    一般.htaccess可以用来留后门和针对黑名单绕过 创建一个txt写入 ...上传.htaccess 必须是网站根路径 让png解析为php 2.留后门 可以在.htaccess 加入php解析规则 类似于把文件名包含1的解析成php <...

    一般.htaccess可以用来留后门和针对黑名单绕过

    创建一个txt写入

    AddType  application/x-httpd-php    .png

    打开另存为

    保存类型为所有文件

    上传.htaccess 必须是网站根路径 

    让png解析为php 

    2.留后门 可以在.htaccess 加入php解析规则

    类似于把文件名包含1的解析成php

    <FilesMatch "1">
    SetHandler application/x-httpd-php
    </FilesMatch>

    123456.png  就会以php执行

    转载于:https://www.cnblogs.com/feizianquan/p/11109390.html

    展开全文
  • BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。下面这篇文章主要给大家介绍了关于利用Blob进行文件上传的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
  • 文件上传漏洞及常见的利用方式

    千次阅读 2021-01-08 21:11:25
    文章目录概述“文件上传”漏洞与“WebShell”文件上传漏洞的原理“文件上传漏洞”被利用植入“WebShell”后的常见安全问题:上传检测流程概述上传服务器文件命名规则常见的检测方式“文件上传漏洞”-本地验证检测绕...

    概述

    “文件上传”功能是目前互联网应用当中最常见的功能,其功能本身是一个正常的业务需求。对于网站来说,很多时候也确实需要用户上传文件到服务器。比如在个人信息中上传头像、相册功能上传保存照片、类似贴吧留言板功能的上传图片附件、邮件发送附带附件、招聘网站上传简历之类的等等功能。

    既然“文件上传”这个功能本身没有问题,那么又是如何成为漏洞的呢?在什么条件下会成为漏洞?

    其实“文件上传”本身是没有问题,有问题的是上传文件后,服务器对“被上传的文件”的处理与解释文件。如果说服务器程序对用户上传的文件进行校验或过滤不严,处理逻辑做的不够安全,导致用户可以提交修改过后的数据(一般为webshell),从而导致非常严重的后果。

    “文件上传”漏洞与“WebShell”

    “文件上传漏洞”一般都是指代“上传WEB脚本能够被服务器解析”的问题,也就是常说的WebShell问题。

    当网络攻击者利用文件上传漏洞上传了一个可执行的文件到服务器并执行(上传的文件可以是木马,病毒,恶意脚本或者WebShell等),因“文件上传漏洞”的技术利用门槛低的原因,造就了攻击的直接、有效、易实施性,可以称得上没有什么技术门槛。

    大多数网络攻击者,在利用“文件上传漏洞”后,都会留下WebShell(网页后门)方便以后再次进入系统。

    需要说明的是“文件上传漏洞”的利用进场会使用到WebShell,但是WebShell的植入方式不仅仅只有“文件上传漏洞”这一种方式。

    “文件上传漏洞”可被利用的必要条件:

    • 上传的文件能够被WEB容器解释且执行,所以文件上传后的所在目录必须是WEB容器能够覆盖到的路径。
    • 用户能够通过WEB访问上传的文件,如果说脚本文件上传了,但是无法通过WEB进行访问或者说无法通过WEB容器解释该上传文件,这种情况不能说存在“文件上传漏洞”,因为无法被利用。
    • 用户上传的脚本文件被安全规则过滤、格式化、图片压缩等功能改变了其内容,导致WebShell失效,同样会让“文件上传漏洞”攻击不成功。

    分别用一句话概括就是:

    • WebShell上传成功,未被杀;
    • 知道WebShell的路径在哪;
    • 上传的WebShell能狗正常运行。

    文件上传漏洞的原理

    上文概述我们有解释,“文件上传”本身的功能是互联网应用当中最常见的功能。如用户头像上传,留言板图片上传,附件文档上传等。一些文件上传功能的实现时,代码没有进行严格限制用户上传的文件后缀以、文件类型或文件内容,导致允许攻击者向某个可通过Web访问的目录上传任意脚本文件,并能够将这些文件传递给WEB容器解释器,就可以在远程服务器上执行任意WebShell脚本。

    当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell等其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。根据具体漏洞及脚本的差异,此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后缀后的这几类脚本。

    一般情况下造成“文件上传漏洞”的主要原因有三种(包括但不限于):

    • 文件上传时检查不严。

      • 有一些网络应用在文件上传时根本没有进行文件格式检查及过滤,导致攻击者可以直接任意的上传恶意脚本文件。有一些网络应用仅仅在客户端进行了检查,这些在攻击者眼里几乎所有的客户端检查无限等同于没有检查,攻击者可以通过BurpSuite,Fiddler等断点上传工具即可轻松绕过客户端的检查。还有一些应用虽然在服务器端进行了黑名单过滤检查,但是却可能忽略了大小写,如将后缀“.php”改为“.Php”即可绕过检查;还有一些应用虽然在服务器端进行了白名单检查却忽略了“%00截断符”的作用,如应用本来只允许上传jpg图片,那么可以构造文件名为“xxx.php%00.jpg”,因为“%00”为十六进制的“0x00字符”,造成了“.jpg”被截断不会被读取,骗过了应用的上传文件类型检测,但对于服务器来说,因为“%00字符”截断的关系,最终上传的文件被解析成了“xxx.php”文件。
    • 文件上传后修改文件名时处理不当。

      • 有一些服务器端进行了完整的黑名单和白名单过滤的情况下,在修改已上传文件文件名上允许用户修改文件后缀。如已经过滤了用户只能上传“.jpg”文件时攻击者可以先将“.php”文件后缀修改为“.jpg”,成功上传后在修改文件名时将后缀改回“.php”文件。
    • 使用第三方插件时引入。

      • 很多应用在开发过程中都直接引用了带有文件上传功能的第三方插件,而这些插件的文件上传功能的实现上可能存在漏洞,攻击者可通过这些漏洞进行文件上传攻击。如著名的博客平台WordPress就有丰富的插件,而这些插件中每年都会被挖掘出大量的文件上传漏洞。

    “文件上传漏洞”被利用植入“WebShell”后的常见安全问题:

    • 上传文件是WebShell时,攻击者可通过这些网页后门执行命令并控制服务器;
    • 上传文件是钓鱼图片或者包含了脚本的图片时,图片中的脚本,在某些版本的浏览器上会被作为脚本执行,从而被利用于钓鱼或者欺诈;
    • 上传文件是其他恶意脚本时,攻击者可直接执行脚本进行攻击;
    • 上传文件是病毒或者木马文件时,用于诱骗普通用户或者管理员下载执行或者直接自动运行;

    上传检测流程概述

    一般情况下,一个文件以HTTP协议进行上床时,将以POST请求发送至WEB服务器,WEB服务器接收到请求并同意后,用户与WEB服务器将建立连接,并传输DATA。

    上传服务器文件命名规则

    • 上传文件名与服务器文件名一致(已经不多见了)
    • 上传文件名与服务器文件名不一致(一般采用随机数、时间戳、日期命名)

    常见的检测方式

    1. 客户端本地JavaScript检测(通常为检测文件扩展名,也不多见但不是绝对性的没有)
    2. 服务端MIME类型检测(检测Content-Type内容)
    3. 服务端目录路经检测(检测跟path参数相关的内容)
    4. 服务端文件扩展名检测(检测跟文件extention相关的内容)
    5. 服务端文件内容检测(检测内容是否合法或含有恶意代码)

    “文件上传漏洞”-本地验证检测绕过

    客户端本地JS绕过(Javascript检测)

    • 首先判断JS本地验证

      • 通常可以根据它的验证警告弹窗的速度可以判断,如果电脑运行比较快,可以使用BurpSuite抓包,在点击提交的时候BurpSuite没有抓到爆,那么就说明这个是本地JS验证
    • 绕过方法

      • 使用BurpSuite抓包改名
      • 使用firebug打开开发人员管理工具,直接删除本地验证的JS代码
      • 添加JS验证的白名单,比如将php格式添加进去

    客户端白名单绕过

    修改允许上传的文件类型(见上文)

    “文件上传漏洞”-服务端检测绕过

    服务端检测绕过(MIME类型检测)

    MEMI的作用:使客户的软件区分不同种类的数据,例如WEB浏览器就是通过MEIME类型来判断文件是否是GIF文件,还是可以打印的PostScript文件。

    WE B服务器使用MIME来说明发送数据的种类,WEB客户端使用MIME来说明希望接收到的数据种类。

    Tomcat的安装目录\conf\web.xml中就定义了大量MIME类型

    绕过方法:

    • 直接使用BurpSuite抓包,得到post上传的数据后,将"Content-Type:text/plain"改成"Content-Type:image/gif"
    • 即可成功绕过。

    服务端目录路经检测

    目录路经检测,即检测路经是否合法,但首位特殊一些的路经都没有防御。比如fckeditor php <= 2.6.4 任意文件上传漏洞。

    当POST请求的URL如下的时候"/fckeditor264/filemanager/connectors/php/connector?Command=FileUpload&Type=Image&CurrentFolder=abc.php%00.GIF HTTP/1.0"

    CurrentFolder这个变量的值回传到ServerMapFolder($resourceType,$folderPath,$sCommand)中的形参$folder里,而$folder在这个函数中并没有做任何检测,就被CombinePaths()了

    filepath路经修改绕过

    可以用来突破自动随机数时间戳命名规则

    当我们上传一个脚本文件的时候,如"xxx.gif"。可以通过改变文件上传后的路经,如"/x.asp/"(需要一定的创建权限,不一定真实创建);
    成功创建后为"x.asp/xxx.gif",也可以直接改变文件名称为"a.asp;.xxx.gif"进行绕过。

    绕过的原理就是在文件上传目录没有可执行权限的情况下改变上传路经进行突破。

    在这里插入图片描述

    1111

    1

    服务端文件扩展名检测

    黑名单检测

    黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多;
    一般情况下会有一个专门的blacklist文件,里面包含有常见的危险脚本文件,比如fckeditor 2.4.3之前版本的黑名单

    如何绕过黑名单

    1. 文件名大小写绕过
      • 用像AsP,PhP之类的文件名绕过黑名单检测
    2. 名单列表绕过
      • 用黑名单里没有的名单进行绕过攻击,比如黑名单没有 "asa"或者"cer"之类的文件名
    3. 特殊文件名绕过
      • 比如发送的HTTP包里把文件名改为"test.asp.“或者"test.asp_”(下划线为空格),这种命名方式在WIN系统使不被允许的,所以需要在BurpSuite之类里进行修改,然后绕过验证后,会被WIN系统自动去掉后面的点或者空格。需要注意的是Unix/Linux系统没有这种特性。
    4. 0x00截断绕过
      • 在扩展名检测目前貌似只遇到过asp的程序有这种漏洞,给个简单的伪代码 name = getname(http request)
      • 如果说这个时候获取到的文件名是"xxx.asp0x00.jpg"
      • type = gettype(name)
      • gettype()函数里处理方式是从后往前扫描扩展名,所以会被判断为jpg文件
    5. .htaccess文件攻击(这种绕过方式并不现实,有个前提条件就是需要.htaccess文件可被执行,具体参考下文的Apache解析漏洞)
    6. 解析调用/漏洞绕过
      • 这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞

    白名单册检测

    白名单相对于黑名单来说要安全一些,但也不是绝对的安全。

    如何绕过白名单

    1. 0x00截断绕过
      • 用像xxx.asp%00.jpg的方式进行截断,属于白名单文件,在利用服务端代码的检测逻辑进行漏洞利用攻击。
    2. 解析调用/漏洞绕过,这类漏洞直接配合上传一个代码注入过的白名单文件即可,在利用漏洞解析/调用。
    3. ".htaccess"文件攻击
      • 参照下文Apache解析漏洞

    服务端文件内容检测绕过

    如果文件内容检测设置的比较严格,那么文件上传攻击将变得很困难。可以说这是代码层检测的最后一道关卡。如果内容检测被突破了,就算没有代码层的漏洞,也会在利用应用层的解析漏洞提供非常便利的机会。

    绕过文件头检测

    • 主要是检测文件内容的开始处的文件头,比如图片类型的文件头如下

    • 要绕过jpg文件头检测就要在文件头写上下图中的值

    • Value = FF D8 FF E0 00 10 4A 46 49 46
      在这里插入图片描述

    • 要绕过gif文件头检测就要在文件头写上下图中的值

    • Value = 47 49 46 38 39 61

    • 要绕过png文件头检测就要在文件头写上下图中的值

    • Value = 89 50 4E 47

    文件相关信息检测

    图像文件相关信息检测通常用的是gettimagesize()函数,只需要把文件头部分伪造好就OK了,然后在文件头的基础上加上脚本信息,就如同下图结构。

    GIF89a (...some binary data for image...)<?php phpinfo();?> (skipping the rest of binary data)

    文件加载检测

    • 该类型的检测方式,可以称之为最变态的检测了。一般是调用API或函数去进行文件加载测试。常见的就是图像渲染测试,再变态一些的甚至是进行二次渲染(详见下文)对渲染/加载测试的攻击方式是代码注入绕过,对二次渲染的攻击方式是攻击文件加载器本身。
    • 这里简单说下对渲染/加载测试攻击-代码注入绕过,可以利用图像处理软件对一张图片进行代码注入,用"winhex"看数据分析
    • 原理是在不破坏文件本身的渲染的情况下找一个空白去进行代码填充,一般会是图片的注释区,对于渲染测试基本上可以绕过,因为文件器本身的文件结构是完整的

    绕过二次渲染

    • 攻击函数本身
    • 通过上传不完整的图片让其函数暴露,然后对其展开攻击
    • 第二种方法:对文件加载器进行溢出攻击

    表单提交按钮🔘

    • 写入表单<input type="submit" value="提交" name="submit">
    • 上传"xxx.asa"脚本文件

    “文件上传漏洞”-文件解析漏洞

    在文件上传漏洞的利用过程中,网络攻击者发现一些和Web Server本身特性相关的功能。这些往往是因为应用的开发人员没有深入理解Web Server的细节本身导致的。如果对此加以利用的话,这种弊端会成为网络攻击者的有力攻击手段。这就是我们要说的解析漏洞,解析漏洞主要说的是一些特殊文件被IIS、Apache、Nginx在一些特定情况下解释称脚本文件格式的漏洞。

    IIS文件解析漏洞

    IIS 5.x/6.0文件解析利用方法有两种

    目录解析(文件扩展名解析)

    当网站目录下建立的文件夹名称为“.asp”或者“.asp”时,其目录内的任何扩展名的文件都会被IIS服务器当作asp文件进行解析并被执行。

    举例:如果上传的脚本名称为“/xxx.asp/xxx.jpg”
    当上传的脚本名称如上述示例那样,这个时候WEB容器服务器就无法识别出被上传的是“/xxx.asp/xxx.jpg”文件还是“/xxx.asp”目录下的“xxx.jpg”文件。

    当网络攻击者可硬直上传文件夹的路径时,就可以不管上传后的脚本文件是否被改名都可以拿到Shell了。

    “;”分号文件解析

    前文我们有提到可以通过“0x00”字符阶段文件名的文件上传漏洞利用的方式,在IIS 6.0处理文件解析时,也曾经出过类似的漏洞,不过相比较“0x00”截断符,这里变成了“;”(分号)。

    当文件名为“xxx.asp;xxx.jpg”的时候,IIS 6.0会将文件解析为“xxx.asp”,文锦名被截断了,从而导致“xxx.asp”脚本被子执行。比如上main这个例子,IIS 6.0会执行“xxx.asp”,而不会管“xxx.jpg”。

    这里需要说明一下,这两个IIS的漏洞,需要在服务器的本地硬盘上确实存在这样的文件夹,如果知识通过WEB应用的URL映射出来的话,时无法触发文件上传漏洞的。

    同样的“;”分号文件解析也仅适用于上传的文件没有被过滤进行二次变更文件名的情况下,如果文件在上传之后被程序进行了重命名(程序在实现上传文件功能实现的时候,为了不会出现重复文件名的情况下会使用时间戳加随机字符对上传的文件进行二次重命名),也不会触发该文件上传漏洞。

    这些历史上存在的漏洞,也许今天还能在互联网上找到不少未修补漏洞的网站

    畸形文件名解析

    在一些特定的情况下,畸形的文案名也会被解析为可利用脚本

    举例:

    • “xxx.asa”
    • “xxx.cer”
    • “xxx.cdx”

    附:
    ".asa"后缀的脚本在 IIS 7.0/7.5 也是可以被解析的
    ".cer"后缀的脚本在 IIS 7.0有时候也是会被解析的,有时候则不可以

    PUT功能所导致的若干上传脚本问题

    PUT是WebDav中定义的一个方法。WevDav大大扩展了HTTP协议中的GET、POST、HEAD等功能,它所包含的PUT方法,允许用户上传文件到指定的文件路径下。

    在许多的WebServer中,默认是禁用了该方法的,或者对能够上传的文件做了严格限制。但是在IIS中,如果目录支持写入权限,同同时又开启了WebDav,则会支持PUT协议,再结合MOVE命令,就可以将原本情况的只允许上传文本文件改写为脚本文件来拿到WebShell。(这里需要注意的是“MOVE”是否能够执行,取决于IIS服务器)是否勾选了“脚本资源访问”的复选框。

    国内的安全研究学者zwell曾经写过一个针对PUT协议的自动化扫描工具“IIS PUT Scanner”,用以帮助检测此类问题。

    从PUT协议的攻击原理上来看,造成此方法的安全漏洞是管理员对服务器配置不当所造成的,所以说当管理员不了解安全的风险和细节的情况下,等于向网络攻击者敞开了大门。

    "PUT功能所导致的若干上传脚本问题"这段,在"道哥"所著的"白帽子讲WEB安全"一书中,有详细的讲解,有兴趣的话可以去看一看

    Apache文件解析漏洞

    Apache文件解析一般配合黑名单来使用(个人观点:黑名单是一种非常不好的设计思想)

    Apache文件解析特性:Apache是从后往前开始进行判断解析,如果不认识,就继续往前判断。
    比如"xxx.php.rar.ttt"这个脚本,因为Apache不认识"rar"、“ttt"所以会一直向前遍历,直到识别”.php",就会解析成"php"文件。

    网络攻击者一般会在测试的时候讲常见的后缀都写上,去测试是否是合法的后缀,不是别的后缀逐级向前识别。
    比如"xxx.php.asa.asp.aspx…"、“xxx.php.zzz.”

    Apache的这个特性,很多研发人员在写应用对应实现的功能时并不知道,即使知道,有的研发人员也会认为这是Web Server该负责的事情。但是如果不考虑这些因素,写出对应的安全检查功能,可能就会存在该缺陷。最终的结果就是用户上传的脚本被执行。

    .htaccess文件解析

    该文件解析漏洞需要拿到服务器权限之后才能更改,一般常用于留后门使用。

    如果说在Apache中 “.htaccess"可被执行,且可被上传,那么就可以尝试在”.htaccess"中写入:
    “<FilesMatch “xxx.jpx”>SetHandler aplication/x-httpd-php”
    然后再上传shell.jpg的木马,这样shell.jpg酒客解析为php文件

    Nginx文件解析漏洞

    Nginx文件解析漏洞是我国安全组织80sec发现的,其指出在Nginx配置Fast-CGI开启的状况下,会存在文件类型解析问题。

    其实严格意义来说,该文件解析漏洞与Nginx本身的关系并不大,Nginx知识作为一个代理将请求转发给Fast-CGI Server,然后PHP在后端处理。所以说在其他环境下的Fast-CGI,PHP同样存在这个问题,只是使用Nginx作为Web Server时,一般使用Fast-CGI的方式调用脚本解释器的方式最为常见。

    具体表现形似为:
    当上传一个"xxx.jpg"文件,内容为
    "<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>’);?>"的文件(引号内的内容),上传成功后访问 xxx.jpg/.php,则会在这个目录下生成一句话木马的 shell.php。

    在任何配置为Fast-CGI的PHP应用上传一张图片(可能是头像,也可能是上传的图片或者是附件等),其实图片内容是PHP文件,则将导致代码执行。其他可以上传的合法文件如文本文件、压缩文件等情况类似。

    出现该漏洞的原因与在"Fast-CGI方式下,PHP获取环境变量的方式"有关。
    PHP的配置文件中有一个关键的选项"cgi.fix_pathinfo",这个选项默认是开启的,状态如下:

    cgi.fix_pathinfo = 1
    

    这个功能原本是想解决"info.php/test"这种URL时,能够正确的解析到"info.php"上。

    PHP官方给出的建议是将 "cgi.fix_pathinfo"设置为0,但是可以预见的是,官方的这种消极态度会让许许多多的"不知情者"遭受重大的损失。

    Nginx < 8.03 空字节代码执行漏洞

    影响版本:0.5.,0.6.,0.7 <= 0.7.65,0.8 <= 0.8.37

    Nginx在图片中嵌入PHP代码然后访问

    执行方式:“xxx.jpg%00.php”,从而执行其中的脚本

    该原理是网络攻击者通过上传过程中的POST包,在文件名添加一个"%00"字节的方式,可以截断某些函数对文件名的判断。

    因为在许多函数中,比如C、PHP等语言的常用字符串处理函数时,“0x00"被认定为终止符。受此影响的环境的WEB应用和和一些服务器。
    比如原本的网络应用的上传功能只允许上传"xxx.jpg"文件,可以通过构造一个包含"0x00"截断的文件名(需要修改POST包),将其改为"xxx.php%00.jpg”,其中"%00"为十六进制的00字符,此时对于服务器来说,该脚本文件的因为"%00"截断的关系,最终会变成"xxx.php"

    "%00"字符截断的问题不只是在上传文件漏洞中有所利用,因为这是一个被广泛应用于字符串处理函数的保留字符,因此在各种不同的业务逻辑中都可能出现问题,该问题需要引起重视。
    
    展开全文
  • 利用Javabean+JSP 实现文件的上传、显示、下载 实现文件上传功能和下载功能,显示文件列表和读取文件内容功能。
  • 常见文件上传漏洞利用

    千次阅读 2019-11-10 17:22:59
    文件上传漏洞利用一、常见文件上传绕过方法1.javascript验证突破2.大小写突破3.服务器文件扩展名检测(不符合服务器端规定规则则不让上传)4.特殊后缀名绕过5.MIME类型6.文件内容检测7.图片马8.使用分布式配置9.文件...
  • 主要介绍了PHP利用APC模块实现文件上传进度条的方法,分析了APC模块的具体用法,并给出了相关配置说明,需要的朋友可以参考下
  • 主要介绍了Java利用MultipartFile实现上传多份文件的代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 文件上传之.htaccess文件利用

    千次阅读 2019-11-21 17:40:52
    首先我们先上传一个.htaccess文件文件内容如下 SetHandler application/x-httpd-php 这段内容的作用是使所有的文件都会被解析为php文件 上传成功之后我们准备上传木马 木马后缀名只要不是目标...
  • 文件上传漏洞利用与防御

    千次阅读 2022-03-17 00:42:28
    文件上传漏洞1 漏洞原理1.1 MIME1.1.1 MIME介绍1.1.2 MIME用法1.2 等价扩展名1.3 .htaccess2 靶场搭建2.1 webshell2.2 upload-labs2.2.1 下载2.2.2 部署3 漏洞发现与利用3.1 找到上传位置3.2 尝试绕过校验3.3 php...
  • 主要为大家详细介绍了jQuery利用FormData上传文件实现批量上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • WebLogic之Java反序列化漏洞利用实现二进制文件上传和命令执行
  • 主要给大家介绍了关于利用django如何解析用户上传的excel文件的相关资料,这是最近在工作中遇到的一个问题,觉着有必要分享出给大家,需要的朋友可以参考借鉴,下面来一起看看详细的介绍吧。
  • 依托psftp.exe工具进行文件上传,下载等操作。附件中还附加一个利用Java代码实现的文件上传下载操作,希望大家喜欢
  • 本篇文章主要介绍了springmvc利用jquery.form插件异步上传文件示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
  • 主要为大家详细介绍了php利用fsockopen GET/POST提交表单及上传文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • * * * * * * * * * * * * 目录页 文件上传漏洞利用 MIME校验 文件上传漏洞---绕过MIME检测 1)上传一句话木马 eval.php 2)上传地址 36/DVWA/vulnerabilities/upload2 文件上传漏洞利用 文件上传漏洞---绕过MIME检测...
  • vue-base64-file-upload - 利用Vue.js将上传文件作为base64 data-uris
  • 之前朋友说的不刷新上传文件。最暴力的解决方案就是上网上搜各种JS库,附带多图上传,预览,甚至是图片处理等特技。下面看小编给大家分享的利用H5特性FormData实现不刷新文件上传,非常实用,小伙伴一起来看看吧
  • 这个漏洞在DVBBS6.0时代被hacker们利用的最为猖獗,利用上传漏洞可以直接得到WEBSHELL,危害等级高,入侵中上传漏洞也是常见的漏洞。 导致改漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以...
  • javaEE利用地方实现文件上传和下载-附件资源
  • 上传原理很简单就是利用表单的打开方式为iframe的id名,这样就可以在当前页面的iframe打来了,实现文件上传,再利用js返回上传结果。
  •   在启用HTTP PUT的Windows上运行Apache Tomcat 7.0.0至7.0.79时(例如,通过将Default的只读初始化参数设置为false),可以通过特制请求将JSP文件上载到服务器。然后可以请求此JSP,并且服务器将执行其中包含的...
  • 本文主要介绍了ASP.NET MVC4利用uploadify.js实现多文件上传的方法代码。具有很好的参考价值。下面跟着小编一起来看下吧
  • 主要介绍了利用jQuery异步上传文件的插件用法详解,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 302,548
精华内容 121,019
关键字:

文件上传利用

友情链接: vb.rar