学习目标:
SQL注入
学习内容:
1.了解SQL注入
2.SQL注入过程
3.联合查询
学习时间:
2021年2月5日
学习产出:
1.了解SQL注入
1.1SQL注入定义
SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。
1.2SQL注入原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
2.SQL注入过程
2.1.SQL注释风格
“#”: 注释从 “#” 到行尾
"-- " :注释从 “-- ”序列到行位,需要注意的是使用此注释时,后面需要跟上空格
/**/:注释从 /* 到 */ 之间的字符
2.2获取元数据
① 查询用户数据库名称
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.SCHEMATA 表提供了关于数据库的信息。(nformation_schema数据库的SCHEMATA表的SCHEMA_NAME字段保存的是所有的数据库的名:)
②查询当前数据表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = (SELECT DATABASE())
INFORMATION_SCHEMA.TABLES 表给出了数据库中表的信息。
③查询指定表的所有字段
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '’*
INFORMATION_SCHEMA.COLUMNS 表中给出了表中的列信息。
3.联合查询
1. 联合查询(去重)。
用于合并两个或多个 SELECT 语句的结果集。UNION 内部的每个 SELECT 语句必须拥有相同数量和相同顺序的列,列也必须拥有相似的数据类型。SQL语法如下:
注:UNION查询的结果中,不存在重复的值。
2. SQL联合查询(内联、左联、右联、全联)的语法
联合查询效率较高,举例子来说明联合查询:内联inner join 、左联left outer join 、右联right outer join 、全联full outer join 的好处及用法。
第一:内联(inner join)
把两个表中都存在userid的行拼成一行(即内联)
SQL语句:select * from T1 inner join T2 on T1.userid=T2.userid
第二:左联(left outer join)
显示左表T1中的所有行,并把右表T2中符合条件加到左表T1中;右表T2中不符合条件,就不用加入结果表中,并且NULL表示。
SQL语句:select * from T1 left outer join T2 on T1.userid=T2.userid
第三:右联(right outer join)
显示右表T2中的所有行,并把左表T1中符合条件加到右表T2中;左表T1中不符合条件,就不用加入结果表中,并且NULL表示。
SQL语句:select * from T1 right outer join T2 on T1.userid=T2.userid
第四:全联(full outer join)
显示左表T1、右表T2两边中的所有行,即把左联结果表+右联结果表组合在一起,然后过滤掉重复的。
SQL语句:select * from T1 full outer join T2 on T1.userid=T2.userid
参考:https://www.cnblogs.com/IronMind/p/13414827.html