废话不多说
题目界面


在随意发帖后,发现需要登入,这个就比较鸡肋了,这是暗示你账号为zhangwei 密码为zhangwei*** 这个*表示为某个字符,即zhangwei再加上某三个字符,然后burp遍历可以得出为666
账号:zhangwei 密码:zhangwei666

登入,任意发一个贴,然后可以留意,就想着发帖或留言地方可能存在注入
于是全部都单引号创建


发现无法进行留言了,果然是有猫腻的。
但是具体情况还需要探查,扫描发现有.git可以下载,于是利用自己写的win版本一键git下来了(封装了githack和所有分支下载)
通过网盘分享的文件:一键githack
链接: https://pan.baidu.com/s/1SVCez4xRjVhQ76UF6bewPQ?pwd=8880 提取码: 8880


得到了一个版本的write_do.php
<?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");
}
?>
在继续看一下所有分支文件

<?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");
}
?>
发现了完整版本
可以看出$category存进去后,又在评论时候拿了出来,这就很符合二次注入
这里的addslashes可以对单引号进行转义,但是$category存在数据库中是没有被转义的,而且评论使用时候是多行命令,所以我们把$category写入特定sql注入并利用/**/注入,写入/*,然后评论时候利用*/封装多行注入,并用#注释本行来激发命令
',content=(SELECT database()),/* 和 */#



发现sql注入成功,于是正常sql获取信息

emmm最后发现字段里面没有东西。
然后我们尝试其他select

发现不能执行命令,也没有写权限,但可以读取,所以我们就利用selet load_file(文件)来读取文件,去直接找到flag
为了避免不可见字符,我们采用hex(load_file(文件))读取后ascii显示即可。
先读取/etc/passwd

发现只有www用户,在www/home使用了bash
然后读取home/www/.bash_history 文件,看看他使用了什么命令

发现是把文件移动到html,但是把.DS_Store删了,不想让人知道,但是tmp里面的还没有删,我们就去tmp里面读/tmp/html/.DS_Store

在这里发现了flag名称,然后就读tmp里的flag文件

emmm发现答案不对,这是一个过期的flag,于是我们之间去/var/www/html/flag_8946e1ff1ee3e40f.php读

获得最终flag
824

被折叠的 条评论
为什么被折叠?



