web27


pre_match函数用于执行一个正则表达式匹配,这个代码的意思是查看我传入的参数中是否存在flag这个关键字,忽略大小写。没有的话就执行这个eval
eval内执行的是php代码,必须以分号结尾。所以我们要执行一个命令,然后绕过flag这个关键字,拿到flag
介绍几种方法:
1.直接执行系统命令。
?c=system("tac%20fla*");
tac命令是linux中用来处理文本相关的命令,是cat的反向版本。cat是用来从第一行到最后一行顺序显示文件内容的命令,那么tac就是从最后一行到第一行的逆向显示文件内容的命令
这条命令用来显示系统中所有以“fla”文件名开头的文件内容,拿到flag:

2.通过反字节符执行echo
?c=echo%20`tac%20fla*`;
php中反字节符` `的作用是执行包裹起来的shell命令,捕获该命令执行后所有的输出内容,返回给php。所以这个payload就是tac到所有fla开头的文件内容之后,返回给php,让php执行echo打印出来这些内容
3.参数输入+eval
?c=eval($_GET[1]);&1=phpinfo();
解释一下这个payload。传入了两个get参数,c=eval($_GET[1]);和1=phpinfo();
首先代码拿到c这个参数,执行eval(‘c’),即eval(‘eval($_GET[1]);’)。eval会执行里面的php代码,所以执行eval($_GET[1]); 因为传递了参数1=phpinfo(); 所以($_GET[1])的结果就是’phpinfo()’ 之后内层的eval执行’phpinfo()’,打印了phpinfo()。
发现可以打印出phpinfo()

那么第二个参数我们就可以带一些其它的命令。尝试一下?c=eval($_GET[1]);&1=system(ls);看看当前目录有什么

发现有flag.php和index.php
看看根目录有什么 ?c=eval($_GET[1]);&1=system(“ls%20/”);

4.利用参数注入进行文件包含
?c=include $_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
前面看到了当前目录下有flag.php。通过伪协议的参数获取到flag.php的内容,然后通过文件包含将这段字节流显示
5.利用cp命令将flag拷贝到别处
?c=system("cp%20fl*g.php%20a.txt%20");
将flag的内容拷贝至当前目录下a.txt,然后直接访问a.txt
web30

使用eval加参数注入

当然,第29题的除了第一种方法外的几种方法,都是可以的。这里不再尝试
web31

依旧是eval+参数注入。

web32

这题禁止了c参数的左括号,所以我们不能用eval了,甚至c不能用所有的函数调用。但是没有禁止[],所以我们还是能用$_GET[]。然后进行参数注入,反正没限制别的参数的内容,使用文件包含

web33

可以看到过滤了分号,但是这关我文件包含什么事

web34

依旧上一段payload。很后悔没有复制下来又要手写一遍

web35

依旧

web36

发现过滤了数字,那我就用字母呗。。

web37

发现跟之前有区别:之前是用eval包裹我们的c参数,现在是用include。所以这题本质是文件包含,并且过滤了c中的flag。依旧可以用参数注入
大佬,你这个博客网站是用什么技术写的?
wordpress搭建的噢
感谢大佬