入门必备知识:深入浅出学SQL注入
2024-2-6 22:13:15 Author: mp.weixin.qq.com(查看原文) 阅读量:17 收藏

介绍

SQL注入是一种常见的安全漏洞,攻击者通过构造恶意输入来干扰Web应用程序正常的SQL查询逻辑,从而获取、修改或者删除数据库中的敏感信息。在各类注入类型中,数字型注入和字符型注入是两种最为基础且常见的形式。

数字型注入

首先,我们来看数字型注入。当Web应用的参数为整数值时,如用户ID、订单号或页码等,若程序未对用户输入进行充分过滤和校验,就可能留下安全隐患。

假设URL为"http://www.xxx12.com/1.php?id=2",根据这个地址我们可以推测后台执行的SQL语句可能是"select * from table where id=8"。为了验证是否存在注入漏洞,可以通过以下步骤进行测试:

1、在ID参数后添加单引号('),尝试闭合SQL语句,例如访问"http://www.xxx12.com/1.php?id=2'",如果出现错误提示,则可能存在注入点,因为对于数字类型的字段来说,额外的单引号会导致语法错误。

2、使用逻辑判断语句进一步验证,例如访问"http://www.xxx12.com/1.php?id=2 and 1=1",若页面返回正常且数据无差异,则说明注入可能生效,因为"and 1=1"始终为真,不会改变原查询结果。

3、再次使用逻辑判断语句,访问"http://www.xxx12.com/1.php?id=2 and 1=2",若页面无法查询出数据,说明注入有效,因为"and 1=2"为假,会使得整个条件表达式失效,从而影响查询结果。

数字型注入通常出现在弱类型语言(如ASP、PHP)编写的Web应用中,这类语言允许变量自动推导类型,给注入攻击提供了可乘之机。

字符型注入

接下来是字符型注入。这种情况下,当参数为字符串类型时,例如用户名、邮箱等,会出现字符型注入的情况。此时,字符串值被单引号(')闭合。攻击者需找到合适的注入点,通过闭合原有的SQL语句并插入注释符来绕过原查询逻辑。

例如,一个注入实例可能是:"http://www.xxx12.com//login.php?username=admin'-- ",这里的"--"用于注释掉SQL语句后面的代码,使得原本的认证逻辑失效。

对于不同的数据库系统,其字符串连接符有所不同,如MySQL使用concat()函数或空格,SQL Server使用"+",Oracle使用"||"等。攻击者需要根据目标数据库系统的特性灵活构造恶意注入语句。

无论是POST注入(即注入字段存在于POST请求体中),还是Cookie注入(注入字段存在于HTTP Cookie中),以及其他诸如延时注入(利用数据库系统的延时特性)、搜索注入(针对搜索引擎功能的注入)、Base64注入(注入的数据经过Base64编码处理)等,它们本质上都可以归类为数字型或字符型注入的一种表现形式,关键都在于如何通过构造非法输入来影响SQL查询逻辑并达到攻击目的。

因此,防御SQL注入的关键在于对所有不受信任的用户输入进行全面的安全处理,包括但不限于参数化查询、预编译SQL语句以及合理运用Web框架提供的安全过滤函数等措施,确保应用程序在任何情况下都能正确地处理和解析用户输入,避免潜在的SQL注入风险。

场景演示

一、手工SQL注入测试

1、正常的SQL执行语句为

2、当我们在id参数后添加单引号时,系统出现错误提示。

3、若我们在该语句末尾加入"and 1=1",会发现请求结果与原始请求保持一致。

4、若在语句末尾加入"and 1=2",尽管没有错误反馈,但实际上并未查询出任何信息,这种情况

很大可能存在SQL注入漏洞。

5、我们尝试通过逐步增加字段数来探测其实际字段总数,当增加到第14个字段时,查询依然正常,说明表中存在至少14个字段。

6、然而,在尝试设置为15个字段时出现了错误,由此确认该表共有14个字段。

7、接下来,我们想要明确显示的具体列信息以便获取表名等关键数据。这时采用的是union select查询方法。需要注意的是,union查询的机制是:只有当前面的查询不正确时,后面的union select子句才会生效。从下图中我们可以看到用户ID、账号和密码分别位于表中的第1、2和3个字段。

8、随后我们进一步尝试破解数据库名称。

9、紧接着,着手爆破具体的表名。

10、继续进行以揭示字段名的爆破操作。

11、最后,针对重要字段进行测试,例如对账号密码进行盲注攻击。这里以admin用户的密码为例进行测试,因为存在两个admin账户,因此结果显示了两个密码。

其中,sdwmy用户的密码为

二、sqlmap自动化测试

在使用sqlmap工具测试之前,先来介绍一下sqlmap这款测试工具。sqlmap是一款强大的开源自动化SQL注入工具,主要用于安全渗透测试和漏洞研究。它基于Python编写,设计目标是自动检测并利用Web应用程序中的SQL注入漏洞,并进一步获取数据库服务器的控制权或提取敏感信息。主要特点和功能包括:

1、自动化检测:sqlmap能够全自动检测SQL注入漏洞,无需手动构造Payload(攻击载荷)。
2、广泛支持:支持多种数据库系统,如MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等。
3、深度探测与利用:不仅能识别出注入点,还能通过各种技术(如基于布尔的盲注、时间延迟盲注、基于错误的注入等)深入探测数据库结构,获取表名、列名以及数据内容。
4、文件操作与命令执行:在特定条件下,sqlmap还可以实现从数据库服务器上下载或上传文件,甚至执行操作系统命令。
5、指纹识别:通过独特的指纹识别技术,sqlmap可以准确识别出后台运行的数据库管理系统类型及版本。
6、高效扫描:支持代理设置,优化了算法以提高扫描效率,并提供多种绕过WAF(Web应用防火墙)和其他防护机制的方法。
7、交互式与非交互式模式:用户可以选择在命令行界面下进行详细的手动配置和交互,或者使用--batch参数以非交互方式自动执行任务。

1、在使用sqlmap工具时,我们将目标URL直接作为参数传递给sqlmap.py -u "url"。这里请注意:如果URL不包含引号,则仅针对单一参数执行;若用引号包裹整个URL,则会视为一个整体参数来运行。为了实现自动化处理和避免手动确认提示,可添加--batch选项,例如:sqlmap.py -u "http://127.0.0.1/mysql.php?news_id=1" --batch,这样sqlmap将默认接受所有操作。

2、通过运行sqlmap,可以成功识别出目标服务器的环境信息,其中包括操作系统为Windows系统、使用的数据库是MySQL、Web应用程序采用PHP版本、Web服务器是Apache版本以及MySQL的具体版本等信息。

3、下一步,查询当前所连接的数据库名称。

sqlmap.py -u "http://127.0.0.1/mysql.php?news_id=1" --current-db

4、查询以获取服务器上所有的数据库列表。

sqlmap.py -u "http://127.0.0.1/mysql.php?news_id=1" --dbs

5、在已知的cysql数据库中,进一步查询它所包含的所有表名。

sqlmap.py -u "http://127.0.0.1/mysql.php?news_id=1" --tables D cysql

6、接着,对cysql数据库中的user表进行分析,找出该表所拥有的所有字段名。

sqlmap.py -u "http://127.0.0.1/mysql.php?news_id=1" --tables D cysql -T user --columns

7、最后,在确定了user表的字段结构后,我们执行查询操作以获取user表中存储的账号(用户名)和密码信息。

sqlmap.py -u "http://127.0.0.1/mysql.php?news_id=1" D cysql -T user --dump -C 'username,password'

总结

本文解析了SQL注入原理并辅以场景演示,通过手工检测和自动化工具的运用,让读者更能了解如何有效防御这一安全威胁。希望各位在阅读实践后,能更好地掌握防范SQL注入技巧,在安全测试中确保系统数据的安全稳固。

声明

笔者初衷用于分享和推广网络安全知识,但强调任何读者应用所学须遵循法律法规与道德规范,对于不当使用导致的任何安全问题,责任自负。

如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款

往期回顾

xss研究笔记

SSRF研究笔记

dom-xss精选文章

年度精选文章

Nuclei权威指南-如何躺赚

漏洞赏金猎人系列-如何测试设置功能IV

漏洞赏金猎人系列-如何测试注册功能以及相关Tips

福利视频

笔者自己录制的一套php视频教程(适合0基础的),感兴趣的童鞋可以看看,基础视频总共约200多集,目前已经录制完毕,后续还有更多视频出品

https://space.bilibili.com/177546377/channel/seriesdetail?sid=2949374

技术交流

技术交流请加笔者微信:richardo1o1 (暗号:growing)


文章来源: https://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247493491&idx=1&sn=0aa9b7a5eace861e6615618210e02f10&chksm=e8a5ed10dfd26406bd1cff74d922783ca7cc9eb6806449612cd86a956db38b6700fc9e53b1fe&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh