这一题纯属就是障眼法,和我们的随机数毫无关系

    利用basename()夸目录读文件特性[Zer0pts2020]Can you guess it? - 图1

    绕过guess是不可能的,hash_equals也是很安全的hash比较函数。只能从$_SERVER['PHP_SELF']下手。此时想要读config.php,你就会发现正则是个很棘手的问题。

    但是其实仔细看可以发现这里有蹊跷:

    利用basename()夸目录读文件特性[Zer0pts2020]Can you guess it? - 图2

    正则ban掉了config.php。然后会highlight_file():

    利用basename()夸目录读文件特性[Zer0pts2020]Can you guess it? - 图3

    可以发现这里加上了basename(),可能是为了夸目录读文件,而问题正好出在了这里,演示:

    利用basename()夸目录读文件特性[Zer0pts2020]Can you guess it? - 图4

    当我访问zz.php时,我可以在后面加上一些东西,比如/test.php/config.php,这样仍然访问的是test.php,但经过basename()后,传进highlight_file()函数的文件名变成了12.php,如果能够绕过那个正则,就可以得到config.php源码了,而题目告诉FLAG就在config.php里,这道题就昨晚了。所以说。爱国随机数就是个障眼法。

    可以发现,这个正则匹配了config.php/为$_SERVER[‘PHP_SELF’]的结尾

    利用basename()夸目录读文件特性[Zer0pts2020]Can you guess it? - 图5

    老套路了,可以用%0d之类的来污染绕过,这样任然访问得到index.php:

    /index.php/config.php/%0d 然后尝试在后面加上?source但是却失败了。这里绕过正则主要是通过后面填充一些东西来绕过正则中的<font style="color:#000000;">$</font>,于是写了个脚本跑一下看看什么东西能成功:

    <font style="color:#000000;background-color:#FADB14;">import</font><font style="color:#000000;background-color:#FADB14;"> requests</font>

    for i in range (0,500): url = http://3.112.201.75:8003/index.php/config.php/{}?source.format(hex(i).replace(‘0x’, ‘%’)) r = requests.get(url) if r”zer0pts” in r.text: print(url) print(r.content) break 跑一下得到flag: