上一篇文章中,介绍了PHP语言的 弱类型和反序列化特性,这一篇介绍 截断、伪协议和变量覆盖特性,这三点内容也常常出现在CTF考试中。
- 截断
因PHP内核是C语言实现的,当PHP字符串处理遇到NULL(x00)时,就会当作字符串结束标志来处理。在CTF比赛中,我们可以利用这个特点处理掉变量末尾我们不需要的字符。
如果一段PHP代码如下所示,
<?
正常在上一段代码中是不存在包含任意文件漏洞的,如果借助NULL可以实现任意文件包含。例如:我们构造以下 payload,
?file=../../etc/passwd%00
即可读到 passwd 文件内容。
当然,随着PHP版本更新,这个漏洞已经被修复。
~~ 码字收集资料不易,大家不要光顾着收藏哦,记得点赞!~~
~~ 码字收集资料不易,大家不要光顾着收藏哦,记得点赞!~~
~~ 码字收集资料不易,大家不要光顾着收藏哦,记得点赞!~~
- 伪协议
伪协议是指PHP可以通过一些自定义机制可以读取计算机中的文件。在CTF比赛中,单独考察伪协议内容较少,结合其他考点一起考。
PHP使用伪协议读取文件,需要先在PHP设置文件中,配置两个参数如下,之后才可以通过伪协议读取文件。
allow_url_fopen
PHP语言支持的伪协议有以下几种,
php
当源码中,遇到以上函数时,可以考虑是否有伪协议内容作为考点。
考试中,通常遇到的场景时用以下读取。如果服务器中存在 index.php 而且存在文件读取漏洞,通过下面的payload可以读取到 base64编码后的字符串。
php
- 变量覆盖
变量覆盖是指因PHP中的某些函数使用不当导致用户输入的变量覆盖当前变量。主要涉及到extract函数、parsestr函数、import_request_variables函数。上面三个函数的作用是一样的,就是将用户输入的鼻梁复制到当前工作目录,并覆盖当前的变量。
看一个例子,
<?
上面是一段伪代码,当我们输入
?
可以覆盖原来预设的sss这个变量,可以输出flag。
- 参考文献
- PHP伪协议在CTF中的应用
- CTF特训营:技术详解、解题方法与竞赛技巧