SQLI-LABS注入小结(Less-1~Less-28a)

SQLI-LABS注入小结

感悟:

  这算是我第一次在这么大平台上发表博文,想想还是有点小激动的。说实在,搭建这个博客时我都没想好要在这上面发表什么,想了想还是记录一下自己学过还有即将要学的一些知识点吧,以免时间长了,啥也都忘了。这篇写sqli-labs主要也是在这里学到的东西太多,不给点分类的话,总是搞不清啥是啥!!!!!相对于一些捷径来说(像sqlmap这一类的工具直接爆破),我还是喜欢手工实验测试,这样会让我更容易理解漏洞出现的原因,方便后期自己去用python代码脚本实现攻击。当然,我也只是打到关卡28a,后面的关卡是一些新的知识,也没来得及去看去总结,之后有时间会继续补充。

正文:

  环境的配置安装,我这里就不多谈,网上的相关教程也挺多的。我用的是MacBooksqli-labs配置Linuxcentos镜像的PD虚拟机中,浏览器是Firefox(火狐),数据库MYSQL

  在注入开始之前,首先要有SQL语言基础(增删改查),知道数据从html--->php—>Mysql的流动过程,以及一些常用的函数。

  下面贡献一波从第一关的第28a关中我自己的小结:

1.基于错误的SQL注入:

  1)基于错误的SQL单注入:

  最为简单的的一种注入,由mysql_error()函数引起,mysql_error()函数的作用是返回上一个 MySQL 操作产生的文本错误信息。也就是说如果能闭合绕过注入点的话,就可以让mysql命令行执行我们提交的payload(这里简单提一下,sqli-labs后台处理SQL语句是将$sql变量放到mysql的命令行下执行,执行过程遵循SQL语言的可执行语句)。这种报错注入已经公式化了,适用于页面能回显数据库内部信息时,之后准备写一篇SQL绕过姿势,专门记录这个。之后的所有绕过姿势基本上都是在此基础上修饰,增加难度的。

  2)基于错误的SQL双注入:

  这个双注入指的就是双查询注入,顾名思义就是在select查询查询里面嵌套一个select子查询,这个有点像SQL语句用到的子查询。双查询注入适用界面上的不给你任何回显,但是PHP代码里还有mysql_error()函数时。这种注入也公式化了,hack们可以通过floor(rand()*2),将结果控制在0和1直接,换句话说就是结果被控制在truefalse之间,这样hack们就有50%的机会可以得到他们想要的内容的。这个双注入的就是利用主查询(外查询)控制输出方式,子查询(内查询)控制输出内容。

2.SQL盲注:

  所谓盲注,就是后台的PHP代码完全不给你任何报错信息,也就是没有mysql_error()函数回显错误,在这种情况下进行爆破后台账户密码的注入。盲注一般都是利用一些有布尔类型返回值的函数进行逐字符判断,比较麻烦,所以一般都是跑脚本(一般是二分法脚本)。

  1)基于布尔的SQL盲注:

  布尔盲注就是对界面返回的信息不同进行判断,一般适用于界面只返回truefalse时(也可以说成能看到的可注入页面只有两种,要么是注入失败的界面,注入成功就会返回另一个不同的界面,更通俗一点,就是源代码中注入失败的界面和注入成功的界面大部分是一样的,只有一两处不一样),hack们通过length()left()函数或者ascii()substr()函数特性判断。主要的语句写在这些函数里面,一点一点地字符串爆出来。

  2)基于时间的SQL盲注:

  时间盲注跟布尔盲注大同小异,只不过后台PHP的代码对界面进行了处理(可能是重定向,可能是屏蔽,等等),让注入失败和注入成功返回的界面一模一样(也可以是你所在的界面可注入,但界面显示的信息跟数据库返回的信息没有半点关系),但不管他们进行了哪个操作,返回的流量里都有数据库返回的信息,这个时候就可以用时间盲注。时间盲注利用if()函数的特性和ascii()substr()sleep()函数进行配合,让判断消息正确时和错误时,在mysql命令行执行的时间不一样,造成页面返回的时间不同,这样就可以判断。主要的语句写在这些函数里面,一点一点地字符串爆出来。

  3)基于错误的SQL盲注:

  这里报错盲注,也可以说是盲注公式化的基础,原理与报错双注入有些类似,都是通过hack们构造的payload将结果控制在可判断范围内除了上面提到过的利用floor(rand()*2)控制输出效果,hack们也许会利用xpath函数(extractvalue()updatexml())或者数据重复报错(union select 1,2,3 from (select name_const(version(),1),name_const(version(),1))x--+)来获取数据。ps:这个数据重复报错好像是有利用条件的,这个跟主键是有关的,因为主键是唯一的,不允许数据重复,但我试过几个虚拟注入环境,只能爆出版本。所以一搬都是利用xpath函数报错。

