从一道题看apache处理URI

该文章为菜鸡臆想,有错误请各位师傅指出Orz

apache版本为2.4.34


有这么一道题目,源码如下:


从一道题看apache处理URI_第1张图片

简单分析一下代码,getflag 主要有两个条件:

1. URI 中不能含有 " . " ,这是由 if 和 stripos 来判断的,但是由于php的弱类型匹配,所以如果 stripos($uri,".") 为 0 也可以通过检查

2. URI 经过 parse_url 解析后,其 host 要严格相等于 c7f.zhuque.com

首先要明确一点,c7f.zhuque.com 中肯定要有 " . " ,parse_url 似乎也不会把非法字符变成 " . ",那我们就需要绕过 if 和 stripos 的检查,也就是说 URI 的第一个字符要为 " . " ,而与此同时,apache 也要能够通过这个 URI 访问到 index.php

最后可用的 URI payload 为 [email protected]/..// ,使用 burpsuite 抓包重发杰克

那么 apache 会怎么处理这个 URI 呢?

在 apache 源码中有一个函数名为 ap_process_request_internal :

从一道题看apache处理URI_第2张图片

而在此函数中主要会调用两个函数 ap_getparents 和 ap_location_walk -> ap_no2slash 对 URI 进行处理

ap_getparents:

从一道题看apache处理URI_第3张图片
从一道题看apache处理URI_第4张图片
从一道题看apache处理URI_第5张图片

ap_no2slash:

从一道题看apache处理URI_第6张图片

主要的处理分两部分:

1. 处理 URI 中的 " . " 和 " / ",比如:

        所有的 " ./ "

从一道题看apache处理URI_第7张图片

        尾部的 " . "

从一道题看apache处理URI_第8张图片

        所有的 " xx/../ ",包括位于开头的 " ../ " 和 " /../ "

从一道题看apache处理URI_第9张图片
从一道题看apache处理URI_第10张图片
从一道题看apache处理URI_第11张图片

 尾部的 " xx/.. "

从一道题看apache处理URI_第12张图片

2. 处理多余的 " / " 斜杠

从一道题看apache处理URI_第13张图片

所以, [email protected]/..// 经过处理后就会变成 / ,即 index.php

经过拼接变成 http://[email protected]/..// 根据 parse_url 解析的规则,最后解析得到的 host 即为 c7f.zhuque.com



作者水平有限,如有错误请指出Orz

你可能感兴趣的:(从一道题看apache处理URI)