在之前的考核中对SQL认知都很模糊,即使解题也基本是通过其他博主的WP来复制代码进行解答,并没有真正理解,现在通过资料阅读自己也有了一些新的认识
概念:SQL注入(SQL Injection)是一种常见的Web安全漏洞,形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。
SQL:用于数据库中的标准数据查询语言。 web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并为其提供前端展示的资源,而数据库就是存储资源的地方(如mysql数据库)。那服务器如何对数据获取了?就需要使用SQL语句这一语法结构进行查询获取。SQL语句通过特有的语法对数据进行查询。
SQL注入原理:通过某种方式将恶意的sql代码添加到输入参数中,然后传递到sql服务器使其解析并执行的一种攻击手法。
通过查阅可知SQL可分为平台层注入和代码层注入。
平台层注入:由于不安全的数据库配置或数据库平台的漏洞导致。
代码层注入:程序员对输入没有细致地过滤,从而执行了非法地数据查询。
原因:在前后端数据的交互中,前端的数据传到后台处理时,没有做严格的判断,导致其传入的数据拼接到SQL语句中,被当成SQL语句的一部分执行,从而导致数据库受损,信息丢失。
最常见的两种注入类型
参数类型有下面两种:
数字型、字符型
注入手法可分为这些:
联合查询注入、报错注入、基于布尔的盲注、基于时间的盲注、HTTP头注入、宽字节注入、堆叠查询、二阶注入。
对于url头爆破语句中 id=1 id=0 的理解
如果只有两个回显位置,那么 id 必须填写一个不存在的数(-1或者0,这里并不仅仅局限于这两个数字,诸如-2,-5等等也可以),联合查询才能回显成功,因为 id=0 没有查询结果,所以页面中就返回联合查询的内容。所以,如果union 前面的查询失败,那么 union 后面的查询结果就能回显到页面。
对于数字型:
我理解为当输入的参数为整形时,如果存在注入漏洞,它就是数字型注入。
eg:https://blog.csdn.net/aboutus.php?id=1
此时后台语句:$sql=“SELECT 123 FROM abc WHERE id='1 '"
检测方法:URL输入 and 1=1 / and 1=2 报错则说明有注入
字符型的话:
当输入参数为字符串时,就是字符型注入。
它与数字型最简单的区别就是:数字型不需要单引号来闭合,而字符串需要单引号来闭合。
eg: 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’ 攻击语句 – ’