buuctf web 前5题

目录

一、[极客大挑战 2019]EasySQL

总结:

二、[极客大挑战 2019]Havefun

总结:

三、[HCTF 2018]WarmUp

总论:

四、[ACTF2020 新生赛]Include

总结:

五、[ACTF2020 新生赛]Exec

总结:


一、[极客大挑战 2019]EasySQL

EasySQL,根据题目盲猜是sql注的题目

buuctf web 前5题_第1张图片

检查源码发现传参方式为GET

buuctf web 前5题_第2张图片

buuctf web 前5题_第3张图片

随意输入用户名和密码,发现有回显

预测后端代码应为:

根据数据库查询规则,使用万能密码

admin ' or 1=1 #

ps:select * from users where username='admin' or 1=1#' and password="";

admin后的 ' :为了和前面的 ' 形成闭合

or 1=1:形成查询永真条件

#:将后面条件注释掉

buuctf web 前5题_第4张图片

buuctf web 前5题_第5张图片

总结:

  sql注入万能密码:admin ' or 1=1 #

二、[极客大挑战 2019]Havefun

buuctf web 前5题_第6张图片

打开网址查看源码,发现一段注释的内容

GET请求通过URL请求参数,可以在URL后面添加参数,以“?”作为分隔符,参数之间用“&”符号链接。

解释:GET传参cat。输出cat。如果cat=dog。输出一串类似flag的东西。

buuctf web 前5题_第7张图片

总结:

GET请求通过URL请求参数,可以在URL后面添加参数,以“?”作为分隔符,参数之间用“&”符号链接。

简单php代码。

三、[HCTF 2018]WarmUp

buuctf web 前5题_第8张图片

打开网址,检查以源码。发现隐藏页面source.php

buuctf web 前5题_第9张图片

转到source.php可以看到一段php代码

 "source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                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;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "
"; } ?>

先来查看一下,hint.php里的内容

ffffllllaaaagggg这里flag被复写了四次,可以猜测flag被放在4到5个根目录下,即写成../../../../ffffllllaaaagggg或../../../../../ffffllllaaaagggg

再对上面php代码进行逐行分析:

"source.php","hint"=>"hint.php"];            
                //增加白名单,包含source.php和hint.php
            if (! isset($page) || !is_string($page)) {
                //$page不为空或NULL(!isset($page))或(||)不为字符串(!is_string($page))
                echo "you can't see it";
                return false;
            }
 
            if (in_array($page, $whitelist)) {
                //in_array的意思是判断page里是否包含白名单里的内容,即是否包含(source.php或hint.php)
                return true;
            }
            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            /*这里mb_substr返回字符串的一部分
            mb_substr(需返回字符串(类型:sting),从哪个数字代表的位置开始(类型:int),截取长度(类型:int))
            mb_strpos(要被检查的字符串,要搜索的字符串)最终返回要被检查字符串的位置(类型:int)
            综合来看就是mb_strpos函数,检索$page中?的位置,并返回?所在的位置数,mb_substr函数将从0开始,到?位置的$page字符串返回到型变量$_page*/
            
            if (in_array($_page, $whitelist)) {
                return true;
            }
            /*in_array(被搜索的值,搜索的数组,类型)
            经过上面的截取代码,$_page是否存在source.php或hint.php,如果存在就返回true*/
            $_page = urldecode($page);
                /*进行一次url解码,将%3F解码为?
                所以这里将?写做%3F也无法实现绕过*/
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_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'])
            //并且,调用函数(白名单)要过白名单检测,过了之后,即可看到包含了flag的文件
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "
"; } ?>

构造playload(1)=http://ip/?file=souce.php?../../../../ffffllllaaaagggg

        playload(2)=http://ip/?file=souce.php?../../../../../ffffllllaaaagggg

        playload(3)=http://ip/?file=hint.php?../../../../../ffffllllaaaagggg

分别进行尝试

buuctf web 前5题_第10张图片

(中间有靶机到期自动销毁的情况,截图的网址有变化)Q^Q

总论:

mb_strpos和mb_substr截取内容,碰到?就截止,所以我们只需要输入/?file=source.php?即可绕过白名单检测

四、[ACTF2020 新生赛]Include

进入网页,打开源码,只有tips有提示

buuctf web 前5题_第11张图片

点击tips,跳转到/?file=flag.php,还是什么也没有

buuctf web 前5题_第12张图片

根据题目(include)提示,可以猜测flag在/?file=flag.php页面中,但是被注释了,所以我们就要想办法获取网页的源码。

所以这里可以想到要构造php伪协议

PHP伪协议也是php支持的协议和封装协议。

常见的有

  1. file:// 访问本地文件系统
  2. php:// 访问各个输入/输出流
  3. data:// 数据
  4. zip:// 压缩流 不过有些伪协议需要allow_url_fopen和allow_url_include的支持

php://

  • php:// 访问各个输入/输出流I/O streams在CTF中经常使用的是php://filter和php//input
  • php://filter用于读取源码php://input用于执行php代码。

php://filter伪协议
php://filter/参数=转换过滤器
参数:
1.resource=<要过滤的数据流>
2.read=<读链的过滤器>
3.write=<写链的过滤器>
4.<;两个链的过滤器>

转换过滤器:
1.convert.base64-encode & convert.base64-decode<等同于base64_encode()和base64_decode(),base64编码解码>
2.convert。quoted-printable-encode & convert.quoted-printable-decode

php://input读取POST数据
说明
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的

参数可以同时使用,两两之间使用 / 隔开

本题构造的伪协议格式:

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

得到一串base64编码

将base64编码解码

buuctf web 前5题_第13张图片

总结:

php伪协议,获取网页源码,用于获取简单的被注释掉的重要信息

伪协议构造格式中的一种:

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

五、[ACTF2020 新生赛]Exec

打开靶机看到ping,先输入网址127.0.0.0进行测试

buuctf web 前5题_第14张图片buuctf web 前5题_第15张图片

可以看到执行ping命令有回显

buuctf web 前5题_第16张图片buuctf web 前5题_第17张图片

而单独输入查询命令时没有回显,由于ping命令可以与管道符连用,先尝试用管道符连接ls

buuctf web 前5题_第18张图片buuctf web 前5题_第19张图片

连接ls发现有回显,尝试用cd逐层发打开文件

buuctf web 前5题_第20张图片buuctf web 前5题_第21张图片

buuctf web 前5题_第22张图片buuctf web 前5题_第23张图片

buuctf web 前5题_第24张图片 buuctf web 前5题_第25张图片

打开到第三层的时候,出现了flag,我们只要cat一下flag即可 

buuctf web 前5题_第26张图片buuctf web 前5题_第27张图片

既然ls命令可以用,我们不妨大胆一点

直接cat /flag

buuctf web 前5题_第28张图片buuctf web 前5题_第29张图片

嚯!这也行!直接一步到位,所以我前面在干嘛……

ps:补充一下管道符的用法

| :按位或,直接执行后面的语句

& :按位与,前面后面的都要执行,不管真假

|| :逻辑或,相当于or

&& :逻辑与,相当于and

; :作用与&相同,前后都会执行

总结:

ping命令后可跟管道符,管道符的用法。

你可能感兴趣的:(前端)