专栏首页ChaMd5安全团队PHP源码分析之parse_url()的2个小trick

PHP源码分析之parse_url()的2个小trick

前言:

之前从phithon师傅的代码审计小密圈看到pupiles师傅发过一篇文章,讲了parse_url()的很多小tricks,可惜只是给出了tricks的利用方法,并没有从底层原理上进行分析,正好我最近也在研究PHP源码,于是就给分析了一波。

本文测试使用的PHP版本为7.0.30

pupiles师傅的原文链接:

http://pupiles.com/%E8%B0%88%E8%B0%88parse_url.html

函数分析:

parse_url()定义在\ext\standard\url.c中第337行

第334行调用zend_parse_parameters()对参数进行解析,第一参数就是传入的URL字符串,第二个参数是可选的我们暂时不做研究。

第348行,调用php_url_parse_ex()对URL字符串进行解析,返回值保存在resource中,resource定义在341行,是一个php_url类型的结构体:

跟入php_url_parse_ex()

这个函数接收两个参数,分别是URL字符串和其长度

第100行声明了一个ret指针并为其分配了一个php_url结构,用于保存返回值

之后初始化s指向字符串开头,ue指向字符串结尾

第一个trick:

此时我们传入的字符串为 /pupiles.com:80
第107行把e指向了字符“:”所在的位置
第109行把s赋值给p

此时的指针结构入如下:

112行的if中有四个条件:

1.*p非字符

2.*p非数字

3.*p != ‘+’

4.*p != ‘-’

很明显,p指向的第一个字符是’/’,满足上述条件

113行再次进行判断,其中两个条件:

1. e + 1 < ue,由上图知e + 2 == ue,故条件满足

2. e < s + strcspn(s,"?#"), 由于字符串s中没有出现字符?和#,因此strcspn()返回s的长度15,e < s + 15,满足条件

114行 goto parse_port;

parse_port在第177行:

执行到第179行时指针结构如下:

181行的循环之后:

185行中if条件满足

187行中,因为pp - p == 2,所以把从指针p开始的两个字符复制到port_buf中,port_buf定义在99行:

188行追加一个空字符终止字符串,此时port_buf的值为: 80\0

189行从port_buf解析出port并在191行赋值给ret结构体的port成员

至此port解析完成,进入到215行的parse_host:

217行把ue赋值给e:

218行把p指向了字符’/’的位置:

219行把p赋值给e:

此时 e == s,故不会进入229行的if

继续向下:

246行的if不满足,进入到251行的else中

找到zend_memrchr()的定义:

传入的参数n即(e-s),由于e == s,即e - s == 0,可知n == 0

在zend_memrchr()的第189行,可知n <= 0时返回NULL

因此p == NULL,不会进入255行的if,而是进入到281行的else中:

281行把e赋值给p,还是和之前一样:

286行由于p == s,因此(p-s) < 1成立,291行return NULL,函数返回

自己写一个PHP文件测试一下:

<?php

$url = $_GET['url'];

var_dump(parse_url($url));

第二个trick:

实测一下:

在端口号之后加一个字符就会被当做path解析了,神奇!

继续分析一波:

这个字符串的解析过程和上述基本一致,不同发生在了parse_port中:

在185行时各指针如下:

由于此时185行的if不满足因此会进入到207行,跳转到just_path中:

305行把ue赋值给e:

由于字符串中不存在字符’#’和’?’

因此306和316行的if都不满足

326行s < e为真,之后设置了ret结构的path成员

331行返回结构体ret

后记:

本人不才,看C看的好心累,只分析了前两个trick,剩下的trick有兴趣的师傅欢迎投稿分享~!

本文分享自微信公众号 - ChaMd5安全团队(chamd5sec),作者:呆哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP代码审计要点

    随着代码安全的普及,越来越多的开发人员知道了如何防御sqli、xss等与语言无关的漏洞,但是对于和开发语言本身相关的一些漏洞和缺陷却知之甚少,于是这些点也就是我...

    HACK学习
  • PHP中使用DOMDocument来处理HTML、XML文档

    其实从PHP5开始,PHP就为我们提供了一个强大的解析和生成XML相关操作的类,也就是我们今天要讲的 DOMDocument 类。不过我估计大部分人在爬取网页时...

    硬核项目经理
  • Apache Hive Length

    DataScience
  • PHP代码审计笔记

    http://blog.evalbug.com/2015/11/10/different_arrays_compare_indentical_due_to_in...

    用户5878089
  • PHP的URL处理

    完整URL地址: http://username:password@hostname/path?arg=value#auchor

    Java架构师必看
  • PHP模拟发送POST请求之二、用PHP和JS处理URL信息

    明白了HTTP请求的头信息后,我们还需要对请求地址有所了解。再者,HTTP GET请求是靠URL实现的,所以了解URL的构造,处理URL的重要性不言而喻。 在P...

    枕边书
  • Discuz x3.4 前台 SSRF 分析

    2018年12月3日,@L3mOn公开了一个Discuz x3.4版本的前台SSRF,通过利用一个二次跳转加上两个解析问题,可以巧妙地完成SSRF攻击链。

    Seebug漏洞平台
  • 一篇文章深入学习SSRF漏洞

    博客原文地址: https://hack-for.fun/posts/20200120/

    IFONLY@CUIT
  • 学习PHP中的URL相关操作函数

    在日常的业务开发过程中,我们经常会有处理 URL 链接的需求,所以今天学习的函数其实都是大家经常会使用的一些函数。在之前的工作过程中,其实我对这些函数都只是有一...

    硬核项目经理
  • 2019国赛部分题目WP---NEX的小老妹

    根据提示,可能存在文件包含 尝试一下php://filter/convert.base64-encode/resource=index.php 打到源码 ind...

    安恒网络空间安全讲武堂
  • 常用函数之字符串时间等

    mysqli_real_escape_string() — 使用反斜线引用字符串 sql注入

    老雷PHP全栈开发
  • PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息

    了解完了HTTP头信息和URL信息的具体内容,我们开始尝试自己动手写一段头信息发送到服务器。Windows内置命令Telnet可以帮助我们发送简单的HTTP请求...

    枕边书
  • filter_var函数缺陷

    大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。...

    猿哥
  • 跟我学习php字符串常用函数-下篇

    1> mixed parse_url ( string $url [, int $component = -1 ] )

    潇洒哥和黑大帅
  • 常用函数之字符串时间等

    mysqli_real_escape_string() — 使用反斜线引用字符串 sql注入

    老雷PHP全栈开发
  • PHP代码审计Day2 - filter_var函数缺陷

    --------------------------------------------------------------------------------...

    用户1631416
  • 正则表达式学习笔记

    正则表达式学习笔记 (原创内容,转载请注明来源,谢谢) 首先,学习正则表达式,很推荐一篇博客,http://www.cnblogs.com/deerchao...

    用户1327360
  • [红日安全]代码审计Day2 - filter_var函数缺陷

    大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。...

    红日安全
  • 写给PHP开发者的五个建议

    沈唁

扫码关注云+社区

领取腾讯云代金券