• 粤嵌科技毕业实习Day16


    粤嵌科技毕业实习Day16

    文件上传漏洞的检测

    • 客户端js校验(也称前端验证,一般只校验后缀名)

      • 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
      • 判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。前端验证非常不可靠,通过修改数据包后缀名即可绕过,甚至关闭js都可以尝试绕过。
      • 服务端校验:
        • 文件头content-type字段校验(image/gif)
        • 文件内容头校验(GIF89a)
        • 后缀名黑名单校验
        • 后缀名白名单校验
        • 自定义正则校验
    • 前端验证绕过

      • 上传一个带一句话木马的PHP,会弹出提示只能上传的图片类型。这就是典型的前端检测。
      • 我们把这个PHP文件的后缀改为JPG,就会提示上传成功,并开始Burp抓包,然后将JPG的后缀改回为PHP,这样就达到了我们上传PHP木马的目的。
      • 接下来就是连接菜刀,进行getshell。
    • Content-Type方式绕过

      • Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于区分数据类型。最初MIME是用于电子邮件系统的,后来HTTP也采用了这一方案。
      • 在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。
      • 所以同样还是Burp抓包,然后找到Content-Type,将里面的类型修改为你想要上传的文件类型就可以成功绕过检测。
    • 绕过黑白名单策略

      • 黑名单绕过
        • 通过上传不受欢迎的php扩展来绕过黑名单。例如:pht,phpt,phtml,php3,php4,php5,php6
    • .htaccess文件绕过

      • htaccess是超文本访问(Hypertext Access)的缩写,是一个基于Apache的Web服务器使用的配置文件,用于控制它所在的目录以及该目录下的所有子目录。

      • AddType application/x-httpd-php .jpg

        这个指令代表JPG会被当做PHP来执行,由于图形化界面无法将文件命名为.htaccess,所以使用CMD命令Ren更改后缀。

        只要把这个.htacess文件上传,之后上传的JPG文件都会被当成PHP解析。

    • 后缀大小写绕过

      • 我们将做成图片马直接将后缀改成Php,进行上传。
      • 让文件的后缀由大小写字母穿插组成。
    • 文件后缀(空)绕过

      • 这里相对于前面关卡的代码是少了一个消除两旁空格的函数trim();所以我们我们可以通过在后缀加个空格尝试绕过,黑名单机制中,是不允许上传什么,但如果我们传上去的文件与所限制的稍有不一样,就可以直接绕过黑名单了
      • 我们进行将带有一句话的php文件上传并抓包,在后缀加个空格,上传。
    • 文件后缀(点)绕过

      • 这里是少了一个删除末尾的点的函数。
      • 我们还是进行将带有一句话的php文件上传并抓包在后缀加个点,上传,在上传到服务器后,服务器会自动将点去掉,只读取前面有用的后缀;
    • ::$DATA(Windows文件流绕过)

      • ::$DATA(Windows文件流绕过)(这里利用到了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都存在许多个数据流。通俗理解,就是其他文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。)

      • 例如在cmd命令下运行:echo abcd>>a.txt:b.txt 很明显生成一个a.txt,但是会是空值,因为系统将值写到寄宿文件上去了;

        然后再运行 echo 123>>a.txt::$DATA,是会在a.txt中输出123的,因为

        ::$DATA相当是个空值,不是一个寄宿文件,所以还是会将文件写入到a.txt中去,不修改文件存储过程;

      ​ 在利用Windows特性,可在后缀加上“ ::$DATA ”绕过。

      ​ 跟之前一样的思路,抓包改包绕过。

    • 构造文件后缀绕过

      • 这关好像用了我们前面关卡的所有过滤,那我们可不可以构造一个文件名后缀111.php. .
      • 过滤参数在发现.时会将.去掉,在将空格去掉,最后只剩下111.php. 这样还是可以绕过黑名单机制的,因为111.php.不等于111.php,所以还是能绕过上传;
    • 双写文件后缀绕过

      • 会将符合条件的文件后缀删除,我们只需要将文件后缀进行双写,令他删除后合并就能成功绕过
    • 白名单绕过

      • 00截断

        截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态

        0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。

        系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束

        GET型00截断

    • POST型00截断

      POST请求中,%00不会被自动解码,需要在16进制中进行修改00

    • 文件包含漏洞

      在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,

      无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。

    • 图片马制作

      copy b.png /b + a.php /a shell.jpg(a表示ascii文件/b表示二进制形式)


    上传漏洞利用(2)

    打开http://127.0.0.1/upload-labs/

    • Pass-08

      1. 打开Pass-08

      2. 查看提示

      3. 查看源码,可知,缺少了检测字符串::$DATA的 代码,可以作为突破口

      4. 打开burp suite对上传进行抓包,修改文件名

      5. 上传成功

      6. 打开图片链接http://127.0.0.1/upload-labs/upload//efg.php

    • Pass-10

      1. 打开Pass-10

      2. 查看提示

      3. 查看源码

      4. 上传abc.php,发现上传成功

      5. 打开图片链接http://127.0.0.1/upload-labs/upload//abc. 发现尾缀不见了

      6. 对abc.php重命名为abc.phphpp,再次上传

      7. 打开图片链接http://127.0.0.1/upload-labs/upload//abc.php

    • Pass-11

      1. phpStudy上切换到5.2.17并关闭magic_quotes_gpc

      2. 打开Pass-11

      3. 查看提示

      4. 查看源码,可知只允许上传jpg、png、gif文件

      5. 重命名jkl.php为jkl.png,打开burp suite开启对图片上传进行抓包

      6. 修改路径

      7. 打开图片链接http://127.0.0.1/upload-labs/upload/jkl.php

    • Pass-12

      1. 打开Pass-12

      2. 查看提示

      3. 查看源码,可见这次是post型,不能像get型可以直接修改url达到目的。

      4. 开启burp suite,上传ccv.png进行抓包

      5. 修改路径

      6. 将61(a)的修改为00,删除掉

      7. 上传成功打开图片链接http://127.0.0.1/upload-labs/upload//ccv.php

    本文作者:AlubNoBug
    本文链接:https://www.cnblogs.com/AlubNoBug/p/13696484.html

  • 相关阅读:
    oracle级联删除
    sqlserver 中批量删除 换行符
    SpringBoot与jackson.databind兼容报错问题
    mvn 本地jar包 加入自己的maven仓库
    sql server 表2字段更新到表1,mysql
    sql server 修改表字段
    Spring Boot文件上传
    java如何实现多继承(实现:子类中二个方法,分别继承不同父类)
    SQL SERVER 数据库如何限制一列不能重复(已经有主键)
    SQL server 字段合并CAST(org_no AS VARCHAR(20))+CAST(page_no AS VARCHAR(20))+CAST(djlb_no AS VARCHAR(20)))
  • 原文地址:https://www.cnblogs.com/AlubNoBug/p/13696484.html
Copyright © 2020-2023  润新知