感觉是道很不错的题目,从二次注入到寻找文件。分享一下

    打开是一个留言板的页面,发现存在反射xss,越权(滑稽。不过这些都没什么用,直接说下解题思路吧。

githack :https://github.com/BugScanTeam/GitHack

githack 一下 打开文件发现是一个不完整的php文件

打开F12一看发现 程序员没有Commit  应该是有其他的东西吧

然后使用GitTools 工具还原一波 得到正确的源代码 

源代码如下:

<?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");
}
?>

观察了一下发现是两张表 board 、comment
首先写评论的时候数据写到board 会写入三个字段, 然后再次评论的时候会调用的时候
content 值会直接从上一次POST请求中去取,category参数可控。这样就导致了二次注入
直接通过category 这个变量就可以导致二次注入。

我们可以直接构造payload在发帖时插入:

‘, content=user(),/*      #在评论中使用*/#闭合。

   

    不过我们还没登陆-.-访问login.php,发现提示用户名为zhangwei,手动试了一下zhangwei666为密码。直接登陆。

 

    然后我们发布留言。在category中插入payload:

    ‘, content=user(),/*

其他随便。在点击留言详情,插入*/#闭合。读取到了用户名。

ok,我们可以直接构造load_file读取文件,但是不知道flag文件路径。折腾了很久。终于成功getflag。也是一个很不错的思路,学习到了。

在什么文件名都不知道的情况先,先读取一下我们知道的/etc/passwd试试。发现存在一个www用户,而拥有bash权限。能登陆系统,肯定有猫腻。

payload:’, content=(select load_file(‘/etc/passwd’)),/*

然后读/home/www/home/www/.bash_history,看看出题人都做了些啥。发现他将默认web目录下的html目录,copy到了/tmp,并且删除其他的东西,只留了个.DS_Store在html目录中。

 

ok,那我们读一下这个文件,看看有什么东西。 payload: ‘, content=(select load_file(‘/tmp/html/.DS_Store’)),/*

不过发现并没有显示完全,我们将回显用hex编码一下,回显完整内容,解码。 payload: ‘, content=(select hex(load_file(‘/tmp/html/.DS_Store’))),/*

网上随便找个在线解码得到文件完整内容,发现文件名!flag_8946e1ff1ee3e40f.php。不过这个文件是从/var/www/html目录中copy过来的,我们回到/var/www/html中读取flag。不过发现并没有读取成功。想了一下,可能是因为文件过大。继续用hex编码,成功得到flag。 payload:’, content=(select hex(load_file(‘/var/www/html/flag_8946e1ff1ee3e40f.php’))),/*

    这题个人感觉有好的点就是git对象恢复,审计源码二次注入,和后面的读取历史命令去寻找蛛丝马迹。学习到了!不过该寄出的刀片还是会寄的。后面题目会重现放在D.A.F团队服务器中,供大家一起学习,感谢支持。