漏洞绕过方式
前端绕过
实验工具
PHPstudy
upload-labs项目地址:https://github.com/c0ny1/upload-labs
upload-labs-writeup:项目地址:https://github.com/LandGrey/upload-labs-writeup
Burpsuite
webshell管理工具
一句话木马
2.环境部署:
项目地址:https://github.com/c0ny1/upload-labs
1.下载解压到PHPstudy的www下phpstudy_pro >Www
2.更改文件名为upload
3.输入项目路径,进行访问
绕过方式1:
1.使用JS插件禁用前端验证:Script Blocker Ultimate Script Blocker Ultimate 是一款浏览器扩展程序,其主要功能是拦截和阻止网页上的JavaScript脚本运行。Allow all是打开前端验证,Block all是关闭前端验证(图片上传后需要验证它的位置与名字,在有些安全机制中是会给图片重命名的)
2.浏览器设置禁用:F12-F1在设置下面是可以禁用JavaScript的,禁用后就可以正常上传了,若上传webshell后无法使用管理工具进行链接则可使用 链接码=phpinfo();进行判断(phpinfo可以展示php环境配置,因此可得出若木马没生效则页面无信息,生效则返回正常信息)
3.分析前端代码
上传数据一般是通过form表单进行上传(并不是只有form,还有axios
(简化 AJAX 上传)、resumable.js
(分块上传)、Dropzone.js
(拖拽上传组件)等),因此右击查看页面源代码ctrl+f
以图中为例:
enctype属性(只有method=post”时才使用post属性):表明数据提交格式,规定将表单数据发送到服务器之前,如何对数据进行编码。
语法<form enctype="value">
属性值
application/x-www-form-urlencoded默认。在发送前对所有字符进行编码(将空格转换为”+符
号,特殊字符转换为ASCII HEX值)。
multipart/form-data不对字符编码。当使用有文件上传控件的表单时,该值是必需
的。
text/plain将空格转换为”+”符号,但不编码特殊字符。
method属性:规定表单提交数据方式,如POST,GET
onsubmit属性(只再提交表单时触发):当提交表单时执行一段JavaScript脚本
语法:<form οnsubmit=" script">
属性值
script: onsubmit发生时运行的脚本。
onsubmit属性为return checkFile()是将内容在checkFile方法中进行运输或者过滤,因此删掉checkFile为true即可
4.BP抓包 在BP中改数据包内容再发生即可
后端绕过
后端校验由开发决定是检测文件后缀,还是文件内容
文件类型绕过
MIME类型
1.定义:是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时
候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒
体文件打开方式。MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
(如.exejpg等他是通过文件后缀来判断的)
2.语法:type/subtype
3.参数:type表示可以被分多个子类的独立类别,subtype表示细分后的每个类型
4注意:I左右无空格,MIME类型对大小写不敏感,但大部分都是小写
5.默认MIME类型:
·text/plain表示文本文件的默认值。
·application/octet-stream表示所有其他情况的默认值。
6.常见的MIME类型(应用就是根据相关的文件类型/文件后缀来进行识别或打开)
超文本标记语言html:text/htmll
普通文本.txt:text/plain
RTF文本.rtf:Iapplication/rtf
GIF图形.gif:image/gif image/png
JPEG图形.jpeg、jpg:image/jpeg
au声音文件.au:audio/basic
MIDI音乐文件.mid、midi:audio/midi、audio/x-midi
RealAudio音乐文件.ra、ram:audio/x-pn-realaudio
MPEG文件.mpg、mpeg:video/mpeg
AVI文件.avi:video/x-msvideo
GZIP 文件.gz:application/x-gzip
TAR文件.tar:application/x-tar
步骤:
1.上传.PHP文件到服务器
2.上传文件并使用BurpSuite捕获请求
3.修改MMlE类型,将内容类型也更改为由1/php更改为image/jpeg
4.转发请求发包上传
5.进行访问验证
后端代码大致如下
首先第一个if用isset对post中参数submit进行检测判断是否已被设置且非空,之后又检测了我们要保存的这个文件路径是否存在,再之后对文件类型进行了检测判断type是否为jpeg或者png等(要gif再加即可),然后temp_file对文件进行了临时保存,在之后又对文件路径进行了移动(看上去是非常安全了)还有三个else主要是提示上传出错,是否为指定类型(绕过方法通过BP进行抓包修改)
黑名单绕过
1、黑白名单机制:
黑名单:黑名单中文件不允许通过
白名单:白名单中文件允许通过
2、黑白名单判断
随便打一串后缀,黑名单不会拦截,但白名单不允许上传
3、具体绕过方式
1.同解析后缀名(改后缀名)
通过程序自身过滤机制,过滤不严谨。有许多后缀不为PHP,但仍会默认被解析为PHP的后缀扩展名列表。(文件后缀不是PHP但文件解析方式和PHP一样,因此该方式也可以解析出PHP文件)
黑名单中:php
白名单中:php3
PHP: .php .php2~7 .phpsphp .phtm .pgif .shtmlhtaccess .phar .inc
ASP: .asp .aspx .confg .ashx .asmx .aspq .axd .cshtm .cshtm .rem .soap .vbhtm .vbhtml .asa .cer .shtml
Jsp: .jsp .jspx .jsw .jsy .jspf .wss .do .action
web服务器: .yaws
闪存:.swf
过滤代码大致如下
首先也是用isset对post的传参进行检查,再检测文件上传路径是否存在,检测方式有黑名单校验(deny)经用lasp aspx php jsp,之后进行了删除文件名末尾的点再进行避免大小写绕过全转为小写,同时去除了尾部的字符串::$DATA,这是一个文件流,在windows文件流中我们创建了一个文件它的末尾是默认用::的,因此.txt文件与.txt::文件指同一个,因此可以通过文件流进行绕过,然后收尾去空这样的一个安全机制。然后就是对我们上传的文件进行一个临时存储与重命名,但这里的重命名规则是当前的日期时间和一个随机数再加上经过安全机制修改过的一个文件后缀
.htaccess文件绕过
1.定义:
.htaccess文件(HypertextAccess)超文本入口。本质为Apache配置文件,提供了针对目
录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作
用于此目录及其所有子目录,管理相关目录下的网页配置。(相当于一个管理文件,加入我们把它放到1.文件夹里面那么当前文件夹下的所有文件都将通过.htaccess文件进行管理)
2.使用.htaccess限制条件
1.Apache环境
2.允许.htaccess文件使用,httpd.conf配置文件中AllowOverride参数设置为All(默认为None)。修改后需对Apache进行重启
httpd.conf文件路径:phpstudy_pro\Extensions\Apache2.4.39\confhttpd.conf
指明Apache服务器是否去找htacess文件作为配置文件,如果设置为none,那么服务器将忽略 .htacess文件,如果设置为All那么所有在htaccess文件里有的指令都将被重写。
3 .htaccess功能
:目标开启.htaccess并且上传黑名单没有限制.htaccess文件,先上传.htaccess文件,对目标环境的目录进行相关配置,在上传图片,使图片的PHP恶意代码得以被直接解析执行。(绕过方法)
a访问控制:限制用户访问目录或文件。
大小写空格绕过
后缀大小写绕过(主要针对黑名单,猜测对方禁用规则)
php.asp jsp PHPpHP
大小写绕过黑名单机制,可以用bp辅助进行fuzz测试。配合后缀,到intruder里进行爆破
2.具体绕过步骤
先上传图片,用bp抓包修改后缀名,发送到intruder模块,对文件后缀位置进行后缀名爆破
文件后缀名(空格)“." ”_”绕过(也是黑名单绕过方式)
1.php 与1.php(前面个末尾有空格,实际上看起来不明显但却可以绕过)
windows文件流绕过()
1.定义:
文件流(本地文件系统)::$DATA(Windows文件流绕过)(这里利用到了NTFS交换教据流
(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数
据流。简单理解,就是其它文件可以”寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,不到寄宿文件。
2.限制条件:只有Windows下可以使用
3.利用文件流藏文件方法
比如我们将pwj写入到5.txt中,但由于5.txt寄宿在4.txt上因此5.txt及内容都会被隐藏
桌面上的实际内容为4.txt且文件内容为空
在cmd窗口中输入
notepad 4.txt:5.txt便可以查看到该文件及内容
改原因是因为当我们在磁盘上创建文件时,实际上的默认创建流程是加了:$DATA
因此我们看见的4.txt其实后边还默认加了文件流4.txt::$DATA,因此我们可以通过windows文件流的方式进行绕过,如我们上传一个1.php会被安全机制拦截但换成1.php::$DATA则可以上传(针对黑名单,且安全机制不过滤文件流)
其次是当文件上传到服务器后,文件末尾会自动省略掉:$DATA后缀,所以访问时,要把后面文件流去掉,直接输入文件名即可(1.PHP)
双写绕过
如1.pphphp等,过滤代码大致如下
也是isset进行校验,路径排查,黑名单过滤文件,然后对空格进行删除,之后replace进行替换将黑名单中的文件名替换为空再存储,但它的这个机制没有进行递归,也就是是它只检查一遍,因此它可以过滤掉1.PHP但却无法过滤1.PPHPHP