EasyP

先上源码 题目是这个[鹤城杯2021]EasyP


进来就看到一个post传参传guess我傻傻的看了半天不知道secret是啥,后来才知道是迷惑我的
然后就开始考虑正则了,先解释三个函数

$_SERVER['PHP_SELF']
这个是指代调用脚本的路径
比如说这个题目它的值就是/index.php
如果你访问的是
http://127.0.0.1/index.php/utils.php
那么它的值就会是/index.php/utils.php

$_SERVER['REQUEST_URI']
这个跟上面那个函数的区别就是会把后面的参数内容也包含进去

basename

接下来就是要绕过正则了

1
2
3
4
5
6
7
8
9
10
11
if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("hacker :)");
}
这个正则的意思是检查调用脚本的路径末尾是不是utils.php,比如你的脚本
路径是aaa/bbbb那么路径末尾就是最后一个/后面的东西

if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
exit("hacker :)");
}
这个正则就需要用到php的特性了 [ (空格) +  .
上面那几个字符任何一个都行,都可以被处理成_

最后是关于basename的绕过了,这个函数有个特点
如果传入的参数中出现了非ascii字符则会把它给丢弃,中文就不是ascii字符

那么直接上payload
http://node4.anna.nssctf.cn:28192/index.php/utils.php/元神还是原神?show.source=1

还有一个为什么要加一个index.php的问题
peekaboo大佬的wp里面:
为什么前面需要添加一个/index.php呢
因为当我们传入index.php/utils.php时,仍然请求的是index.php,
但是当basename()处理后,highlight_file()得到的参数就变成了utils.php,从而我们就实现了任意文件包含


EasyP
http://example.com/2024/07/15/EasyP/
作者
unjoke
发布于
2024年7月15日
许可协议