找到了一张图 感觉总结的很精确。但是解决方法不止图中一种,比如js检测的可以用burp绕过。
//
第四关 .htaccess绕过
还是首先看源码,发现过滤了所有的后缀名,
$deny_ext = array(".php",".php5",".php4",".php3",".php2",“php1”,".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",“pHp1”,".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES[‘upload_file’][‘tmp_name’];
i
m
g
p
a
t
h
=
U
P
L
O
A
D
P
A
T
H
.
′
/
′
.
d
a
t
e
(
"
Y
m
d
H
i
s
"
)
.
r
a
n
d
(
1000
,
9999
)
.
img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).
imgpath=UPLOADPATH.′/′.date("YmdHis").rand(1000,9999).file_ext;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = ‘上传出错!’;
}
} else {
$msg = ‘此文件不允许上传!’;
}
} else {
$msg = UPLOAD_PATH . ‘文件夹不存在,请手工创建!’;
}
目前只知道php的各种12345格式,却都过滤完了。。。。在网上看的还有.htaccess格式没过滤。也就是图中总结的上传.htaccess. htaccess是阿帕奇服务器的一个配置文件,他可以修改阿帕奇配置。所以我们可以写一个htaccess文件来把jpg文件改成php文件并上传。这样就可以把我的jpg文件在服务器里改成php文件并上传了。而且要把htaccess文件后缀名改为.htaccess才能起作用。
先上传htaccess文件,然后上传.jpg文件,然后服务器就会把jpg文件解析成php木马了。我自己搭的环境没有解析成功,应该用buu的环境才能解析成功。
//
第五关 大小写绕过
绕过了htaccess文件,但是没绕过大小写,因此可以修改字母大小写绕过。
直接把后缀名改成大小写混合就能绕过文件检测上传php文件了。
//
第六关 空绕过
打开源码发现 用了strtolower($file_ext); //转换为小写 函数,把所有的文件名改成了小写,。因此不能再用文件大小写来绕过,可以用空绕过。我发现直接修改文件名加空格不行,只能在burp上修改文件名,php+空格。就能直接绕过了。绕过之后直接复制图片地址,连接蚁剑。
//
第七关 点绕过
在第七关源码中我们可以看见一个函数trim($file_ext); 是首尾去空函数,因此空绕过就不行了,还有点绕过!同理,在burp上修改上传的文件后缀,加一个.就行了。
//
第八关 ::
D
A
T
A
绕
过
d
e
l
d
o
t
(
DATA绕过 deldot(
DATA绕过deldot(file_name);源码中的这个函数就是去除点的函数。
还可以用::
D
A
T
A
绕
过
p
h
p
在
w
i
n
d
o
w
的
时
候
如
果
文
件
名
+
"
:
:
DATA 绕过 php在window的时候如果文件名+"::
DATA绕过php在window的时候如果文件名+"::DATA"会把::
D
A
T
A
之
后
的
数
据
当
成
文
件
流
处
理
,
不
会
检
测
后
缀
名
.
且
保
持
"
:
:
DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::
DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::DATA"之前的文件名
他的目的就是不检查后缀名。
//
第九关。
str_ireplace(’::$DATA’, ‘’,
f
i
l
e
e
x
t
)
源
码
中
利
用
i
r
e
p
l
a
c
e
函
数
把
:
:
file_ext)源码中利用ireplace函数把::
fileext)源码中利用ireplace函数把::DATA字符置换成空了。因此要另寻新路, 由源码可以看出先删掉文件名的末尾的点,然后又去除空格,那如果把文件名后面的空格和. 都加上,那么再绕过的话就可以绕过了,所有再加个点就可以绕过了,改文件名为shell.php.空格. 也可以加 空格 点 空格 点 都可以绕过。
function deldot(KaTeX parse error: Expected '}', got 'EOF' at end of input: s){ for(i = strlen(
s
)
−
1
;
s)-1;
s)−1;i>0;$i–){
c
=
s
u
b
s
t
r
(
c = substr(
c=substr(s,
i
,
1
)
;
i
f
(
i,1); if(
i,1);if(i == strlen($s)-1 and $c != ‘.’){
return $s;
}
if($c != '.'){
return substr($s,0,$i+1);
}
}
}这个是deldot的函数代码,分析一下,对于字符串s,从末尾向前,substr是返回字符串中的子串,定义的是返回一个字符,用来判断是否是点,循环判断,如果是点的话就去掉末位。而且只去掉一次。因此要用两个点,才能绕过。php .空格. 经过deldot函数后就剩php.空格 再经过空格过滤后就剩php.了 就可以绕过了
//
第十关
查看源码
str_ireplace($deny_ext,"", $file_name);此替换函数可以用双写绕过,直接改后缀名位pphphp
//
第十一关
白名单绕过,可以用%00阶段后面的后缀,从而绕过后缀名必须是jpg。shell.php%00.jpg ,另外,此关是用get请求的 可以用%00阶段。
第十二关
post传参比get安全,也是可以用%00绕过的 但是要在二进制里修改。
%00截断在get中被url解码之后是空字符,但在post中,%00不会被url解码,所有只能通过burp修改hex值进行截断。