SQL注入是一种常见的Web安全漏洞,主要是由于web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。本文将详细探讨SQL注入的原理、危害、分类、防御措施及挖掘方法,并提供一些手工SQL注入的技巧。
一、SQL注入简介
SQL是一种关系型数据库查询的标准编程语言,用于存取数据以及查询、更新、删除和管理关系型数据库。SQL注入则是借助网站上不健全的SQL拼接语句,将攻击者自己的恶意代码拼接到原有的SQL语句中,使其在服务器上执行,从而使攻击者可以对数据库进行网站运营者预料之外的增、删、改、查操作。
二、SQL注入的原理
造成SQL注入的原因主要是由于应用程序在构造SQL查询语句时未正确过滤或转义用户输入的数据,或未使用预编译等方法,造成了攻击者构造的恶意语句被应用程序执行。简单来说,就是用户输入的数据被直接用于构建查询,而不是作为纯粹的数据处理。
例如,以下是一个存在SQL注入风险的代码示例:
String query = "SELECT * FROM products WHERE category = '" + input + "'"; Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query);
在上述代码中,用户的输入input
被直接拼接到SQL查询语句中。如果攻击者输入' OR '1'='1
,则最终的SQL语句可能变为:
SELECT * FROM products WHERE category = '' OR '1'='1'
这将导致查询返回所有products
表中的记录,因为'1'='1'
始终为真。
三、SQL注入的危害
SQL注入的危害极大,攻击者可以利用这一漏洞对数据库进行各种恶意操作,包括但不限于:
-
- 脱库:查询隐藏数据。企业对于用户数据并不会直接删除,而是通过
delete
等字段去控制其是否可见。攻击者可以利用SQL注入查询这些隐藏数据。
- 脱库:查询隐藏数据。企业对于用户数据并不会直接删除,而是通过
-
- 新增管理账户:在数据库中新增具有管理员权限的账户,从而完全控制整个系统。
-
- 获取服务器权限:在极端条件下,攻击者甚至可以通过SQL注入获取服务器权限,执行任意命令。
-
- 网页篡改:通过操作数据库对特定网页进行篡改。
-
- 挂马攻击:修改数据库一些字段的值,嵌入恶意软件链接。
-
- 数据破坏:恶意删除或修改数据库中的数据,导致数据丢失或损坏。
四、SQL注入的分类
SQL注入根据不同的标准可以有多种分类方式,以下是一些常见的分类:
-
- 基于攻击原理的分类
-
• 报错注入:页面会返回报错信息,或者把SQL语句直接返回在页面中。攻击者可以利用这些报错信息分析SQL语句结构,完成恶意代码的闭合。
-
• 联合注入:可以执行
UNION SELECT
语句,通过联合查询获取其他表中的数据。 -
• 延时注入:又叫时间型盲注,通过执行如
sleep(5)
之类的函数,使存在漏洞的响应明显慢于正常响应。攻击者可以根据响应时间的差异判断注入是否成功。 -
• 布尔盲注:不会直接返回查询结果,而是通过应用程序的响应或行为差异来推断查询结果的真假。例如,通过输入
id=1 OR 1=1
和id=1 OR 1=2
比较响应差异。
-
- 基于数据类型的分类
-
• 数字型注入:当输入的参数为整数时,如果存在注入漏洞,可以认为是数字型注入。数字型注入不需要引号来闭合。
-
• 字符型注入:当输入的参数被当做字符串处理时,称为字符型注入。字符型注入通常需要通过引号来闭合。
-
- 基于提交方式的分类
-
• GET型注入:通过URL的查询字符串传递恶意参数。
-
• POST型注入:通过HTTP的POST请求体传递恶意参数。
-
• HTTP头注入:通过HTTP请求头部字段如
Cookie
值传递恶意参数。
五、SQL注入的防范
解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查,并对数据库配置使用最小权限原则。以下是一些常见的防范措施:
-
- 使用参数化查询或预编译语句
参数化查询是将用户提供的输入作为参数传递给SQL语句,而不是将输入直接拼接到查询语句中。这样可以防止攻击者注入恶意的SQL代码。例如,使用java.sql
中的PreparedStatement
接口:
PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?"); statement.setString(1, input); ResultSet resultSet = statement.executeQuery();
在上述代码中,用户输入的数据input
被作为参数传递给SQL语句,而不是直接拼接到查询语句中。数据库驱动会负责将提供给占位符的参数值转义,确保这些值不会被当做SQL代码执行。
-
- 输入验证和过滤
对所有用户输入的数据进行严格的验证和过滤,确保只有合法和预期的数据才能通过。可以使用白名单过滤或正则表达式验证来限制输入的格式和范围。
-
- 最小化特权
确保应用程序连接数据库时使用的数据库账户具有最小的权限,只能执行必要的操作,并限制对敏感数据的访问。这样可以减少攻击者利用SQL注入漏洞造成的危害。
-
- 使用ORM框架
对象关系映射(ORM)框架可以自动处理查询和参数绑定,减少手动拼接SQL语句的机会,并提供一定程度的安全性。例如,使用Hibernate、MyBatis等ORM框架可以自动处理SQL注入问题。
-
- 避免动态拼接SQL语句
尽量避免在应用程序中动态拼接SQL语句,特别是将用户输入直接拼接到查询语句中。如果必须动态拼接SQL语句,应确保对用户输入进行严格的转义和过滤。
-
- 错误处理和日志记录
正确处理数据库错误,避免将敏感错误信息暴露给攻击者。同时,定期审查和记录应用程序的日志,以便及时发现并响应潜在的注入攻击。
-
- 使用WAF设备
通过WAF设备启用防SQL注入策略,可以进一步增强对SQL注入攻击的防御能力。WAF设备可以监控和过滤HTTP请求,识别和阻止恶意的SQL注入攻击。
六、如何挖掘SQL注入漏洞
挖掘SQL注入漏洞需要一定的技巧和经验。以下是一些常用的挖掘方法:
-
- 单双引号测试
在测试初期,可以尝试在参数值中添加单引号或双引号,查看页面是否报错。如果页面报错并显示SQL语法错误等信息,说明可能存在SQL注入漏洞。
-
- 算术运算测试
在参数值中进行算术运算测试,如将id=2
修改为id=1+1
,查看返回的数据与之前是否一致。如果一致,说明可能存在SQL注入漏洞。
-
- 布尔条件测试
通过输入布尔条件如OR 1=1
和OR 1=2
,比较两个响应是否有差异。如果存在注入点,前者返回的数据通常会比后者多。
-
- 时间延迟测试
通过执行如sleep(5)
之类的函数,查看携带恶意参数的请求响应时间是否比正常请求慢5秒。如果存在注入点,说明攻击者可以利用时间延迟测试判断注入是否成功。
-
- 带外测试
带外测试是指通过其他渠道(如DNS查询、HTTP请求等)接收来自目标系统的响应数据。攻击者可以构造恶意的SQL语句将敏感数据发送到带外平台(如攻击者控制的域名或服务器),然后查看带外平台是否收到了对应的数据。
七、手工SQL注入技巧
一些常见且有效的手工SQL注入技巧:
-
- 识别注入点
-
• 观察页面是否存在传值或查询的地方,如URL中的GET型传参、搜索框、HTTP请求头部字段等。
-
• 通过单引号、双引号、算术运算、布尔条件等测试方法判断是否存在注入点。
-
- 确定数据库类型
-
• 通过报错信息中的关键词(如MySQL的
You have an error in your SQL syntax
、Oracle的ORA-xxxx
等)确定数据库类型。 -
• 使用数据库特有的函数或语句进行探测,如MySQL的
version()
函数、Oracle的dbms_xdb.getFtpPort
函数等。
-
- 获取数据库信息
-
• 使用
UNION SELECT
语句联合查询其他表中的数据。注意要匹配联合查询的列数和数据类型。 -
• 使用数据库特有的系统表或视图查询数据库信息,如MySQL的
information_schema
数据库、Oracle的all_tables
视图等。
-
- 暴破用户名和密码
-
• 通过布尔盲注或时间延迟注入暴破用户名和密码。可以使用字典攻击或暴力破解工具进行尝试。
-
• 注意要合理设置尝试次数和间隔时间,避免触发目标系统的防御机制。
-
- 绕过WAF设备
-
• WAF设备通常会对常见的SQL注入攻击模式进行监控和防御。为了绕过WAF设备,攻击者可能会采用一些技巧,如:
-
• 使用大小写混合:将SQL关键字的大小写混合使用,如
SeLeCt
、UnIoN
等,以绕过WAF设备对关键字的敏感检测。 -
• 编码转换:对恶意SQL语句进行URL编码、Unicode编码或Base64编码等转换,以绕过WAF设备的过滤规则。
-
• 特殊字符替换:使用WAF设备可能无法识别的特殊字符或等价替换,如将空格替换为
%00
、%20
、+
、/**/
等。 -
• 拆分注入:将恶意的SQL语句拆分成多个部分,分别在不同的请求中发送,以绕过WAF设备的单次请求检测限制。
-
• 利用HTTP请求特性:通过修改HTTP请求的方法、头部字段或请求体等,构造特殊的请求以绕过WAF设备的检测。
-
- 绕过输入验证
-
• 输入验证是防止SQL注入的重要措施之一。攻击者可能会尝试绕过这些验证机制,如:
-
• 绕过长度限制:通过截断、拼接或编码等方式绕过输入长度的限制。
-
• 绕过格式限制:通过修改输入数据的格式或类型,绕过对输入格式的验证。
-
• 利用逻辑漏洞:分析输入验证的逻辑漏洞,如绕过前端验证直接发送恶意请求到后端。
-
- 利用数据库特性
-
• 不同的数据库系统具有不同的特性和漏洞,攻击者可以利用这些特性进行SQL注入攻击。如:
-
• MySQL的
information_schema
:利用information_schema
数据库查询MySQL服务器的元数据,获取表名、列名等信息。 -
• Oracle的
dbms_sql
包:利用Oracle的dbms_sql
包动态执行SQL语句,绕过常规的输入验证和过滤机制。 -
• SQL Server的
xp_cmdshell
扩展存储过程:在SQL Server中,利用xp_cmdshell
执行操作系统命令,获取服务器权限。
-
- 隐藏攻击痕迹
-
• 为了避免被目标系统或安全设备检测到攻击行为,攻击者可能会采取一些措施隐藏攻击痕迹,如:
-
• 使用代理服务器:通过代理服务器发送恶意请求,隐藏真实的攻击者IP地址。
-
• 清理日志:在攻击成功后,尝试删除或修改目标系统的日志文件,以掩盖攻击行为。
-
• 分散攻击:将攻击行为分散到多个请求或时间段内执行,以避免触发目标系统的异常检测机制。
八、总结
SQL注入是一种常见的Web安全漏洞,对Web应用程序的安全构成严重威胁。为了防范SQL注入攻击,需要采取多种措施,包括使用参数化查询、输入验证和过滤、最小化特权、使用ORM框架等。同时,挖掘SQL注入漏洞也需要一定的技巧和经验,包括识别注入点、确定数据库类型、获取数据库信息、暴破用户名和密码等。
题外话
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
侵权,请联系删除。