点进去看了一下
根据题目猜测,应该是和php的文件包含漏洞有关…尝试了一下显示phpinfo,意料之中的失败了,看wp才了解到,这是一道伪协议的题目。然后翻了一下之前的博客,复制一下payload,成功解题。
?file=php://filter/convert.base64-encode/resource=flag.php
一脸懵,试一下给ip送变量
是rce漏洞,但也有些关键字被过滤了
好想学会写脚本然后用脚本测试过滤了哪些…这里知道了漏洞类型,应该用穷举法测出哪些函数没有被过滤…出于懒惰还是看一眼wp吧…
(注: ls, cat是linux访问文件的命令)
看wp知道是因为空格被过滤了,师傅们使用的是${IFS}$
绕过。系统自带的变量 $IFS 内部字段分隔符(Internal Field Separator, IFS)定义一个定界符,默认是空格。知道了原理,开始绕!
好↑的↓,是大括号被过滤了,师傅说改成$IFS$1
…百度了半天不明白为什么要用$IFS$1
这里没访问到,师傅提示要访问index.php
爆出了源码,可以看到正则过滤了哪些内容。接下来有三种方法可以绕过。
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
大意是构造一个变量a=g,然后正则没有匹配到flag,就绕过了。这里需要注意的是正则的形式。index.php下的代码含义为匹配字符串,是否按顺序出现flag这四个字母。所以如果$a放在前面解析,就会直接出现了flag四个字母,只有放到最后一个,才会有效果。
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
sh和bash都是linux的shell的一种,二者语法可以兼容。index.php过滤了bash的命令,但是没有过滤sh的命令。把flag.php这几个字转码base64再转回,即可绕过。
?ip=127.0.0.1;cat$IFS$1`ls`
将反引号内命令的输出作为输入执行。所以这句话就变成了 cat index.php flag.php。就会把两个文件显示出来。