sql注入基础

dg05 / 2023-07-08 / 原文

1.基于错误的注入

错误注入的思想是通过构造特殊的sql语句,根据返回的错误信息,确定注入点。

通过错误信息也可以探测数据库类型和版本等有用信息

通过输入单引号,触发数据库异常,通过异常日志判断数据库类型

2.基于布尔的注入

布尔注入的思想是闭合sql语句,构造or和and逻辑语句,注释多余的代码

例如 原sql语句:select * from Users where username='username' and password='pwd'

利用布尔注入构造语句: select * from Users where username='' or 1=1 -- ''and password='pwd',由于1=1恒真,所以可以返回所有表里面的信息。

简单的应用是万能密码: ‘ or 1=1#

3.基于union的注入

union语句用于联合前面的select语句获取更多信息

一般通过错误和布尔注入确认注入点后,就开始通过union语句获取信息

 

通过order by语句确认前面select语句的列数,

414a9060-9d5e-46ee-bbb5-fc85dd67d3c0.node4.buuoj.cn:81/index.php?id=1%27 order by 4 -- + 

此时恰好没有页面没有回显,确认列数为3

414a9060-9d5e-46ee-bbb5-fc85dd67d3c0.node4.buuoj.cn:81/index.php?id=0%27 union select 1,database(),version() -- +

union联合的select语句的列数一定要与前面select语句查找的列数相同,如果union后select语句列数比原语句列数少,可以加数字填充,如果比前面多,需要用group_concat()关键字把内容合并成一条数据。这里利用union语句,得到了当前库名为note和数据库版本

4.基于时间的盲注

有些数据库对错误信息做了安全配置,使得无法通过上面方式确认注入点,通过设置sleep语句探测注入点

用法是: 测试的数据' and sleep(t) -- +

如果测试的数据存在数据库,页面会延迟t秒相应