很久前就看到Sqli-labs这个练习Sql注入的项目,但是也只是断断续续做过几个简单的题目,也就没有再继续下去了。一直在仰望大神,自己却原地不动。还是需要脚踏实地,一步一步走。趁着这个清明假期,重新开始学习,记录一些知识点,也帮助自己重新找回方向。这篇文章也是跟着Lcamry的《MYSQL注入天书》学习,感想前辈的分享。
基础知识
(1)Sql注入分类:
基于服务器接收到的响应
1. 基于错误的SQL注入
2. 联合查询的类型
3. 堆查询注入
4. SQL盲注
- 基于布尔SQL盲注
- 基于时间的SQL盲注
- 基于报错的SQL盲注
基于数据类型输入的SQL查询
基于字符串
基于数字
基于程度和顺序的注入
一阶注入
二阶注入
基于注入点的位置
通过用户输入的表单
通过cookie
通过服务器变量的位置
注入的分类也是因人而异,对于同一种类型的注入,对注入的分类可能不一样,不过这不太重要,分类也只是为了让我们自己更好的理解漏洞的原理,因此我们只需自己对漏洞原理有足够的认识就行了。
(2)系统函数:
几个常用的函数:
1. version() //MYSQL的版本
2. user() //数据库用户名
3. database() //数据库名
4. @@datadir //数据库路径
5. @@version_compile_os //操作系统版本
(3)字符串连接函数
1.concat(str1,str2,...) //没有分隔符的连接字符串
2.concat_was(separator, str1, str2...) //使用separator 作为分隔符连接字符串
3.group_concat(str1, str2 ); // 连接一个组的所有字符串,并以逗号分隔每一条数据
(4)字符串截取函数
1.mid(str,start,length) //对字符串str从start开始截取长度为length的字符串
2.substr(str,start,length) 或 substring(str,start,length) //同mid函数一样
3.left(str,n) //得到字符串左边指定长度为n的字符串
4.ord(s) //返回字符s的ASCII码
5.ascii(s) //同ord函数,返回字符s的ASCII码
6.regexp ' s' //正则匹配字符串
^str //匹配字符串是否以str开始
str$ //匹配字符串是否以str结束
[str1,str2,...] //字符集合,只要匹配其中一个就满足条件
[^str1,str2,...] //字符集合,只有不包含集合的所有字符才满足条件
str* //字符串str出现零次或多次
str+ //字符串str出现一次或多次
str{n} //字符串str出现n次
str{n,m} //字符串str最少出现n次,最多出现m次
(4)一般用于尝试的语句
ps:--+可以用#替换,都是用于注释后面的语句
or 1=1 --+
' or 1=1 --+
" or 1=1 --+
) or 1=1 --+
') or 1=1 --+
") or 1=1 --+
")) or 1=1 --+
(5)一个重要的数据库 information_schema
information_schema 这个数据库是mysql自动创建的,这个数据库用来记录存在系统中的一些数据库,数据表,以及表的组成之间的关系。当我们发现sql注入漏洞时,往往也会利用这个数据库来查询服务器上的各个数据库还有数据表之间的关系,进一步获取到我们想要的数据。
在图中可以看到TABLES这张表,我们可以通过这张表来查询到我们想要的东西,例如:
select table_name from information_schema.tables where table_schema = "security";
这行代码就是查询数据库名为"security"的所有数据表的名字
而我们通过这个"information_schema"数据库查询数据有一个一般的流程:
- 猜测数据库
select schema_name from information_schema.schemata
- 猜测某库中的数据表
select table_name from information_schema.tables where table_schema = "xxx"
- 猜测某表中的所有列
select column_name from information_schema.columns where table_name="xxxx"
- 获取数据
select * from "xxxx"