本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
漏洞原因
一些概念:
SQL:用于数据库中的标准数据查询语言。
web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源。
而数据库就是存储资源的地方。
而服务器获取数据的方法就是使用SQL语句进行查询获取。
SQL注入:所谓的sql注入就是通过某种方式将恶意的sql代码添加到输入参数中,然后传递到sql服务器使其解析并执行的一种攻击手法
SQL可分为平台层注入和代码层注入。
平台层注入:由于不安全的数据库配置或数据库平台的漏洞导致。
代码层注入:程序员对输入没有细致地过滤,从而执行了非法地数据查询。
原因:在前后端数据的交互中,前端的数据传到后台处理时,没有做严格的判断,导致其传入的数据拼接到SQL语句中,被当成SQL语句的一部分执行,从而导致数据库受损,信息丢失。
总结版:后台服务器接收相关参数未经过过滤直接带入数据库查询。
例子:
比如这是一条前端URL:https://www.yisu.com/aboutus.php?id=1
其后台sql语句:$sql=“SELECT 123 FROM abc WHERE id='1 '"
这条语句是采用拼接方式去对数据库内容进行查询的,而且并未对用户在前端输入的内容做过滤,并且用户对id这个参数可控,本来程序员设计这条查询语句是希望通过它去快速查询数据库中abc表的某个内容并且回显到前端页面来的,但是攻击者通过单引号’ 闭合数据库查询语句,并且可以构造这样的恶意url:https://www.yisu.com/aboutus.php?id=-1 ’ select password from admin#去查询admin 用户的密码,而非查询预先程序员所设计好的数据内容。
其中:url中?代表传值的意思,id代表变量,等号代表变量的值。
浏览器通常使用 ? 来表示GET方法传递参数,而使用POST传递参数是不会显示到URL中的,因此URL中含有?说明就是使用GET方法传递参数。POST型注入和Cookie注入需要插件和工具才可进行。
过程
常见的注入方式:
参数类型分类:
数字型、字符型
注入手法分类:
联合查询注入、报错注入、基于布尔的盲注、基于时间的盲注、HTTP头注入、宽字节注入、堆叠查询、二阶注入。
数字型:
当输入的参数为整形时,若存在注入漏洞,则是数字型注入。
如:https://blog.csdn.net/aboutus.php?id=1
此时后台语句:$sql=“SELECT 123 FROM abc WHERE id='1 '"
检测方法:URL输入 and 1=1 / and 1=2 报错则说明有注入
字符型
当输入参数为字符串时,称为字符型注入。
它与数字型的区别:数字型不需要单引号来闭合,而字符串需要单引号来闭合。
例:https://blog.csdn.net/aboutus.php?id=1’
此时后台语句:$sql=“SELECT 123 FROM abc WHERE id='1 ’ ’ "
此时多出了一个单引号,破坏了原本的SQL语句结构,数据库无法处理,于是会报错,证明这条语句成功被带进数据库查询,存在字符型注入。
此时通过 --+把后面的单引号注释掉,SQL语句也会形成闭合。
所以我们可以这样:
?id = 1’ 攻击语句 --+
传入页面就变成了
select user from database where id = ‘1’ 攻击语句 – ’
–+:起注释作用,将后面的语句注释掉,在url中+相当于空格,–是注释符号,单行注释,之所以要加+号是因为–与单引号连在一起无法起注释作用因此必须把它们隔开
联合查询注入
联合查询适合于有显示位的注入,即页面某个位置会根据我们输入的数据的变化而变化。
页面观察
输入id=1和id=2,若页面中值有变化,说明输入与数据库有交互
注入点判断
直接输入?id=1’若有报错则存在注入,开始判断可以从哪里注入,?id=2’1=2–+页面显示不正常,说明此处存在SQL注入,注入点在引号。
接下来开始使用SQL语句进行攻击。
使用order by判断当前表的字段个数
例:
?id=1 order by n --+
若n超过当前表的列数,就会报错,说明表中只有n-1列
判断显示位
判断显示位时,要使用 ?id=-1 或者改为0 让前面的select语句查询为空错误,然后采用后面的select语句去查询:
?id=-1' union select 1,2,3 --+
观察页面在哪里回显我们的输入,就可以用那个地方测试接下的语句。
爆数据库的名字
?id=1' union select 1,database(),3 --+
在之前回显2的地方会回显database数据库的名字。
爆数据库中的表
?id=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
数据库语句懒得解释了。
爆表中的字段
?id=1' union select 1,group_concat(column_name),3 from information_schema.column where table_schema='爆出来的数据库名‘ and table_name=‘爆出来的表名' --+
爆相应字段的所有数据
?id=-1' union select 1,group_concat(id,'
以上就是SQL注入的知识点有哪些的详细内容,更多关于SQL注入的知识点有哪些的资料请关注九品源码其它相关文章!