文章目录
- Pass-01 前端检测(JS检测)
- 1.1 原理分析
- 1.2 具体问题具体分析
- 1.3 实验
- Pass-02 后端检测(MIME检测)
- 2.1 原理分析
- 2.2 具体问题具体分析
- 2.3 实验
- Pass-03 后端检测(黑名单绕过,特殊后缀名)
- 3.1 原理分析
- 3.2 具体问题具体分析
- 3.3 实验
- Pass-04 后端检测(黑名单绕过,.htaccess)
- 4.1 原理分析
- 4.2 具体问题具体分析
- 4.3 实验
- Pass-05 后端检测(黑名单绕过,大小写绕过)
- 5.1 原理分析
- 5.2 具体问题具体分析
- 5.3 实验
- Pass-06 后端检测(黑名单绕过,空格绕过)
- 6.1 原理分析
- 6.2 具体文体具体分析
- 6.3 实验
- Pass-07 后端检测(黑名单绕过,点绕过)
- 7.1 原理分析
- 7.2 具体文体具体分析
- 7.3 实验
- Pass-08 后端检测(黑名单绕过,::$DATA绕过)
- 8.1 原理分析
- 8.2 具体文体具体分析
- 8.3 实验
- Pass-09 后端检测(黑名单绕过,. .绕过)
- 9.1 原理分析
- 9.2 具体文体具体分析
- 9.3 实验
- Pass-10 后端检测(黑名单绕过,)
- 9.1 原理分析
环境:在kali中使用docker进行搭建。
Pass-01 前端检测(JS检测)
1.1 原理分析
客户端(Client):或称为用户端(前端),与服务器相对应。由于客户端对于文件上传漏洞的防御是通过JS代码实现的,所以客户端检测与绕过也称为JS检测与绕过。
由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传WebShell。绕过方法:
- 删除浏览器事件;
- 禁用JS;
- 利用BurpSuite抓包修改文件后缀名。
1.2 具体问题具体分析
查看源码:
从form表单可以看出他在使用了onsubmit
这个函数,触发了鼠标的单击事件,在表单提交后马上调用了checkFile()
这个函数对上传的文件进行检查。checkfile()
返回值为假,文件将不会上传。
该函数只允许上传的文件类型为.jpg、.png、.gif
。
综上分析,这种检测方式属于前端检测(JS检测)。
1.3 实验
这里使用上述三种方法进行JS绕过:
(1)禁用JS
(2)利用burp抓包修改文件后缀
(3)删除浏览器事件
先将源代码全部保存到1.html
文件中,然后删除onsubmit事件
,以及JS函数。使用action
事件,告诉浏览器将表单提交给谁。
使用火狐打开firefox 1.html
,然后上传文件即可。
Pass-02 后端检测(MIME检测)
2.1 原理分析
MIME检测原理:
判断$_FILES["upload_file"]["type"]
是不是图片格式(image/gif、image/png、image/jpeg),不是则不允许上传。在HTTP 协议中,使用Content-Type 字段表示文件的MIME 类型。 $_FILES["file"]["type"]
的值是从请求数据包中Content-Type中获取。
常见的MIME 类型如下:
文件拓展名 | Mime-Type |
---|---|
.js | application/x-javascript |
.html | test/html |
.jpg | image/jpeg |
.png | image/png |
application/pdf |
绕过方法:修改数据包中的content-type值就行。
2.2 具体问题具体分析
查看源码,发现检测MIME格式是否为
image/gif、image/jpeg、image/png
。抓包修改MIME值即可。
2.3 实验
Pass-03 后端检测(黑名单绕过,特殊后缀名)
3.1 原理分析
(1)黑名单绕过
- 名单列表绕过
有些中间件允许解析其他文件后缀名,如asa、cer之类的或在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件,所以上传一个后缀名为php3、phptml的文件即可。
默认状态下
.php3
,.php4
,.php5
,.phtml
都是会被解析为php
- Windows特性
一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
- 末尾的点(
.
) 如1.php.
- 空格(
1.php
- ::$DATA,如
1.php::$DATA
(2)白名单绕过
白名单绕过需要配合文件包含漏洞或者解析漏洞。
(3).htaccess文件攻击
.htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件),该配置文件会覆盖Apache服务器的全局配置,作用于当前目录及其子目录。
- 如果一个web应用允许上传.htaccess文件,那就意味着攻击者可以更改Apche的配置。
在httpd.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去找**.htacess**文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件;如果设置为All,那么所有在.htaccess文件里有的指令都将被重写,即允许.htaccess文件覆盖掉Apache 的配置。
(4)Apahce解析机制
Apche解析机制:从右往左开始解析文件后缀,若后缀名不可识别,则继续判断直到遇到可解析的后缀为止。
3.2 具体问题具体分析
可见,属于黑名单验证。
查看源代码,后缀加
.
、(空格)
、::$DATA
、大小写均被拦截。
通过返回的数据包,可知网站中间件为apache,故用特殊可解析后缀进行绕过。
3.3 实验
注意:
- 需要配置apache的后缀解析规则,才能使用特殊后缀名绕过黑名单检测;
- 本靶场搭建在linux上,所以修改
/etc/apache2/mods-available/mime.conf
文件(windows下为httpd.conf文件),增加语句AddType application/x-httpd-php .phptml
;- 如果用不了vim进行编辑,可以是使用
echo "AddType application/x-httpd-php .phptml" | cat >> mime.conf
。
Pass-04 后端检测(黑名单绕过,.htaccess)
4.1 原理分析
.htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件),该配置文件会覆盖Apache服务器的全局配置,作用于当前目录及其子目录。
- 如果一个web应用允许上传.htaccess文件,那就意味着攻击者可以更改Apche的配置。
在httpd.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去找.htaccess文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件;如果设置为All,那么所有在.htaccess文件里有的指令都将被重写,即允许.htaccess文件覆盖掉Apache 的配置。
4.2 具体问题具体分析
黑名单中并没有限制.htaccess
文件的上传,故上传一个.htaccess
文件,文件内容如下:
<FileMatch "shell.png">
SetHandler application/x-httpd-php
大致意思就是把shell.png图片文件当作php代码进行解析。
4.3 实验
先上传.htaccess
文件,再上传shell.png文件,即可。
注意:
- 需要修改
/etc/apache2/apache2.conf
配置文件(windows下为httpd.conf文件),其中的AllowOverride
参数设置为All
;- 使用cat命令进行写入。
Pass-05 后端检测(黑名单绕过,大小写绕过)
5.1 原理分析
原理:windows对大小写不敏感,linux对大小写敏感。
5.2 具体问题具体分析
可以看出后端没有对大小写进行过滤。
5.3 实验
抓包,修改文件后缀。
本靶场搭建再linux环境下,故phP文件无法被解析为php文件。
Pass-06 后端检测(黑名单绕过,空格绕过)
6.1 原理分析
一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
- 末尾的点(
.
) 如1.php.
- 空格(
1.php
- ::$DATA,如
1.php::$DATA
6.2 具体文体具体分析
可以看出后端没有对空格进行过滤。
6.3 实验
Pass-07 后端检测(黑名单绕过,点绕过)
7.1 原理分析
一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
- 末尾的点(
.
) 如1.php.
- 空格(
1.php
- ::$DATA,如
1.php::$DATA
7.2 具体文体具体分析
可以看出后端没有对点进行过滤。
7.3 实验
Pass-08 后端检测(黑名单绕过,::$DATA绕过)
8.1 原理分析
一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
- 末尾的点(
.
) 如1.php.
- 空格(
1.php
- ::$DATA,如
1.php::$DATA
8.2 具体文体具体分析
可以看出后端没有对::$DATA
进行过滤。
8.3 实验
注意,在使用蚁剑进行连接时,不要加上
::$DATA
。
Pass-09 后端检测(黑名单绕过,. .绕过)
9.1 原理分析
一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
- 末尾的点(
.
) 如1.php.
- 空格(
1.php
- ::$DATA,如
1.php::$DATA
9.2 具体文体具体分析
deldot()
函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来。假如文件名为shell.php. .
,deldot函数会删除最后一个点,然后将.php.
转换为小写,再去除特殊字符串::$DATA
,最后去掉空格,得到.php.
绕过检测。
9.3 实验
…待续