SQL注入学习总结【自用】

SQL注入

自己在学习过程中的一点总结

0x01 SQL注入原理

在一些Web网页中,会允许用户传入参数,并将这些参数带入数据库中进行查询,这就产生了一些注入漏洞
SQL注入漏洞需要满足以下两个条件:

  • 参数用户可控:前端传给后端的参数内容是用户可以控制的
  • 参数代入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询

0x02 MySQL注入相关知识点

重要的表名,库名

在众多库中有一个最重要的:information_schema(系统自带库)
在这个库中有三张表更重要:

  1. schemata:存有所有库名
    SCHEMA_NAME:库名
  2. tables:存有所有表名
    table_schema:表属于的库名
    table_name:所有的表名
  3. columns:存有所有字段名
    table_schema:表属于的库名
    table_name:字段属于的表名
    column_name:字段名

常用的mysql语句

select <column_name> from <table_name>:从表里查询所有内容【查询基本语句】
select 1,2,3:显示1,2,3
select database():显示当前库名
where <condition_>:有条件的从表中选取数据
and/or:有多个条件时用and和or连接
order by:根据制定的结果集/指定的列进行正序排序(order by 1 :根据第一列进行排序,当指定的列不存在时会直接报错)
order by 1 desc:倒序排列
length(str): 计算长度
substr(str,pos,length) :截取指定位置指定长度的字符串
ascii(substr(database(),1,1) =107: 查询ascii码中对应的值
substring(str FROM pos FOR length):防止逗号截断
substring_index(str,delim,count):返回查找字段出现次数的前一个位置
mid(str,pos,length):截取函数
right(str,length):从右边开始截取
left(str,length):从左边开始截取
limit 0,1: 从第一行起显示一条记录(从第几行起,显示多少行的记录)
union select:将多个表拼在一起(字段数要一致)
#/-- //**/:注释形式
/*!code*/:内联注释

0x03 Union注入攻击

顾名思义利用sql语句中的union语句,将想要查询的数据连接在前面的查询语句后。

基本步骤

  1. 判断是否有注入漏洞
    这也是所以sql注入的前提,主要利用post或者get,判断参数能不能被用户所控制,能不能传入数据库中被执行。

id=1’ 在1后面加上单引号,页面出错
id=1 and 1=1 正常 id=1 and 1=2 错误

出现这种状况就说明我们写入的参数被放入了数据库中,但由于输入的字符于数据库所需要的参数不同,或者是判断后为假,导致无法正常查询,而出现了页面错误。在这时候我们可以知道自己的写入到参数可控并且被放入数据库中运行,也就出现了sql注入漏洞。
但这种漏洞的判断往往需要很多方式,需要我们做过很多尝试才能确定,我们后面会介绍一种工具sqlmap,用于判断简单的sql注入漏洞。

构造测试 预期结果 变种
a’ //触发错误,返回数据库错误 NULL
a’ or ‘1’='1 //永真条件,返回所有记录 a’) or (‘1’=1
a’ or ‘1’='2 //空条件,返回原来相同结果 a’) or (‘1’=2
a’ and ‘1’='2 //永假条件,不返回记录 a’) and (‘1’='2
  1. 判断列数
    由于在sql语句中,想要进行联合查询必须满足前后的字段数(列数)一致,否则就会报错。
    我们利用order by进行判断

order by 1,2 | 返回正常页面
order by 1,2,3 | 返回错误页面
说明在此表中一共有两列

  1. 判断回显点
    判断回显点的作用主要在看我们想要得到的数据是在哪一个位置返回给我们。
    想要得到我们想看到的数据就要先保证前面的式子为假(无法返回正常数据)才能正常返回我们想要看到的数据
id=1 and 1=2 --保证前面的数据无法正常返回
union select 1,2,3

在这里插入图片描述
我们想要得到的是1,2,3这三个数字,可以看到在login name和password的位置得到了我们想要的数据,说明我们的回显点在这两个位置,我们可以把3这个位置换成获得要想数据的sql语句。

  1. 获取库名,表名,列名,任何想要看到的东西
id=1 and 1=2
union select 1,2,
(select table_name from information_schema.tables where table_schema=database() limit 0,1)

因为在这种回显报错中只能返回其中一行数据所以要利用limit0,1或者group_concat()

这些步骤几乎是所有sql注入的基本步骤,不同的注入方式只是在sql语句的运用上稍加改变,有些可能是运用不同的sql语句,有些事将sql语句注入到不同的位置中。

0x04 盲注

盲注也是在sql注入中比较常见的一种,因为页面不能直接显示我们想要看到的数据只能利用猜测的方式确定想要的数据。

布尔盲注

这种注入方式是因为页面只有两种,一种是返回的正确页面,另一种则是返回的错误页面。基本步骤和union注入一致,只是只能利用length(database())>1 这种办法来猜测想要数据的长度和具体数字。大多数时间都是利用burpsuite的Intruder来一位一位爆破。

时间盲注

这种页面是完全没有差别,只能利用sleep(),改变网页的响应时间,来判断自己的猜测是否正确。

时间函数

  1. sleep()根据睡眠时间判断
  2. BENCHMARK(count,expr)重复执行count次执行表达式expr。可以被用于计算MYSQL处理表达式的速度,结果值通常为0
  3. 笛卡尔积(cross join 隐式)
  4. GET_LOCK(str,timeout):设法使用字符串str给定的名字得到一个锁,超时为timeout秒(长链接,且可以开两个会话)

配合函数

  1. 配合if条件触发
    IF(expr1,expr2,expr3)
    如果expr1是TRUE(expr1<>0 and expr1<>NULL ),则IF()的返回值为expr2;否则返回值则为expr3。IF()的返回值为数字值或字符串值,具体情况视其所在语境而定
select * from table where id=1 and if(database()=' ',sleep(4),NULL)
  1. 配合select case when条件触发,也可以用于逃过逗号截断
    case when condition then result 类似于if/else语句
select case when username='admin'THEN 'aaa' ELSE(sleep(3)) end from user;

0x05 堆叠注入

在sql语句中是可以利用分号结束上一句话然后开始下一个增删查改语句,也就是在同一时间执行了多条语句。
这种方法和union注入有相似之处,当union这个关键词被过滤的时候就可以用到堆叠注入的方法,也可以配合盲注的两种方法一起。

0x06 报错注入

当我们传入的参数发生错误的时候,页面直接把报错的信息返回到页面上,这种时候就可以用到报错注入。在我的另一篇文章中比较详细的介绍了报错注入常使用的三种函数。
传送门

0x07二次注入攻击

这种攻击方式运用在有两个页面需要同时被使用,比如第一个页面需要我们注册一个用户,返回给我们一个id,然后我们利用这个id进入到另外一个登录页面,在登录页面中可以看到或者反映出我们想要看到的数据。
这种攻击也是需要结合前面的几种注入方法,根据页面的返回情况不同,选择不同的注入方法配合使用。

0x08 其他注入攻击

宽字节注入

这种是利用gbk的编码方式,在gbk中认为两个十六进制放在一起为一个汉字,我们就是利用这种方法来将引号或者任何符号逃逸出来,进而继续我们想要进行的攻击

Header注入

这种注入方式主要是利用响应头中的UA、IP、Cookie等等位置进行注入攻击,目前具体的判断方法还没有发现

base64注入

我们将注入的语句利用base64编码,从而逃过过滤等行为

0x09 绕过技术

在sql注入方面的题目中,往往会设置许多过滤危险字符的方式,所有就出现了一些利用sql漏洞的字符绕过方法。

  1. 大小写绕过
    这个绕过方式主要是因为一些网页在设置黑名单的时候,可能只防止了php,但没有过滤Php,而在数据库执行语句的时候是不分大小写的,这样就可以直接绕过过滤。
  2. 双写绕过
    有时候and被过滤了,但是写出aandnd的时候只能过滤掉一个and,sql会需要识别内的and,这样就看绕过关键词的过滤
  3. 内敛注释绕过
    内联注释就是把一些特有的仅在MYSQL上的语句放在 /!../ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行
    码一篇我认为写的很好的绕过方法总结
    传送门

0x10 sqlmap使用

推荐一个个人感觉很实用的sqlmap教程,主要用于一般形式的sql注入,但是有些header头注入的还没有总结
传送门
感谢Kal1博主)

总结

其实这么整理下来,我还是感觉只写出了很小的一部分,sql注入很大一部分都是需要自己去不断地整理、不断地尝试,就是一个试错的过程,而且有时候自己试了很久最后发现根本不是sql注入的类型,前面的功夫钱都白费。有耐心一切都好。

猜你喜欢

转载自blog.csdn.net/Luminous_song/article/details/108540411