sql注入:所谓的sql注入就是通过某种方式将恶意的sql代码添加到输入参数中,然后传递到sql服务器使其解析并执行的一种攻击手法
sql注入可分为平台层注入和代码层注入。
平台层注入:由于不安全的数据库配置或数据库平台的漏洞导致。
代码层注入:程序员对输入没有细致地过滤,从而执行了非法地数据查询。
sql注入原理:在前后端数据的交互中,前端的数据传到后台处理时,没有做严格的判断,导致其传入的数据拼接到SQL语句中,被当成SQL语句的一部分执行,从而导致数据库受损,信息丢失。
例如sqli-lab的一串前端url:http://127.0.0.1:8080/Less-2/?id=1
其中url中的?代表传值的意思,id代表变量,等号代表变量的值。
(浏览器通常使用 ? 来表示get方法传递参数,而使用post传递参数是不会显示到url中的,因此url中含有?说明就是使用get方法传递参数。post型注入和cookie注入需要插件和工具才可进行,例如hacbar)
常见的注入方式:
参数类型分类:数字型、字符型
注入手法分类:联合查询注入、报错注入、基于布尔的盲注、基于时间的盲注、HTTP头注入、宽字节注入、堆叠查询、二阶注入
数字型注入:
当输入的参数为整形时,若存在注入漏洞,则是数字型注入
如:http://127.0.0.1:8080/Less-2/?id=1
测试步骤:
1.若在后面加单引号‘变为http://127.0.0.1:8080/Less-2/?id=1’,这个时候sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
2.若在后面加and1=1变为http://127.0.0.1:8080/Less-2/?id=1 and 1=1;
对应sql语句:select * from table where id=1’ and 1=1 语句执行正确,与初始界面无差别;
3.若在后面加and 1=2变为http://127.0.0.1:8080/Less-2/?id=1 and 1=2;
对应的sql:select * from table where id=1 and 1=2 语句虽然可以正常执行,但是无法查询出结果,与初始界面存在差别。
字符型注入
当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
若数字型语句:select * from table where id =1,则字符型如下:select * from table where name=’admin’;
测试步骤:
加单引号:select * from table where name=’admin’’,由于加单引号后变成三个单引号,则无法执行,sql语句错误,因此界面报错。
一般情况我们可以通过--+将后面的单引号注释掉,sql语句也会形成闭合