基于Sqli-Labs靶场的SQL注入-38~45关

目录

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关一样,这一关的闭合方式(注入点)是 ') 。其余操作就不赘述了。

总结


        这一篇博客我主要讲了堆叠注入,包括堆叠注入原理、注入条件、注入方法等。堆叠注入的前提条件多,可以实际应用的场景较少。但是只要能够进行堆叠注入,就可以对后台数据库造成很大的伤害。 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alan_Mikasan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值