目录
后端黑名单绕过
特殊可解析后缀
原理:就是加上数字等,但是可以被当做原来的类型进行执行
利用过程:
.htaccess解析
原理:上传.htaccess文件到指定的目录,重写当前目录下的解析规则,上传图片马,打开图片马所在位置将以新指定的方式解析运行
环境条件:
利用过程:
大小写绕过
原理:对大小写不敏感,上传大小写混写的php进行绕过
利用过程:
重写(双写)绕过
原理:被删除一个黑名单字符后,形成新的预期类型
利用过程:
‘.’或者空格点绕过
原理:还是相当于是绕过了黑名单
第一步:打开burpsuite进行代理拦截
第二步:把shell.php文件改为shell.png,然后将其上传
第三步:用burpsuite进行抓包修改,把后缀改为php,并在后缀后面加上空格或者点
第四步:获取webshell权限,即浏览器打开上传的图片马地址
第五步:使用工具(蚁剑/菜刀)进行连接等操作
利用过程:
::$$DATA绕过
原理:
换言之:
第一步:burpsuite拦截
第二步:文件上传
第三步:抓包修改,后缀改为php,并在后缀后面加上::$DATA
第四步:获取webshell权限,即浏览器打开上传的图片马地址
第五步:使用工具(蚁剑/菜刀)进行连接等操作
利用过程:
配置解析漏洞
原理:
触发点:
利用:
以Apache解析漏洞为例
第一步:新建一个Apache无法正确解析识别的文件
第二步:在这个文件里面写入执行语句
第三步:获取wheshell权限,即访问这个文件所在的位置
后端白名单绕过
MIME绕过
原理:服务端MIME类型检测通过检查http包的Content-Type的值来判断上传文件是否合法。
利用过程:
第一步:上传写入语句的执行类型文件,即.php文件
第二步:用burpsuite等代理工具进行抓包,修改Content-Type字段的值为image/jpeg
第三步:放包
第四步:获取webshell权限,即浏览器打开上传的图片马地址
第五步:用蚁剑等工具进行连接操作等
%00截断
原理:
利用过程:
0x00截断
原理:
环境:
利用过程:
0x0a截断
原理:
利用过程:
upload-labs靶场下载地址:https://github.com/c0ny1/upload-labs/
第一次下时候,没下最新版的,结果我又重新到GitHub去下载了更新后的最新版
(注:此博文从绕过原理方法入手,下篇博客将从upload-labs刷关入手)
黑名单规则不严谨,在某些特定环境中某些特殊后缀仍会被当作php文件解析
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
盲猜准备的php20就不在范围内
再获取webshell权限,即浏览器打开上传的图片马地址
接下来的工作交给蚁剑和菜刀了
参考:【文件上传.htaccess重定解析规则】phpstudy apache本地配置.htaccess进行url重写
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置,即可以用来控制所在目录的访问权限以及解析设置,通过设置可以将该目录下的所有文件作为php文件来解析。
通过.htaccess文件,可以帮我们实现:自定义404错误页面、网页301重定向、允许/阻止特定的用户或者目录的访问、改变文件扩展名、禁止目录列表、配置默认文档等功能。
.htaccess可以写入apache配置信息,改变当前目录以及子目录的apache配置信息
phpstudy+php5.6以下不带nts的版本
upload-labs-Pass04
服务器和服务商没有禁止.htaccess文件
Allow Override All
LoadModule rewrite_module modules/mod_rewrite.so #rewrite模块为开启状态
第一步:准备好.htaccess文件内容:
第一种:会误伤正常文件,容易被发现
AddHandler php5-script .gif #当前目录下,只针对gif文件解析成php执行
SetHandler application/x-httpd-php #当前目录下,所有文件都被解析成php执行
或者直接
AddType application/x-httpd-php .gif
第二种:能精确解析,不容易被发现
SetHandler application/x-httpd-php #在当前目录下,如果匹配到1.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif #在当前目录下,如果匹配到1.gif文件,则被解析成PHP代码执行
第二步:准备好图片马
在1.gif中写入了(测试一下能否执行)
#一般都写入
准备好
第三步:先上传 .htaccess文件,再上传图片马
上传写了代码的要执行文件(图片马)
第四步:获得webshell权限,即复制图片地址并粘贴到地址栏,进行访问:
尝试用到 .htaccess文件试试
将.htaccess文件尝试改为:
setHandler application/x-httpd-php
未被执行为PHP类型
试了很多不同的.htaccess文件代码,最终还是没能以PHP代码执行,可能环境条件不满足
后端一般验证后缀字符串是否和‘php’相等(前提是没有将你传入的字符串进行小写转换后再对比),大写字母和小写字母肯定不相等,利用这一特性绕过
windows对大小写不敏感,所以.PhP文件被当成php文件解析)
准备文件:
当检测不全面的时候,还是有各种混乱进行绕过
服务端将黑名单的后缀名替换为空,但是仅替换一次,所以可以上传.pphphp后缀,替换后就成了.php
(被拦截的shell.php,上传不了的这个我就不一直试了)
它会删掉第一个php
(中间第二个是错误的讲解)
正确的应该是第三个
(不考虑直接把空格或者点加在后缀的末尾,因为在PHP文件后加..,会被windows删掉空格或者点)
shell.png------>shell.php.(空格). ------>shell.php.(空格和点被去除了)---->shell.php(windows会自动去掉末尾的空格和点,这个可以在自己的桌面上新建的试)
我实验的环境:在主机上安装的靶场,burpsuite安装在虚拟机上
我遇见的问题是:burpsuite抓包,无法抓住文件的上传,并将其修改
现象是:拦截不到包,但是访问其他联网的网站,可以拦截到
我分析得出的结论是:upload-labs的上传是在本地完成,不需要再访问另一台电脑上的burpsuite代理服务器
NTFS交换数据流(Alternate DataStreams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。
在windows下,在php文件名后面加上::$DATA
系统会把它当作文件流来进行处理,不会检测文件的后缀名,且保留::$DATA之前的文件名以及后缀
(不考虑直接在windows上新建,因为::已经被windows所禁止输入)
加::$DATA的操作过程和前面的加‘.’和空格是一样
shell.png------>shell.php.(空格). ------>shell.php.(空格和点被去除了)---->shell.php(windows会自动去掉末尾的空格和点,这个可以在自己的桌面上新建的试)
解析漏洞是web容器将其他格式的文件解析为可执行脚本语言,这一特点会被利用进行其他操作
常见的解析漏洞的web容器有IIS (5.x-6.x 7.5)、Nginx、Apache
目录解析,文件解析,其他默认可执行文件格式等。
Apache解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。
影响版本:
Apache 1.x
Apache 2.2.x
查看Apache版本:
方法一:
如果安装的phpstudy集成环境,那这个就简单了
打开phpstudy面板首页就能看到
方法二:
打开Apache\bin目录,复制绝对路径
用命令提示符进入到Apache\bin中,再执行下面语句查看Apache版本信息:
httpd -v
或者直接在Apache\bin执行命令提示符
(按住shift键,同时点击右键,点击Open in Windows Terminal)
然后会直接在当前目录执行
再输入以下代码查看版本
.\httpd.exe -v
我的版本已经Apache2.4,已经不存在上面的解析漏洞了
但是操作不能少
(存在解析漏洞的版本会将这个软件识别为a.php文件执行)
(老生常谈又是你)
web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。
常见的MIME类型(/后面为对应的MIME值)
超文本标记语言文本 .html,.html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF图形 .gif image/gif
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
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
./?filename=test.txt 此时输出的是test.txt
./?filename=test./?filename=test.php%00.txt 此时输出的是test.php
0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制,%00被服务器解码为0x00发挥了截断作用
php版本小于5.3.4
magic_quotes_gpc需要为OFF状态
第一步:准备一个写入执行语句的php文件,在PHP后缀后加上空格(占位作用,空格的16进制为0x20)和任意其他字符(便于标识)
第二步:用burpsuite等工具设置代理
第三步:上传文件
第四步:抓包并打开hex表,将空格对应的16进制(0x20,会显示出20)将20改为00实现截断
第五步:放包
修改完空格hex值后,空格被□取代,就是0x00(不可见字符),系统读到0x00时就认为已经结束了
查看ASCII表,可以发现0x0a是换行即\n,当读取到\n时会进行换行,后面的将不会读取
和0x00类似