(做完整个人都不好了)
1.进去给的是一个发帖的功能,f12 以及抓包分析后都没有给什么明显的提示,然后就写好内容准备发帖的时候,突然跳了一个登录框,而且还把账号告诉了,密码也是告诉了前 8 位,而且还没有设置验证码,按照正常人的设置密码的思路,应该后三位设置的是 3 个数字,废话不说直接开整,打开 bp 爆破
2.很明显了哈,当密码为 zhangwei666 的时候直接 302 跳转,成功登录后,就发个帖,没啥其他的功能,感觉是不是登录之后功能和界面稍微有些许不通,然后经过 f12 以及抓包测试后发现,当写帖的时候其实 url 中是有一个叫做?do=write 的包,而当写评论的时候 url 中同样有一个叫做?do=comment 的包,这也没啥用,但是在 f12 的时候,在控制台里面看到这样一句话
当时第一反应就是去开 disearch 和御剑同时跑,一个虚拟机和一个本机,因为它这个描述就是在提示你可能存在源码泄露了,但是这俩工具啥也没有跑出来东西,以为又是靶机出 bug 了,就去看了一下 wp,看完之后悟到了新的思路,感觉以前从来没有遇到过这状况,这个严格意义上并不是漏洞之类的,可以描述为是开发人员的操作不当,想利用 git 的好处,但由于粗心暴漏了源码,下面给一个具体的描述
然后有一个利用的脚本
如果还是不理解,可以参考一下这篇文章,作者讲的真的很细节
https://blog.csdn.net/qq_45521281/article/details/105767428
3.就直接在 kali 上拉取 python 脚本利用吧,下面是利用之后所爬取到的源码
<?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");
}
?>
一眼看上去就是一串在与数据库进行交互的的源码,用了一个 write 分支,用了一个 comment 分支,这也与第 2 点那个两个不同的数据包联系起来,审计第一个分支我感觉写的没啥问题,将三个参数接收完值后,对它们分别使用 addslashes 转义,然后 insert 插入到数据库里面,mysql_query 这个函数就是用来执行语句的函数,没啥大问题,然后接着看第二个分支(有点复杂,也有点重要,就专门写个)
1.首先从这个board的表里面取出来了这个名叫category的数据
2.把category,content(这个指的应该就是那个评论里面的内容)以及bo_id这三个数据重新插到了一个名为comment的表里面
3.用comment.php?id=$bo_id去取出数据
这个提示给的就很明显了哈,明明白白的二次注入,原因就是开发人员过于相信已经存在数据库里面的数据了,这里给补一张图哈
4.然后就开始构造 payload,下面的/**/是自己没有想出来的,一开始怎么构造 payload 都不对,忘记还要把中间那些给注释掉
然后#把‘给注释掉就大功告成了
一开始我应该是试出来了这个网站根目录的地址,就是用 sql 中的读取文件函数
然后都知道路径了就想着写木马,然后蚁剑连接,但有点不太行,估计没开啥权限吧
(这个第 7 点就是写马的,做了一个 16 进制转换,就先试一下能不能访问到,访问不到就不费心思构造了)
5.然后试了一下查询数据库里面的库啊,表啊,反正查不出关于 flag 的信息,就是三个库,无语
然后真的是穷途末路,实在是想不到 flag 还能在哪里,我也不能一个个去试文件名吧,尝试了一下/flag 之后没有结果就没有再试下去了,看了一下佬儿的 wp,学到了新姿势
1.先是用load_file('/etc/passwd')查看用户以及以下的文件
2.看到有个www用户,查看bash_history : 保存了当前用户使用过的历史命令,方便查找,这个在在/home/www/下
然后就有了构造的这个 payload
1', content=load_file('/home/www/.bash_history'),/*
注意到虽然/var/www/html 目录下的.DS_Store 文件被删除了,但是/tmp/html 目录下的.DS_Store 文件还在,读一下,然后获取到的 16 进制数据用工具打开就会发现
成功得到了 flag 所在的文件,然后终极 payload 就是
1', content=(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php')),/*
Finish!!!