注入-----数据变代码
sql注入----数据在数据库中执行
数据输入环境:http中都可以 ,get、post、以及http头部信息,文件上传等需要数据库记录的数据
数据库执行语句如何包裹输入的数据:整型(无包裹)、字符串(引号等包裹)
数据输出环境:有输出环境(联合查询) 、无输出环境(布尔型 延时型)
概念:将恶意的sql查询或者添加语句插入到输入的参数中,再在后台sql服务器解析形成攻击
原理:程序员没有遵循代码与数据分离原则,是用户数据作为代码执行
注释:#或者–空格是单行注释,/**/是内联注释
条件:用户可以控制数据的输入
原本要运行的代码拼接了用户的输入并运行
sql注入产生原因:web服务器向数据访问层发起sql请求,权限验证通过就执行sql语句。网站内部直接发送的sql语句请求一般不会有危险。但实际情况是需要结合用户输入的数据动态构造sql语句,如果用户输入的数据构造称恶意代码,web应用未对使用的参数进行审查,则会形成sql注入漏洞
威胁:猜解后台数据库,盗取网站的敏感信息
绕过验证,例如直接登陆后台
注入可以借助数据库的存储过程进行提权等操作
SELECT 目标
FROM 表
WHERE 条件
GROUP BY 分列组 HAVING 组选择条件
ORDER BY 排序列1 排序要求;
UNION ALL|DISTINCT
SELECT 表达式
FROM tables
WHERE conditions;(可选的检索条件)
limit m,n(从m位置开始,取n条记录)
后面可以加列名或者数字,数字应该是小于查询结果的列数可适当慢慢增加。当查询结果出错时数字为-1
information_schema:数据库,包含数据的很多信息,例如表SCHEMATA TABLE COLUMNS
SCHEMATA:存储数据库名,字段为SCHEMA_NAME
SELECT schema_name FROM information_schema.schemata
TABLES:存储表名及表所属数据库,字段为TABLE_NAME、TABLE_SCHEMA
SELECT table_name FROM information_schema.‘TABLES’ WHERE table_schema=database()
COLUMAS:存储列名及所属数据库名、所属表名,字段为COLUMN_NAME、TABLE_SCHEMA、TABLE_NAME
SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name=table_name
内联inner join,左联left outer join,右联right outer join,全联full outer join
内联:如果想把用户信息、积分、等级都列出来,应该使用内联
select * from T1,T3 where T1.userid=T3.userid 等同于
select * from T1 inner join T3 on T1.userid=T3.userid
把两张表中都存在userid的一行都拼成一行即内联,后者的效率高于前者
左联:显示左表T1中的所有行,并把右表T2中符合条件的加到左表中,右表中不符合条件的不用加入到左表中,并且用NULL显示
select * from T1 left outer join T2 on T1.userid=T2.userid
右联:显示右表T2中的所有行,并把左表T1中符合条件的加到右表中,左表中不符合条件的不用加入到右表中,并且用NULL显示
select * from T1 right outer join T2 on T1.userid=T2.userid
全联:显示左表T1、右表T2两张表中的所有行,相当于把左联结果表和右联结果表组合在一起,过滤掉重复的
select * from T1 full outer join T2 on T1.userid=T2.userid