常见sql注入类型
汇总记录一下最近学的一部分常见 sql 注入的类型,以便后期查看
是个不会 web 的菜狗 re 萌新,如有错误还望师傅们指出,谢谢
参考博客:https://www.cnblogs.com/-chenxs/p/11614129.html
联合注入
1、判断是 get 型还是 post 型注入
2、找到正确的闭合规则
3、order by 查询字段数
4、union select 1,2,3... 查看显示位是第几位(记得更改 id=-1 )
5、查询当前用户、数据库以及数据库版本 union select 1,2,concat_ws(char(32,58,32),user(),database(),version())
6、查询当前数据库里面的表 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='...'
7、查询到敏感表名 user,继续查询表里面的字段 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="user"
8、查询字段,例如“id”、"passwd"的内容 union select 1,2,group_concat(0x5c,username,0x3a,password) from users
9、拿到用户、密码登入后台
布尔盲注
1、查看现象,能报错,但没有报错信息,正确查询也显示不了查询内容就属于布尔盲注,只存在两种状态,对或错
2、由页面的两种不同返回的状态来判定闭合规则(为了方便,这里假设返回正确用“yes”,返回错误用“no”来表示这两种状态)
3、找到闭合规则后,在闭合规则里面 and 1=1 和 and 1=2 测试一下,看看最后返回是不是两种状态
4、布尔盲注要用到 length() 和 substr() 语句,用两种状态来猜解数据库、表名等的长度和正确字母
5、先用 and length(database())>... 来猜数据库的长度,使用的是二分法
6、再用 and substr(database(),1,1)='...' 来确定第一个字母,可用 burp 跑,26 个字母,哪个字母返回 yes 则代表第一个字母就是它
7、再用 and substr(database(),2,1)='...' 确定当前数据库的第二个字母...以此类推,最后结合长度,成功的将数据库猜解出来
8、后面的操作跟 union 注入的步骤差不多了,只是 sql 语句写在上文的 database() 处
报错注入
1、只要注入点有 sql 报错信息,那么就可以使用报错注入
2、还是一样,引号报错,然后找到闭合规则,页面正常显示,则可以在闭合规则中开始写入报错注入的 sql 语句
3、利用 updatexml 或 floor 报错获取当前数据库
updatexml :and updatexml(1,concat(0x7e,(select database()),0x7e),1)
floor :and (select 1 from (select count(*),concat((database()),floor (rand(0)*2))x from information_schema.tables group by x)a)
4、接着可以利用 select 语句替换掉上面 database() 来继续获取数据库中的表名、字段名,查询语句和 union 注入攻击的语句相同,只不过这里不能再使用 group_concat 了,因为报错注入只显示一条结果,所以需要使用 limit 语句
时间盲注
1、没有明确的现象,不管是对是错都返回一个状态
2、但是如果用 sleep(5) 方法,能让响应时间延迟为 5 秒以上,那么就为时间盲注
3、我们用 sleep(5) 函数构造了一个时间延时的状态,因此,我们又有了两种状态,像布尔盲注一样可以根据这两种状态来判定数据库、表名和字段名的长度和正确的每个字母
4、同样的找到正确的闭合规则,当然,这个闭合规则得配合着 and sleep(5) 语句来构造,哪一个闭合规则执行了 sleep(5),那么就是正确的闭合规则
5、时间盲注配合着 if(A,B,C) 语句结合使用,含义是:如果 A 是 true,则返回 B(也就是执行B),否则返回 C(执行C)
6、判断当前数据库名的长度的语句为: if (length(database())>...,sleep(5),1)
7、判断当前数据库名的第一个字母的语句:if(substr(database(),1,1)='...',sleep(5),1),其他字母以此类推
8、根据数据库名长度以此类推即可得出完整的数据库的库命、表名、字段名和具体内容
堆叠查询注入
1、可以使用堆叠注入的地方也可以使用布尔盲注与时间盲注
2、同样先找出正确的闭合规则,然后也看两种状态来猜解库名、表名等
3、类似与下面在分号后面可执行新的语句:
;select if(length(database())>1,sleep(3),1)
;select if(substr(database(),1,1)='r',sleep(3),1)
4、堆叠的 ; 分号后可以执行新的 sql 语句,因此在知道网站根目录的情况下可以直接写日志拿 shell
宽字节注入
1、如果遇到单、双引号被转义,变成了反斜杠,导致参数 id 无法逃逸单引号的包围,一般情况下,此处就不存在sql注入漏洞的。但是如果数据库的编码为 GBK 时,就可以使用宽字节注入,因此在不知道是否是 GBK 编码时,都可以尝试去使用宽字节注入
2、宽字节的格式是在地址后先加一个 %df ,再加单引号,因为反斜杠的编码为 %5c,在 GBK 编码中,%df%5c 是繁体字“連”,因此,单引号成功逃逸,爆出 sql 错误
3、因此构造闭合规则时,在单引号前面加上 %df 就行了,之后在闭合规则中写入同 union 注入的一些查询语句就行了