利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 ,再通过URL去访问以执行恶意代码。
1、上传webshell:一句话木马或者以及经过免杀的webshell
2、钓鱼攻击:上传带有恶意代码的文件诱导用户或管理员下载
3、拒绝服务DoS:上传超大文件占用服务器带宽和资源
这里可以看到只能上传.jpg、png、gif的文件格式后缀
所以先将文件后缀改成这几个之后再进行文件上传抓包
上传php文件上传失败

上传jpg文件并抓包


上传成功


这里可以看到文件的路径使用蚁剑进行连接
上传.htaccess文件

上传成功在上传一个evil.gif文件,名字是这个,但内容是之前的一句话木马

上传这个文件

然后用蚁剑连接这个文件就可以了
分析文件源代码
这里可以看到过滤了好多文件后缀,因此我们上传一个配置文件然后将别的文件后缀当成我们想要执行的文件。
3. MIME绕过
原理:服务器代码判断$FILES[”file“]["type"]是不是图片格式(image/jpeg
、image/png
、image/gif
),如果不是,则不允许上传该文件。
绕过:将上传的文件进行抓包,在burp中修改MIME属性从而绕过服务端验证,但文件保存之后不会因为MIME属性的异常导致文件无法执行
实践:ctfhub
文件上传一个webshell.php之后进行抓包

这里可以看到这里的文件类型是application/octet-stream
因此修改这里就可以进行上传

上传成功

使用蚁剑连接
这里可以看到验证的是$FILES['file']['type']这个的属性所以只需要修改那个点就可以了
4. 文件头检查
原理:在上传文件之后,服务端会提取文件的文件头,在jpg文件中有文件头0xFFD8FF,在png中有文件头0x89504E470D0A1A0A,在GIF中有文件头GIF89a
绕过:只要在上传的文件中添加这个文件头就可以了
实践:ctfhub
创建一个新的webshell,然后在webshell中添加GIF的文件头

然后上传这个文件并拦截包,顺便修改一下文件类型

上传成功,蚁剑连接

查看并分析源代码
可以看到这里是有两个点进行验证的,一个是文件类型进行验证,一个是读取文件前四个字节,确认文件的文件头是特定字节的。这里我是直接在文本中添加了一个GIF89a,这个字符串对应的二进制内容就是47494638,如果要伪造别的就可以使用winhex或者其他二进制编辑器在webshell中添加四个字节
5. 00截断
原理:当PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态,由于00代表结束符,所以会把00后面的所有字符删除
绕过:在上传文件的时候,因为把常见的php后缀过滤了,因此在php后面添加%00.jpg之类的后缀,在解析的时候只会把上传的文件当成jpg文件,但在保存文件的时候由于解析错误,就会把%00后面的字符串删除
实践:ctfhub
创建%00的文件

然后上传这个文件
这里要修改一下road这里为webshell.php%00

上传成功之后就是访问upload/webshell.php就可以,在这里只会显示上传成功但没返回上传路,可以先上传正常的然后进行拼接后面上传的webshell就可以了
这里是php版本低的原因所以没什么看的源代码
6. 双写绕过
原理:在后端检查的时候,如果检测到了php或者其他危险字符,在保存文件的时候会将这些字符进行替换成空字符,因此导致保存文件失效
绕过:将文件后缀进行双写绕过
实践:ctfhub
上传文件修改下面两个地方

修改之后

上传成功

