文件上传-专题
liduoan.efls Engineer

upload libs

image

image

pass1

仅仅前端检验

pass2

MIME绕过

pass3

这一关我们可以利用

Php1,phtml ,php3,php4,php5,pht

也可以利用.htaccess进行处理

pass4

利用.htaccess进行处理

因为它取的是在.之后的数据

那么我们可以构造.php.xxx

也可以写成.php. .

pass5

一样可以利用

因为它取的是在.之后的数据

那么我们可以构造.php.xxx

也可以写成.php. .

pass6

它是匹配不是正则

所以我们可以利用.php空格空格空格

这样的方式来进行操作

pass7

1
2
3
4
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空

黑名单很多情况下都没什么用处

.就可以去掉 特别是利用`.php.空格空格.

方法二:利用Windows解析漏洞(后缀修改为1.php:1.jpg)

文件解析部分

一、IIS 5.x/6.0解析漏洞(03)

IIS 6.0解析利用方法有两种

1.目录解析

/xx.asp/xx.jpg

在网站下简历文件夹为.asp、.asa的文件夹,其目录内的任何文件扩展名的文件都会被IIS当做asp文件来执行

例如目录 hahaha.asp,那么/hahaha.asp/1.jpg 一个jpg格式的文件就会被当做asp脚本文件来解析执行,假设黑客可以控制问上传文件的文件夹路径,就可以绕过上传格式拿到shell

一般目录解析漏洞跟编辑器搭配利用,比如ckfinder,fck编辑器,都是可以创建目录的。

2.文件解析(;)

hahaha.asp;.jpg

在IIS6.0下,分号后面的不被解析,也就是说hahaha.asp;.jpg会被服务器看成是hahaha.asp

3.畸形后缀名解析
IIS6.0 默认的可执行文件除了asp还包含这三种(特定的情况下被解析):

/hahaha.asa
/hahaha.cer
/hahaha.cdx

二、IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞

Nginx解析漏洞这个伟大的漏洞是我国安全组织80sec发现的…

在默认Fast-CGI开启状况下,黑阔上传一个名字为hahaha.jpg,内容为: ‘);?>的文件,然后访问hahaha.jpg/.php,在这个目录下就会生成一句话木马 shell.php。(这个漏洞貌似不是容器的漏洞,而是php的漏洞,因为不止IIS7,0/7.5才有,甚至10.0也有出现)

三、Nginx <8.03 空字节代码执行漏洞

影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37

Nginx在图片中嵌入PHP代码然后通过访问

xxx.jpg.php

来执行其中的代码

四、Apache解析漏洞

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.

比如 hahaha.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把hahaha.php.owf.rar解析成php.

如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个hahaha.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀

五、其他

在windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单.若上传成功,空格和点都会被windows自动消除,这样也可以getshell。

我们刚刚就是一直用这个方式

如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:

SetHandler application/x-httpd-php

然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件

pass8

1
2
3
4
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = trim($file_ext); //首尾去

这个也是这样 就是去掉了文件末尾第一个点

那么我们可以变为.php. . .

那么我们就可以使用

.php::$DATA进行绕过

部分知识

特殊文件名绕过
1
2
3
比如发送的 http包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式
在windows系统里是不被允许的,所以需要在 burp之类里进行修改,然后绕过验证后,会
被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。
Windows流特性绕过
1
php在window的时候如果文件名+"::DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::DATA之后的数据当成文件流处理,不会检测后缀名."::DATA"之前的文件名保持 他的目的就是不检查后缀名。ps:只能是Windows系统,并且只能时php文件

pass9

1
2
3
4
5
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空

还是点空点操作

pass10

1
2
3
4
5
6
7
8
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $file_name)) {
$img_path = $UPLOAD_ADDR . '/' .$file_name;
$is_upload = true;
}

这里看到是把php变为空

并没有正则或者判断存在

所以正常的双写绕过

.phphpp直接绕过over

pass11

1
2
3
4
5
6
7
8
9
$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;
}

终于到白名单了

这道题目的利用点在于$_GET传参这里,我们的目录是可动态构造的

那么我们这里使用$_GET['save_path']=/../upload/liduoan.php%00

可是这里有限制

需要两个条件

php版本小于5.3.4

php的magic_quotes_gpc为OFF状态

如果要完成这一个题目就必须要实现上面的两个条件

但是现在都PHP7了,这东西也就很少见了,满足上面的条件的时候php就是把它当成结束符,后面的数据直接忽略,这也导致了很多的问题,文件包含也可以利用这一点。

pass12

1
2
3
4
5
6
7
8
9
$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 = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
}

这道题目就是改成了$_POST传参数

和前面那道题目一样

上传图片马后为如下

image

然后在上面的upload 的后面加上 XXX.php+(这里的XXX可以为任何名字,他只是一个代号。并且 php后面的 + 好也是一个标记,他的二进制代码为 2b)

image

由上可知,将二进制中的 + 改为 00 截断,即将 + 的二进制码 2b 改为 00 .

image

pass13

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}

这道题目,它查看了图片的内容,我们利用幻术头绕过

但是写到这我就不会了

结果居然是我们自己写个文件包含。。。

1
2
3
<?php
include($_GET['page']);
?>

这样我们就可以直接

/include.php/?page=xxxxxx.jpg

说明了图片马要么利用解析漏洞,要么利用文件包含

pass14

同样幻术头马上传配合文件包含