《小迪安全》第20天 文件上传:基础及过滤方式

GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场

目录

初识

什么是文件上传漏洞?

文件上传漏洞有哪些危害?

文件上传漏洞如何查找及判断?

黑盒查找

白盒分析

文件上传漏洞有哪些需要注意的地方?

关于文件上传漏洞在实际应用中的说明?

案例1:常规文件上传地址的获取(如何查找?)

案例2:不同格式文件类型后门测试

案例3:配合解析漏洞下的文件类型后门测试

拓展一下(思维导图中的验证/绕过)

案例4:本地漏洞环境搭建及测试(思维导图中的验证/绕过)

案例5:某CMS文件上传漏洞测试

 案例6:Weblogic 任意文件上传漏洞(CVE-2018-2894)


初识

什么是文件上传漏洞?

有文件上传的地方,就可能有文件上传漏洞。换句话说有文件上传的地方就可以测试也没有文件上传漏洞。是否存在漏洞取决于对方代码写的够不够完备,一旦疏忽某方面的检测,就可能有空子可钻。


文件上传漏洞有哪些危害?

如果有上传文件漏洞,想上传什么可能都可以,可以上传webshell/网站后门,危害就是直接获得当前网站权限,属于高危漏洞。sql注入可能只是对数据库、对数据进行初步的摸索,文件上传漏洞则是直冲着获取网站权限去的,获得权限后可以做很多事情,比如服务器提权获取内网权限、比如对数据进行进一步操作。


文件上传漏洞如何查找及判断?

黑盒查找

对方源码、网站情况(CMS等)提前都不知道,需要通过扫描敏感文件先进行信息收集,某些扫描字典内含一些常见的上传地址,可以通过扫描获取上传地址;

也可以通过一些常见的功能进行测试上传点,比如会员中心肯定有上传图像功能;

也可以先获取后台权限去看有没有上传文件的地方;(后台权限是后台权限,还没有到网站权限,有一个操作是从后台拉webshell获取网站权限,这个操作经常利用的是文件上传)

白盒分析

拿到了对方源码和相关信息,通过分析代码看有没有某个地方涉及文件上传操作。

大部分文件上传漏洞的查找方式都是通过扫描,加上自己去尝试网站上的一些功能应用,去寻找上传点。

判断是否存在上传漏洞、存在什么样的漏洞就需要进行文件上传配合抓包,进行测试。


文件上传漏洞有哪些需要注意的地方?

拿到一个文件上传漏洞点后要对类型进行区分,属于编辑器文件上传?属于第三方应用文件上传?先判断属于什么类型,然后对症下药进行后续测试;比如直接搜:xxx编辑器文件上传漏洞如何利用。利用现成的漏洞。


关于文件上传漏洞在实际应用中的说明?

没啥别的就上面说的这些。

案例1:常规文件上传地址的获取(如何查找?)

首先随便百度一搜 inurl:upload.php 或者搜 site:xxx.com upload 随便点开一个网页看看,实战中这些 /upload.php 可能是你目录扫描,扫出来的。

只要能上传文件就可以测试是否存在上传漏洞。

  1. 目录扫描扫不扫得出来类似upload.php这样的地址
  2. 网站有没有可以上传文件的应用

案例2:不同格式文件类型后门测试

如果把一个php格式的后门代码写好了,但是以jpg格式上传到网站上了,再怎么访问这个图片都不可能执行后门的 😂 不要妄想其他格式可以把你的后门执行成功。

案例3:配合解析漏洞下的文件类型后门测试

以 Vulhub - Nginx 解析漏洞为例:Vulhub - Docker-Compose file for vulnerability environment