使用蚁剑连接查看源代码
这里可以看到名字这里是包黑名单中的字符替换成空导致我们可以双写绕过
function checkfilesuffix()
{
var
file
=
document.getElementsByName(
'file'
)[
0
][
'value'
];
if
(
file
=
=
""||
file
=
=
null)
{
alert(
"请添加上传文件"
);
return
false;
}
else
{
var whitelist
=
new Array(
".jpg"
,
".png"
,
".gif"
);
var file_suffix
=
file
.substring(
file
.lastIndexOf(
"."
));
if
(whitelist.indexOf(file_suffix)
=
=
-
1
)
{
alert(
"该文件不允许上传"
);
return
false;
}
}
}
function checkfilesuffix()
{
var
file
=
document.getElementsByName(
'file'
)[
0
][
'value'
];
if
(
file
=
=
""||
file
=
=
null)
{
alert(
"请添加上传文件"
);
return
false;
}
else
{
var whitelist
=
new Array(
".jpg"
,
".png"
,
".gif"
);
var file_suffix
=
file
.substring(
file
.lastIndexOf(
"."
));
if
(whitelist.indexOf(file_suffix)
=
=
-
1
)
{
alert(
"该文件不允许上传"
);
return
false;
}
}
}
<FilesMatch
"evil.gif"
>
SetHandler application
/
x
-
httpd
-
php
AddHandler php5
-
script .gif
<
/
FilesMatch>
<FilesMatch
"evil.gif"
>
SetHandler application
/
x
-
httpd
-
php
AddHandler php5
-
script .gif
<
/
FilesMatch>
if
(!empty($_POST[
'submit'
])) {
$name
=
basename($_FILES[
'file'
][
'name'
]);
$ext
=
pathinfo($name)[
'extension'
];
$blacklist
=
array(
"php"
,
"php7"
,
"php5"
,
"php4"
,
"php3"
,
"phtml"
,
"pht"
,
"jsp"
,
"jspa"
,
"jspx"
,
"jsw"
,
"jsv"
,
"jspf"
,
"jtml"
,
"asp"
,
"aspx"
,
"asa"
,
"asax"
,
"ascx"
,
"ashx"
,
"asmx"
,
"cer"
,
"swf"
);
if
(!in_array($ext, $blacklist)) {
if
(move_uploaded_file($_FILES[
'file'
][
'tmp_name'
], UPLOAD_PATH . $name)) {
echo
"<script>alert('上传成功')</script>"
;
echo
"上传文件相对路径<br>"
. UPLOAD_URL_PATH . $name;
}
else
{
echo
"<script>alert('上传失败')</script>"
;
}
}
else
{
echo
"<script>alert('文件类型不匹配')</script>"
;
}
}
if
(!empty($_POST[
'submit'
])) {
$name
=
basename($_FILES[
'file'
][
'name'
]);
$ext
=
pathinfo($name)[
'extension'
];
$blacklist
=
array(
"php"
,
"php7"
,
"php5"
,
"php4"
,
"php3"
,
"phtml"
,
"pht"
,
"jsp"
,
"jspa"
,
"jspx"
,
"jsw"
,
"jsv"
,
"jspf"
,
"jtml"
,
"asp"
,
"aspx"
,
"asa"
,
"asax"
,
"ascx"
,
"ashx"
,
"asmx"
,
"cer"
,
"swf"
);
if
(!in_array($ext, $blacklist)) {
if
(move_uploaded_file($_FILES[
'file'
][
'tmp_name'
], UPLOAD_PATH . $name)) {
echo
"<script>alert('上传成功')</script>"
;
echo
"上传文件相对路径<br>"
. UPLOAD_URL_PATH . $name;
}
else
{
echo
"<script>alert('上传失败')</script>"
;
}
}
else
{
echo
"<script>alert('文件类型不匹配')</script>"
;
}
}
查看源代码进行分析
if
(!empty($_POST[
'submit'
])) {
if
(!in_array($_FILES[
'file'
][
'type'
], [
"image/jpeg"
,
"image/png"
,
"image/gif"
,
"image/jpg"
])) {
echo
"<script>alert('文件类型不正确')</script>"
;
}
else
{
$name
=
basename($_FILES[
'file'
][
'name'
]);
if
(move_uploaded_file($_FILES[
'file'
][
'tmp_name'
], UPLOAD_PATH . $name)) {
echo
"<script>alert('上传成功')</script>"
;
echo
"上传文件相对路径<br>"
. UPLOAD_URL_PATH . $name;
}
else
{
echo
"<script>alert('上传失败')</script>"
;
}
}
}
if
(!empty($_POST[
'submit'
])) {
if
(!in_array($_FILES[
'file'
][
'type'
], [
"image/jpeg"
,
"image/png"
,
"image/gif"
,
"image/jpg"
])) {
echo
"<script>alert('文件类型不正确')</script>"
;
}
else
{
$name
=
basename($_FILES[
'file'
][
'name'
]);
if
(move_uploaded_file($_FILES[
'file'
][
'tmp_name'
], UPLOAD_PATH . $name)) {
echo
"<script>alert('上传成功')</script>"
;
echo
"上传文件相对路径<br>"
. UPLOAD_URL_PATH . $name;
}
else
{
echo
"<script>alert('上传失败')</script>"
;
}
}
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!
最后于 8小时前
被kanxue编辑
,原因: