基于文件后缀名验证介绍
对于文件上传模块来说,尽量避免上传可执行的脚本文件。为了防止上传脚本需要设置对应的验证方式。
基于文件后缀名验证方式分类:
1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。
基于黑名单验证代码片段分析
对于黑名单中的后缀名筛选。绕过黑名单可以通过寻找"漏网之鱼",寻找某些可以被作为脚本执行同时也不在黑名单中。
Burpsuite绕过黑名单验证
利用Burpsuite工具截断HTTP请求,利用Intruder模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名。
绕过黑名单验证(.htaccess文件)
.htaccess文件介绍
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许、阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
其中.htaccess文件内容:
SetHandler application/x-httpd-php
设置当前所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当做PHP执行。不符合则报错。
配置文件http.conf
在Apache中如果需要启动.htaccess,必须在http.conf中设置AllowOverride
黑名单过滤代码举例
黑名单中,没有对.htaccess进行过滤,可以直接上传.htaccess来设置使用php解析任意文件。
文件内容:SetHandler application/x-httpd-php
绕过黑名单验证(大小写绕过)
大小写绕过原理
Windows系统下,对于文件名中的大小写不敏感,例如:test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。例如:test.php和TesT.php就是不一样的。
此时可以通过修改文件后缀,使用大小写混合的写法绕过缺少了对上传文件名获取的大小写转换的黑名单验证。
绕过黑名单验证(空格绕过)
空格绕过原理
Windows系统下,对于文件名中的空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
针对这样的情况需要使用Burpsuite截断HTTP请求之后,修改对应的文件名,添加空格。
绕过黑名单验证(.号绕过)
.号绕过原理
Windows系统下,文件名后缀最后一个点会被自动去除。
例如:
Windows下新建一个1.php.文件,查看。
此时可以通过修改上传文件的后缀,使用*.php.的写法绕过缺少了对去除文件名最后一个点的处理的验证进行绕过。
绕过黑名单验证(特殊符号绕过)
特殊符号绕过原理
Windows系统下,如果上传的文件名中test.php::
D
A
T
A
会
在
服
务
器
上
生
成
一
个
t
e
s
t
.
p
h
p
的
文
件
,
其
中
内
容
和
所
上
传
内
容
相
同
,
并
被
解
析
。
例
如
:
在
W
i
n
d
o
w
s
系
统
下
新
建
一
个
文
件
名
为
1.
p
h
p
:
:
DATA会在服务器上生成一个test.php的文件,其中内容和所上传内容相同,并被解析。 例如: 在Windows系统下新建一个文件名为1.php::
DATA会在服务器上生成一个test.php的文件,其中内容和所上传内容相同,并被解析。例如:在Windows系统下新建一个文件名为1.php::DATA的文件,查看效果。但是在Windows下新建的文件名中包含特殊符号不能成功新建。
当验证代码黑名单过滤中没有过滤掉 ::
D
A
T
A
,
此
时
就
可
以
通
过
上
传
文
件
后
缀
为
1.
p
h
p
:
:
DATA,此时就可以通过上传文件后缀为1.php::
DATA,此时就可以通过上传文件后缀为1.php::DATA格式的文件进行验证绕过。
绕过黑名单验证(路径拼接绕过)
路径拼接绕过原理
在没有对上传文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
例如:
用户新建 1.php.+空格+.
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为1.php.
利用Windows自动去除最后一个点,导致成功上传1.php。
绕过黑名单验证(双写绕过)
双写绕过原理
代码编写过程中,只对黑名单中的内容进行控替换,因为只替换一次所以造成双写绕过。
例如:
str_ireplace()函数替换字符串中的一些字符串(不区分大小写)。
该函数必须遵循下列规则:
如果搜索的字符串是一个数组,那么它将返回一个数组。
如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符进行替换
如果是对一个数组进行查找,但只对一个字符串进行替换,那么替换字符串将对所有查找到的值起作用。
注释:该函数不区分大小写。请使用str_replace()函数来执行区分大小写的搜索。
注释:该函数是二进制安全的。
Webshell生成工具介绍
Webacoo上传Webshell
WeBaCoo生成Webshell: webacoo -g -o a.php
上传Webshell
连接Webshell: webacoo -t -u Webshell地址
weevely生成Webshell文件
生成:weenely generate 密码 路径 文件名
连接:weevely shell文件地址 密码
公开的Webshell
上传网上公开的一些Webshell