网络安全——sql注入

注入-----数据变代码

sql注入----数据在数据库中执行

数据输入环境:http中都可以 ,get、post、以及http头部信息,文件上传等需要数据库记录的数据

数据库执行语句如何包裹输入的数据:整型(无包裹)、字符串(引号等包裹)

数据输出环境:有输出环境(联合查询) 、无输出环境(布尔型 延时型)

1.sql注入

概念:将恶意的sql查询或者添加语句插入到输入的参数中,再在后台sql服务器解析形成攻击

原理:程序员没有遵循代码与数据分离原则,是用户数据作为代码执行

注释:#或者–空格是单行注释,/**/是内联注释

条件:用户可以控制数据的输入

​ 原本要运行的代码拼接了用户的输入并运行

sql注入产生原因:web服务器向数据访问层发起sql请求,权限验证通过就执行sql语句。网站内部直接发送的sql语句请求一般不会有危险。但实际情况是需要结合用户输入的数据动态构造sql语句,如果用户输入的数据构造称恶意代码,web应用未对使用的参数进行审查,则会形成sql注入漏洞

威胁:猜解后台数据库,盗取网站的敏感信息

​ 绕过验证,例如直接登陆后台

​ 注入可以借助数据库的存储过程进行提权等操作

2.Sql语句

查询语句

​ SELECT 目标

​ FROM 表

​ WHERE 条件

​ GROUP BY 分列组 HAVING 组选择条件

​ ORDER BY 排序列1 排序要求;

union:用于union注入攻击

​ UNION ALL|DISTINCT

​ SELECT 表达式

​ FROM tables

​ WHERE conditions;(可选的检索条件)

LIMIT

limit m,n(从m位置开始,取n条记录)

ORDER BY

后面可以加列名或者数字,数字应该是小于查询结果的列数可适当慢慢增加。当查询结果出错时数字为-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

3.联合查询

内联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

你可能感兴趣的:(网络安全,笔记,sql,web安全,数据库)