前置知识
eval: 把字符串按照 PHP 代码来执行,例如eval(“echo 1;”);这个函数拥有回显
system:使php程序执行系统命令,例如,system(“ls”);就是查看当前目录,这个拥有回显
preg_match:查找字符串是否匹配一个正则表达式。参数1是正则表达式,参数2是字符串,其他可选参数请自行学习
linux基础命令:
- ls:展示当前目录下的所有文件
- cat:输出当前文件的所有内容
- tac:从最后一行开始逐行向上遍历输出当前文件的所有内容
信息收集
这里学习php不是一蹴而就的,我刚开始学习的时候也是直接搭建了php的网站,把题目复制到本地,然后自己调试,以此来学习php的函数。我希望读者也能如我一样有一个自己的php网站,用于学习这些php函数代码。
这里的preg_match("/flag/i", $c)
表示变量$c
是否存在flag这个子字符串,最后的/
表示需要遵循的匹配规则,i
是大小写忽略
所以这句代码的意思是,$c
里是否有flag,大小写忽略,例如fLAg也能正确匹配
而取反后,我们的提交的参数c不能包含flag字样
解题
这里仅提供一些解题的思路,起到抛砖引玉的作用,我不可能列举出所有的方法,想到啥就写啥了。
这里我们使用system(“ls”);查看当前目录,是否存在我们想要的flag
方法1
接下来,我们本应该system("cat flag.php");
即可,但flag被过滤了,我们的输入中有flag就不会执行eval。想要绕过flag非常简单,只需要tac fla*
就可以了
为什么不用cat而是tac呢,因为cat获取了完整的php内容,包括<?php ... ?>和注释,这会被eval()
当做代码解析,这不是我们希望看到的,我们希望获得的就是php的源码。
方法2
c=system("cp fla* a.txt");
将flag.php复制到a.txt
方法3
我们可以给system
传变量,这样$c里没有flag,而我们在其他变量里传入flag.php就能完美绕过它的限制
web28 目录 web30