在学习渗透测试的时候,理论是一个方面,经验也很重要,有的时候,我们明明知道相关的理论,但是因为实操较少,因此不能很好的注入成功,失败的原因却往往是一些细微的小点。在这里,作为一名渗透测试的“老司机”,针对SQL注入问题,写一点自己的体会,主要是针对上述问题进行简单论述,有其他见解的朋友也可以与我深入讨论交流。
一、关于url编码的问题
当我们进行GET类型注入的时候,一定要注意URL编码,特别是有时候涉及到引号、空格、井号等等,如果不注意URL编码问题,就有可能产生错误。
- 注意对特殊符号进行url编码
“#”在SQL注入中是常用的注释符,然而,根据url规范,“#”同时又代表了锚定符,因此,在进行GET类型url注入的时候,对“#”进行编码(%23),是必须的,否则,我们提交的payload就会由于URL解析的缘故造成错误。 - 注意对空格的编码
空格,在url编码时为20%,要特别注意,当使用“–”(两个减号)作为注释符的时候,后面要求有一个空格,如果在浏览器末尾输入一个空格,那么浏览器通常会去掉这个空格,因此,如果要在末尾添加空格,必须手动添加%20到浏览器末尾。 - 注意使用的工具对编码的要求
在进行SQL注入时,我们常常使用的是浏览器、burpsuit以及其他浏览器插件。通常情况下,浏览器会对普通的空格、引号等自动进行url编码;burpsuit不会对任何字符进行url编码;浏览器插件则视情况而定。因此,在使用burpsuit时,必须要对sql注入的特殊字符进行url编码,在使用浏览器和浏览器插件时,也推荐使用url编码。
二、关于奇葩库、表、字段的问题
在少数情况下,数据库的库、表、字段的名称非常奇葩,以至于普通的select语句查询是失败的。
比如,一个名称为select、insert、where的表。
比如,一个名称为2020、2021、2022的库。
前者使用了SQL语句的关键字作为名称,后者使用了数字作为名称,尽管在正规数据库中,很少采用上述方式作为库、表、字段的命名方式,但是,数据库通常支持创建以上述类型的库、表和字段。
一旦遇上了这样“不讲武德”的数据库,我们就需要把特定的库、表、字段用反引号(键盘上数字键左边的那个)括起来,这样我们的SQL语句就能正常执行了。
如上图,第一次执行SQL语句:
select * from select
执行失败,因为它不符合SQL语句的语法。
第二次执行SQL语句:
select * from `select`
这里,将select表用反引号括起来,就没有问题了。
三、关于SQL语句闭合的问题
我们常讲,SQL语句有3种闭合方式,分别是数字型、单引号和双引号,根据闭合方式的不同,我们要选择不同的策略以注入。
通常情况下是这样的,但是,在某些情况下,开发会在引号(包括单引号和双引号)外面加上括号括起来,sql语句成为这样:
select * from table where column=('content')
上述SQL语句也是符合SQL语法的,但是由于content是我们人为输入的内容,很多情况下即使闭合了前面的单引号,也忽略了括号,因此处理闭合问题时会引发特殊现象。发现有时页面既不是数字型、也不是单引号型,还不是双引号型。这个时候,可以考虑页面是不是用括号括起来的类型。
四、关于ASP站点的注入问题
尽管现在大多数网络环境都是用LAMP或LNMP作为架构,php作为网页开发常用的语言,占据了web服务器大部分的江山,但是仍然有部分站点使用ASP作为页面开发语言。
作为新手,常常出现的误区是使用和php注入同样的方式处理ASP,但是殊不知,ASP站点的SQL语句处理和PHP有小小的差别,但就是这点小小的差别,导致SQL语句处理不尽相同,如果直接用PHP的方式注入ASP,则会因为这点小差别而失败。
而且,一般情况下,ASP站点后他数据库常常使用oracle而不是mysql,而oracle和mysql数据库在注入的时候也会有不同,比如,oracle没有mysql中information_schema这个库,oracle甚至没有“库”的概念等等,这些差异,都会对我们注入产生较大的影响。
因此,在对ASP页面进行注入的时候,必须要采用ASP+oracle数据库的注入方式,该方式在网上有较多介绍,在这里就不详述了。
五、关于ajax的问题
ajax是目前网页中常常使用的一项技术,我们在进行sql注入的时候,可以试试对ajax请求进行注入。
对于新手来说,可能很难理解什么是ajax,在这里举几个简单的例子:
1、当使用百度的时候,输入关键词网页可以自动给予联想,如下所示:
2、部分网页(如豆瓣),在访问一个列表(如电影列表、图书列表)时,我们会发现开始时会出现一些项目,随着我们向后浏览,页面又返回了一些新的项目。
上述两种功能的实现,都是ajax的使用,使用js,而不是用户主动访问来实现GET或POST数据包的发送,从而达到自动返回数据的目的,这就是ajax的功能。
使用浏览器打开开发者工具,打开网络,XHR中的数据包就是ajax请求,如下所示:
因此,除了对浏览器url中进行注入外,还可以测试一下ajax请求中有没有SQL注入的存在,或许会有不小的收获哦!
技术讨论请加wx:wxid_5olqbdswojzw22
若本文对您产生帮助,还望您点赞+收藏+关注!
不胜感激!