(base) buzz@MacBook-Air-3 ~ % cd vulhub 
(base) buzz@MacBook-Air-3 vulhub % cd nginx
(base) buzz@MacBook-Air-3 nginx % cd nginx_parsing_vulnerability 
(base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up -d
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
(base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up -d
[+] Running 18/18
 ✔ php 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                    1065.0s 
   ✔ 31ce7ceb6d44 Pull complete                                           17.9s 
   ✔ 74a1d4347681 Pull complete                                           17.9s 
   ✔ 381c9f838d23 Pull complete                                         1023.9s 
   ✔ acb23c56d5c2 Pull complete                                         1024.0s 
   ✔ 5fd6e66a5987 Pull complete                                         1024.1s 
   ✔ dc2875c5efdf Pull complete                                         1024.1s 
   ✔ 75d888475340 Pull complete                                         1024.5s 
   ✔ 2dd7dd611ab5 Pull complete                                         1024.5s 
   ✔ c062b3c8884f Pull complete                                         1024.5s 
   ✔ 5e83361431a9 Pull complete                                         1024.6s 
 ✔ nginx 6 layers [⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                         19.6s 
   ✔ 927a35006d93 Pull complete                                            2.9s 
   ✔ fc3910c70f9c Pull complete                                            3.2s 
   ✔ e11bfbf9fd54 Pull complete                                            3.2s 
   ✔ fbb8b547daa2 Pull complete                                            3.2s 
   ✔ 0f1992aeebd8 Pull complete                                            3.3s 
   ✔ f929dacee378 Pull complete                                            3.3s 
[+] Running 3/3
 ✔ Network nginx_parsing_vulnerability_default    Created                  0.0s 
 ✔ Container nginx_parsing_vulnerability-php-1    Started                  0.8s 
 ✔ Container nginx_parsing_vulnerability-nginx-1  Started                  0.9s 
(base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up config
no such service: config
(base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up -config
unknown shorthand flag: 'c' in -config
(base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose config
name: nginx_parsing_vulnerability
services:
  nginx:
    depends_on:
      php:
        condition: service_started
    image: nginx:1
    networks:
      default: null
    ports:
    - mode: ingress
      target: 80
      published: "80"
      protocol: tcp
    - mode: ingress
      target: 443
      published: "443"
      protocol: tcp
    volumes:
    - type: bind
      source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/www
      target: /usr/share/nginx/html
      bind:
        create_host_path: true
    - type: bind
      source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/nginx/default.conf
      target: /etc/nginx/conf.d/default.conf
      bind:
        create_host_path: true
  php:
    command:
    - /bin/sh
    - /var/www/start.sh
    image: php:fpm
    networks:
      default: null
    volumes:
    - type: bind
      source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/start.sh
      target: /var/www/start.sh
      bind:
        create_host_path: true
    - type: bind
      source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/www
      target: /var/www/html
      bind:
        create_host_path: true
    - type: bind
      source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/php-fpm/www-2.conf
      target: /usr/local/etc/php-fpm.d/www-2.conf
      bind:
        create_host_path: true
networks:
  default:
    name: nginx_parsing_vulnerability_default

把图片以notepad打开,在末尾随便写点php代码然后上传这个图片,比如:

<?php
phpinfo();
?>
<?php
phpinfo();
?>
<?php
phpinfo();
?>

访问这个图像,正常显示:

再访问http://127.0.0.1/uploadfiles/3c40dc2ce0e127c10ae8dbf7ae2e503c.png/1.php 

拉到乱码下面发现php被执行了,出现了phpinfo()代码执行之后的页面。

nginx解析漏洞:把图片解析成脚本格式,把php代码执行成功,必须访问上传的文件地址后再加上/xxx.php。直接访问上传的文件(比如png)是正常显示的。

解析漏洞分为:Apache、IIS6/7.x、Nginx,现成的搭建平台解析漏洞网上都可以搜到

拓展一下(思维导图中的验证/绕过)

凡是网页上传文件的地方,99%都不允许上传脚本格式的文件。因为如果可以上传脚本,你写个后门上传,访问执行就能拿到网站权限了,属于高危行为。大部分允许上传的格式大部分就是压缩文件、图片、音频……可不可以绕过网站的验证(验证上传文件的格式是否合规)上传脚本?(思维导图:验证/绕过)思路是一步一步来的:

  1. 比如先信息收集获知对方网站搭建工具是Nginx。
  2. 然后搜索获知Nginx存在文件上传解析漏洞。
  3. 然后尝试上传写入了后门php代码的图片文件。
  4. 然后尝试访问xxx.png/1.php查看是否执行成功。

漏洞利用思路可以参考思路那张思维导图,常规类操作碰壁了,就想想是不是属于其他类(比如平台/第三方应用等)。

案例4:本地漏洞环境搭建及测试(思维导图中的验证/绕过)

https://github.com/c0ny1/upload-labs

http://t.csdnimg.cn/1Nzxo

upload-labs/pass-01:只许上传jpg/png/gif类型文件时如何上传php的webshell

涉及到:本地/前端验证,右键查看源代码:只需删除掉代码中部分过滤即可,

代码分析:首先作者定义了一个file变量,用来获取name标签为’upload_file’数组的第一个元素的值,然后判断该变量如果为空则返回一个提示框。

又定义了一个用来获取上传文件类型的变量,它的值是文件名截取从点开始往后的字符串,也就相当于截取了后缀名。然后如果检索值等于-1(也就相当于上传了未定义的后缀名,没有检索到对应的字符串),那么将会报错,也就是实现了对上传文件的后缀名进行验证

<script type="text/javascript">
    function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        if (file == null || file == "") {
            alert("请选择要上传的文件!");
            return false;
        }
        //定义允许上传的文件类型
        var allow_ext = ".jpg|.png|.gif";
        //提取上传文件的类型
        var ext_name = file.substring(file.lastIndexOf("."));
        //判断上传文件类型是否允许上传
        if (allow_ext.indexOf(ext_name) == -1) {
            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
            alert(errMsg);
            return false;
        }
    }
</script>

html是前端的网页静态服务器的代码,php是动态服务器的代码

前端大多由html、javascript编写,如果过滤规则是写在前端的,前端的脚本就是在用户浏览器上,后端就是在服务器执行后结果给用户(前端JS和html在浏览器上执行,后端PHP在服务器上执行返回到浏览器)

Pass-01的验证是在浏览器进行的,过滤由Javascript编写,浏览器里的设置【禁用Javascript脚本】就可以把访问页面中的JS脚本禁掉,过滤代码就会被禁掉,过滤就不会被执行。所以前端验证很不安全,有这样的问题(前端先验证再发给后端和发过去给后端验证的区别,大部分都是后端验证)

所以Pass-01怎么做:

  1. 要么禁用JS脚本(不推荐,因为还有别的JS脚本可能要起作用,会被影响)
  2. 要么删除网页前端源代码中的文件格式过滤部分
  3. 要么Burp一抓,修改后缀为.php再发送(如果上传流程全由JS实现,全由JS对网站信息进行截取、对文件进行保存,就抓不到数据包了,因为JS/html在本地运行不会发送到对方服务器,抓得到数据包取决于有没有东西往对方服务器发。实战中有时候抓不到数据包也可能是因为这个。Pass-01抓得到数据包因为index.php有一个提交的流程,属于是JS和php的混编实现)
    <?php
    include '../config.php';
    include '../head.php';
    include '../menu.php';
    
    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists(UPLOAD_PATH)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
            if (move_uploaded_file($temp_file, $img_path)){
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
        }
    }
    ?>

具体操作:

  1. 把网页源代码保存本地为html格式。
  2. 删除代码中的过滤规则。
  3. 找到代码中的action处,修改其指向地址为真实网站地址(通过真实网页查看network在尝试上传时数据包的Request URL)。action="http://127.0.0.1:8080/uploadlabs/Pass-01/index.php"
  4. 然后本地执行html文件,成功绕过过滤规则,向真实网站上传php格式的webshell。

案例5:某CMS文件上传漏洞测试

 用小迪自己搭建的FineCMS网站示例:径直来到会员中心-上传头像部分进行测试

先按常规操作来:上传一个图片并抓包。抓不到,很明显上传操作由JS执行,没有经过PHP,直接在浏览器内执行了。

然后点击上传,发现抓得到数据包,但是修改后缀为php之后怎么弄都上传失败报错,而且也不回显上传之后的文件地址。其实这时查看网页根目录一层一层去找发现这个php文件是上传成功了的,只不过因为报错+无文件地址回显,这条路走不通了。

然后尝试其他办法,注意到:【FineCMS】回忆之前讲的信息收集,直接去搜FineCMS文件上传漏洞。finecms前台任意文件上传漏洞 | CN-SEC 中文网

依葫芦画瓢,抓包修改后缀后发送,然后访 uploadfile/member/uid/0x0.php 即可,把uid换成自己的uid就可以了。

再次强调:思路很重要,不要没头苍蝇

 案例6:Weblogic 任意文件上传漏洞(CVE-2018-2894)

Vulhub - Docker-Compose file for vulnerability environment

现成的、第三方的漏洞,实战中知道用了WebLogic的话可以依葫芦画瓢进行尝试

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值