由于看了朋友的一篇分析又回头想了想本身去年遇到的这个纠结的问题。php
去年写过一篇phpmyadmin后台文件包含的文章,写的很是的草草,并无分析的过程,只是把本身的问题记了下来。当时纠结于最后一步能经过两次urlencode问号就能再跨出路径了呢,css
payload:html
db_sql.php%253f/../../../../../../windows/system.ini
回头来看其实很容易理解,以前也看到了一篇RPO攻击,里面的路径有点类似,也让我回头来,理解了这个payload。nginx
当时虽然我放上来别人的图片做为个人问题的解答web
其实当时看错了一个地方,致使最后的分析钻了牛角尖。sql
关键的代码在于最后第一个urldecode出了问题windows
$_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; }
咱们两次编码?后,浏览器解析一次%253f转化成%3f,而后这里又解析一次,转化成?,截断到前面的db_sql.php,使其符合了白名单。可是关键的是最后包含的是target,传入的参数,而不是两次urldecode的参数。浏览器
也就是包含的是bash
db_sql.php%3f/../../../../../../windows/system.ini
为何能包含成功呢。服务器
这里的原理就是php将db_sql.php%3f 做为了一个目录,无论他是否是存在的,由于后面有../,会跨越到上级目录。
因此据个人分析,当php遇到这样的包含路径时,不会去检索这个目录是否会存在,只要后面存在../跨越目录,即直接包含后面的路径,直接将这个不存在的路径做为一个目录处理。
形象点比喻就是,执行者无论这个db_sql.php%3f是否是能走的路,他看到了../,他就不会走进这条路,直接按着接下来的路继续走(../../../../etc/passwd)。
再讲的可以理解点就是执行者将db_sql.php%3f/../看做了一个总体,看到了../,他就无论db_sql.php%3f是否是条路了。
文件夹A中有a.php,b.php,上层目录B中有echoa.php
echoa.php <?php $a='php_test_heihei'; ?>
a.php <?php include "b.php/../../echoa.php"; echo $a;
测试特殊字符串:!@#$%^&*()-_ []{}<>~`+=,.;:/?|"'\
fuzz发现,只有出现?或者*时候,include会包含错误,输出不了$a。
其余的拼接特殊字符都可以完成目录穿越。include到echoa.php
结束
是暑假时候经过郁离歌强网杯的WP了解到的RPO攻击,忘记写了,这里补上。
这里简单概述下记录下,Freebuf有篇讲的很详细的,放在文章下方连接处l。
RPO (Relative Path Overwrite)相对路径覆盖,做为一种相对新型的攻击方式,由 Gareth Heyes在2014年首次提出,利用的是nginx服务器、配置错误的Apache服务器和浏览器之间对URL解析出现的差别,并借助文件中包含的相对路径的css或者js形成跨目录读取css或者js,甚至能够将自己不是css或者js的页面当作css或者js解析,从而触发xss等进一步的攻击手段。
触发这个漏洞有两个基本的前提:
①Apache 配置错误致使AllowEncodedSlashes这个选项开启(对Apache来讲默认状况下 AllowEncodedSlashes 这个选项是关闭的),或者nginx服务器。
②存在相对路径的js或者css的引用
对于第一个场景,服务端对url的解析,将%2f自动解码为/。而浏览器对url的解析,不认得%2f,服务器返回的页面后,在加载相对路径下的js时,浏览器将..%2f..%2fxxx看成一个文件,而不会解析为路径,因此连接到相对路径的js文件时,会跨目录,连接
对于第二个场景,好比访问/index.php/view/article/98749/..%2F..%2F..%2F..%2Findex.php,服务器解析url,请求的时index.php,index.php下有一个外部脚本js连接,scr=1.js。客户端解析后,将..%2F..%2F..%2F..%2Findex.php看成一个文件,而后在当前目录连接1.js,即连接/index.php/view/article/98749/1.js(然而这是个98749.html文件,这里个人理解是,直接将这个页面看成1.js解析),而且不须要script标签,直接做为外部引入的js文件处理。所以能够结合xss漏洞利用。
参考连接:
https://www.freebuf.com/articles/web/166731.html