freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

入门必备知识:深入浅出学SQL注入
2024-01-23 17:10:32

介绍

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执行语句为

1705995055_65af6b2f8f3dd1c961f6e.png!small?1705995055836

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

1705995069_65af6b3dee55f448b4308.png!small?1705995070283

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

1705995083_65af6b4bceb1fc72cabb8.png!small?1705995084167

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

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

1705995098_65af6b5a0665d3dd315c7.png!small?1705995098258

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

1705995119_65af6b6f5818016284156.png!small?1705995119547

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

1705995263_65af6bff640281e7ec8df.png!small?1705995263643

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

1705995275_65af6c0b865d763b7d6e6.png!small?1705995275904

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

1705995290_65af6c1a153dc5e3e0847.png!small?1705995290404

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

1705995302_65af6c2609e138b025d1e.png!small?1705995302430

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

1705995313_65af6c3100ae0d5820a91.png!small?1705995313266

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

1705995324_65af6c3c3038ae2f2a7a0.png!small?1705995324518

其中,sdwmy用户的密码为

1705995348_65af6c54450a9fd611ee9.png!small?1705995348648

二、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将默认接受所有操作。

1705998362_65af781a23a31f8c29fe7.png!small?1705998362422

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

1705998405_65af78453929ed501cad6.png!small?1705998405406

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

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

1705998507_65af78ab3df153545049a.png!small?1705998507454

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

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

1705998580_65af78f4f058006e7129c.png!small?1705998581163

1705998648_65af793832cd401b0c945.png!small?1705998648483

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

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

1705998761_65af79a97d9092bb8b011.png!small?1705998761711

1705998785_65af79c1965b609261f09.png!small?1705998785710

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

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

1705998834_65af79f21281f095a8639.png!small?1705998834607

1705998847_65af79ffb80573c4ffcdb.png!small?1705998847937

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

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

1705998930_65af7a52c20b9233f3376.png!small?1705998931037

1705998943_65af7a5f73e53f45f2ce6.png!small?1705998943618

总结

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

声明

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

# 漏洞 # 渗透测试 # web安全 # 数据安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录