BUU-Web-Easy Calc
第一步:对题目进行简单的分析

访问后,可以通过源码发现是通过encodeURIComponent对内容编码后发送到calc.php内

encodeURIComponent

简而言之就是对发送的字符串进行urlencode编码
如【?】就变成了【%3F】
可以使用在线的urlencode/urldecode工具,也可以使用Python或者其他的语言进行加/解密
访问calc得到源文件

我们可以发现其中的函数
show_source: highlight_file的别名,作用都是 将__FILE__中的内容显示出来,就是我们看见的这个源代码

foreach: 将$blacklist中的内容依次取出 作为$blackitem

preg_match: 对目标进行正则匹配



“.”的作用是拼接前后内容,拼接后就是/$blackitem/m
/[content]/m,不对大小写敏感
eval: 执行收到的php指令

第二步:漏洞测试
在这个地方卡了好久,最后查阅WriteUP发现,WAF和我们现在看见的源文件不是同一个文件。
这里是一个PHP解析漏洞,利用PHP对URL获取的$_GET/$_POST以数组存储时会先进行一次转换如【?test=23333】会转换为【Array(['test'] => 2333)】
我们可以使用parse_str来模拟url解析的过程

这里我们可以看出在urlcode为[20,26,00,3d]时会删去,为[20,2b,2e,5b,2f]会转化为“_”
因此我们可以构建payload
【?%20num=var_dump(scandir(chr(47)))】查看根目录,因为“ " ”和“ / ”被过滤了,所以我们这里使用chr函数对ascii码进行编码绕过

可以获取到根目录下存在f1agg文件
然后构建payload【?%20num=var_dump(file_get_contents(chr(47).f1agg))】
最终拿到flag

最后调用的几个函数
chr ([ascii_code]): 将ASCII码转化为字符
scandir( [path] ):列出指定[path]路径下的文件和目录
var_dump: 将Arry类型的内容取出


