从一道题看apache处理URI

该文章为菜鸡臆想,有错误请各位师傅指出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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,886评论 18 139
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,781评论 24 1,002
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,533评论 1 92
  • Awesome PHP 一个PHP资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、W...
    guanguans阅读 5,825评论 0 47
  • 我看见阳光 沿死亡之路走来 有逝者的哀叹 有罪人的呻吟 生命在一堵土褐色的墙上 伸展其银灰色的头 我的沉默变成 虚...
    清冷一曲阅读 516评论 2 13