该文章为菜鸡臆想,有错误请各位师傅指出Orz
apache版本为2.4.34
有这么一道题目,源码如下:
简单分析一下代码,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 为 .@c7f.zhuque.com/..// ,使用 burpsuite 抓包重发杰克
那么 apache 会怎么处理这个 URI 呢?
在 apache 源码中有一个函数名为 ap_process_request_internal :
而在此函数中主要会调用两个函数 ap_getparents 和 ap_location_walk -> ap_no2slash 对 URI 进行处理
ap_getparents:
ap_no2slash:
主要的处理分两部分:
1. 处理 URI 中的 " . " 和 " / ",比如:
所有的 " ./ "
尾部的 " . "
所有的 " xx/../ ",包括位于开头的 " ../ " 和 " /../ "
尾部的 " xx/.. "
2. 处理多余的 " / " 斜杠
所以, .@c7f.zhuque.com/..// 经过处理后就会变成 / ,即 index.php
经过拼接变成 http://127.0.0.1.@c7f.zhuque.com/..// 根据 parse_url 解析的规则,最后解析得到的 host 即为 c7f.zhuque.com
作者水平有限,如有错误请指出Orz