这里可以使用parse_url的解析漏洞,具体的可以看看 和 大概是parse_url 是专门用来解析 URL 而不是 URI 的。不过为遵从 PHP 向后兼容的需要有个例外,对 file:// 协议允许三个斜线(file:///…)。其它任何协议都不能这样。 所以使用三个斜线的话就不会被检测到关键词 其实其他考点都是可以绕过的,最主要的反...
php_url *ret =ecalloc(1,sizeof(php_url));charconst*s, *e, *p, *pp, *ue; s =str; ue = s + length;/* parse scheme */if((e =memchr(s,':', length)) && e != s) {/* validate scheme */p = s;while(p < e) {/* scheme = 1*[ lowalpha | digit | "+" | "-" ...
这里可以使用parse_url的解析漏洞,具体的可以看看 一叶飘零师傅的文章 和另一位师傅的文章 大概是parse_url() 是专门用来解析 URL 而不是 URI 的。不过为遵从 PHP 向后兼容的需要有个例外,对 file:// 协议允许三个斜线(file:///…)。其它任何协议都不能这样。
但是这个漏洞利用条件之一就是不开启强制路由~。 那么再往下走,就会到thinkphp.php#parseUrl来解析那个pathinfo。我想这应该就是所谓的兼容模式了。 0x01 模型/控制器/方法的处理 在parseUrl方法中也会把正斜杠替换为|来处理index/\think\app/invokefunction(为了方便下面以url替换这串) 但是与之前的check方法不同的...
1.首先我们需要绕的就是 $url=parse_url($_SERVER['REQUEST_URI']);使得parse_str($url['query'],$query); 中query解析失败,这样就可以在payload里出现flag,这里应该n1ctf的web eating cms的绕过方式,添加 ///index.php绕过。 2.接下来就是需要我们绕过wakeup()里的将$k赋值为空的操作,这里用到的是一枚...
这里会开始进行路由检测,检查$check后会进入else分支导入路由配置,然后接着检测路由表url调度结果$result,如果调度失败并且开启了强制路由$must,就抛出异常,这就是漏洞利用条件之一,接着进入了Route::parseUrl函数,根据$path(我们可控的url)进行模块/控制器解析。
0x02 漏洞分析 当然官方修改代码的位置是在thinkphplibrarythinkroutedispatchModule.php:70,因此可以现在这里下个断点看看。 我们看到传入初始化的url之后,调用链调用了thinkphplibrarythinkroutedispatchurl.php:25,我们来看一下代码。 1 2 3 4 5 6 7
在think\route\dispatch\Url类中找到parseUrl方法,在解析控制器后加上如下代码: if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) { throw new HttpException(404, 'controller not exists:' . $controller);} END
通过parseUrl方法进行解析 先将/替换成|,然后将将传入的$path就行解析 跟进parseUrlPath方法: private static function parseUrlPath($url) { // 分隔符替换 确保路由定义使用统一的分隔符 $url = str_replace('|', '/', $url); $url = trim($url, '/'); ...
这样实际上就是分成了模型、控制器、方法了。最终逐个获取的位置是parseUrl方法的:漏洞原因 当程序执行到thinkphp\library\think\App.php#exec(),会进入到module分支,来到module方法,在:这里的result数组实际上就是刚才parseUrl返回的那个path数组,1=>控制器,2=>操作名(也叫做方法名)。在这里获取了之后,程序没有...