3.基于数据类型的SQL注入:

  1)基于字符串的SQL注入:

  所谓基于字符串,从名字中也可以看出,URL传过去的参数被当作字符串类型处理,所以一般源码的type都是text这种类型,PHP中也是把这个当作字符串处理,最大的特点就是SQL语句中的变量会加单引号或者双引号这种明显用来区别字符与整型的标志。这是当前比较主流的一种方式,毕竟字符串便于理解,出错了也容易找到错误。这也给hack们在注入的时候提供更容易理解的漏洞。这种类型的注入比较 广泛,上面我做的小结基本是以这个为基本的。

  这里小提一句,mysql对引号的处理是引号必须成对出现的;引号之间的内容为空,mysql会忽略这对引号。

  2)基于数字(进制)的SQL注入:

  基于数字,那就是变量会做郑兴处理,一般是函数中对GET或者POST过来的值做整型判断,主要是用is_number()函数,看函数名都能猜出来这是判断参数是否为数字的函数。这种函数也比较好绕过,将写好的payload进行ascii<==>进制转换,再将数据传过去,因为虽然hack们传上去的可能都是16进制数或者科学记数法,但SQL是一串字符串,绕过is_number()之后,在这里会再次被强制转化为字符串的,这样他们的payload就能被读出来的。

4.基于顺序的SQL注入:

  1)直接注入(普通注入):

  所谓普通注入就是直接在URL上提交我们的payload,无论是整型还是字符串型的payload,这个概念有一点大,基本上包括了sqli-labs中大部分的解题思路,简单说就是只进行一次注入就会返回hack们想要的结果,搜索的SQL语句直接提交给mysql数据库。

  2)间接注入(二次注入):

  二次注入跟普通的注入差别就在二次注入是利用修改hack们第二次注册的账号密码,通过SQL语句触发并修改mysql数据库中已有的账号密码,从而拿到不同账号下的数据,也可以爆出数据库中的内容。一般这种注入用在应用程序中,用在那些有转义或过滤。相对于普通注入来说,二次注入不容易被一些工具扫描到,隐蔽性高出很多。

5.基于注入位置的SQL注入:

  1)基于表单域的SQL注入(URL):

  表单域注入是另一种分类概念,说的就是通过URL输入域将payload给GETPOST过去,然后爆出数据库的表单。上面也提过这个,毕竟现在的URL访问都是在URL输入域里面执行显示操作的。概念简单明了,没有什么特别的地方。

  2)基于cookie的SQL注入:

  基于cookie的注入,注入内容和方式和基于URL输入域的注入差不多,只不过是将payload放在cookie里面提交上去。这一类注入一般是在URL输入域中的GETPOST被过滤个遍,但是cookie没被过滤的情况下使用(这里还有一个前提,就是数据获取方式是request(“xxx”),未指明具体方法)。

  百度百科:Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。

  3)基于服务器header变量的SQL注入:

  基于header变量的注入没有那么多要求,主要是用在那些把header变量和其他数据存在同一个数据库下的网站。通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。这就造成hack们会利用header变量将SQL注入语句传上服务器,爆出他们想要的内容。

6.文件导入导出操作:

  这个内容和下面的字符串过滤单独拿出来是因为这两个防护看起来很安全,但是绕过后造成的威胁却更大。文件导入导出主要是在那些文件权限太高的情况下会被利用,像file_download()这个函数,SQL语句内容返回到这个函数,就会造成这样做的漏洞。SQL注入成功后,利用load_file()函数可以直接爆出文件内容,但这个函数利用有前提:

  • 当前权限对该文件可读 ;
  • 文件在该服务器上 ;
  • 路径完整 ;
  • 文件大小小于max_allowed_packet
  • 当前数据库用户有FILE权限 ;
  • secure_file_priv的值为空,如果值为某目录,那么就只能对该目录的文件进行操作。

  如果目标文件不存在,hack们还可以利用SELECT...INTO OUTFILE将他们的文件写入目录下,像一句话木马,或者payload之类的,都是可以的,不过这个也是有前提的:

  • 目标目录要有可写权限
  • 当前数据库用户要有FILE权限
  • 目标文件不能已存在
  • secure_file_priv的值为空
  • 路径完整
7.字符串过滤:

  为保证网站的安全性,后台的代码了会在将变量接收过来后就会直接进行一波waf过滤,将一些敏感字符直接给过滤掉,一般都是字符串替换str_replace()函数,或者正则表达式preg_match()被过滤的字符一般有//,`,– ,=,/**/,#,–+,– -,;,%00,–a,&&,||,空格,一些常用字符的大小写union,select,and,or,password,oder,where,like`之类的

  我对sqli-labs/Less-28a关卡及之前关卡的理解分类大致就是如此,如果有什么不正确或不完整,表哥们有更好的理解和建议,可以和我一起探讨改正,这是我的联系方式:

QQ