OWASP——SQL注入(一)

本文详细介绍OWASP Top 10中的A1注入漏洞,包括SQL注入的基本原理、注入点检测方法、数据库基本信息获取等,并在DVWA环境中进行了实践演示。
前言

对于OWASP发布的十大安全风险简单介绍在上一篇博文已经分享了,本文是对2013年发布的OWASP Top 10中的A1注入部分进行分享学习。

本地学习环境

DVWA环境搭配:
1.本地建立DVWA环境,在线进行测试练习,前往dvwa官网下载最新版本DVWA;
2.搭建php环境以及安装mysql数据库,建议phpmyadmin安装,对于学习而言非常方便快捷,这个工具将php以及myadmin都进行封装。
3.将DVWA解压之后放入phpstudy目录下的www文件夹中,开启phpstudy的mysql和Apache的服务,在浏览器中输入127.0.0.1的本地url,进入DVWA文件夹,在登录页面输入默认帐号和密码进入实验环境。
4.DVWA Security选择相应等级为low,其他安全等级测试会后续更新。

SQL-Injection

1.注入原理:
sql语句可以被服务器接收作为输入参数,而我们可以通过sql语句的注入达到获取数据库信息的目的,主要是一些敏感信息,下图为客户端与服务器及数据库之间简单联系。

1

2.注入场景:
表单输入或者存在客户端输入的地方都可能作为注入利用,而这是利用服务端接收到来自客户端的信息而没有做较好过滤的缺陷,将一些非法输入内容传送到数据库获取一些敏感数据。
3.注入点测试:
通过sql注入的原理,可能中间具体是怎样的还不能完全清晰,但是知道是因为什么导致可以注入,而要实现注入的关键起始就是找到注入点,注入点就是可以将外部指令内容作为数据传输到服务端的数据库的位置,而最简单的测试便是单引号',因为服务端写好的php中的数据库语句可能是

select * from user where user='' and pass=''

而数据库查询时引号是字符串内容合闭的符号,是成对出现的,而我们输入的单引号能够不被过滤就会使得查询语句变为user=''' and pass='',这便出现了落单的单引号,数据库就会报错,在dvwa中会显示错误点,这便说明这是一个注入点。
找到注入点便可以将一些复杂的查询语句进行注入然后被执行,达到我们的渗透目的。

上述的简单判断是否有注入点的方法被叫作基于报错的检测方法,是比较基础的办法(暂定义为low等级),这种方法除了单引号,还可以使用双引号,百分号以及小括号。

还可以通过布尔逻辑判断进行检测,这个便是使用到逻辑布尔运算符,将上述方法的输入内容换为“1’and’1”,布尔值为真可以得到一个正确的返回值,如果变为“1’and’2”,可以得到一个错误或者不会有正确结果,这时可以确定是存在注入的。

我把注入点检测方法归结为以下简单的两点(学习比较深入的大神欢迎补充):

1).基于报错的检测方法

2).基于布尔的检测

4.字段数
当知道注入点之后,为了能更好的展开注入,需要对查询的字段进行检测,因为这对注入的信息获取很有帮助,同时也会让注入者明确知道得到的信息来自哪里。
上面展示的web服务端的sql语句只是一个猜想,可能不不是这些字段的查询,可能是单一字段查询,可能是使用“*”对所有字段进行查询。

对查询的字段个数进行判断可以使用order by语句,在数据库中“order by”是对结果集进行排序用的,还可以设置升降,不过这里用默认的“order by”就可以。

如果查询语句是使用所有字段即*,那么“order by”可以得到字段的长度即一共多少个字段,但是如果是指定字段查找就不一定得到所有字段。

在测试字段个数时需要对其进行一个模糊检测,因为一开始也不知道具体是多少个对象,如果输入' order by 50--,那么sql语句为

select * from user where user='' order by 50-- '

其中为了保证引号的合闭,最后使用注释符号“– ”或者“#”,“– ”最后带有一个空格,这样得到错误提示便说明字段数不正确,不断缩减至当不报错时可以确定字段数在上一个报错到目前的数字范围,最后可以得到当前的字段数。

在得到字段数之后就要知道哪些字段,因为使用多条语句单独查询可能在web服务端的sql语句是不符合逻辑的,这时需要union进行联合查询替代多条查询语句,如已知字段数是2,可以通过输入' union select 1,2--得到字段名。
5.数据库基本信息
在上述的sql字段测试中我们使用了带union的联合查询,此后为了进一步地得到sql中的数据信息,需要变换查询内容,如要得到当前数据库的帐号可以使用user()函数,在查询结果中会返回当前数据库使用的帐号名,要知道当前数据库版本信息可以使用version()函数,从版本可以推知是使用mysql,还是sql server,或者oracle版本的数据,就像dvwa中显示的是5.0.51,这个只能是mysql的数据库,要知道数据库名可以使用database()函数。
在查完这些信息之后,就要去查询表的具体内容,而除了查询函数外还可以使用全局变量得到更多信息,@@datadir可以得到当前数据库所在目录,@@hostname可以得到使用的主机名,@@VERSION和version()函数效果一样,@@version_compile_os可以得到所在系统版本,CHAR()函数可以将ASCII码转为对应字符以应对一些字符串过滤。
而在dvwa的测试中因为只有两个字段,要获取所有信息需要分多次来获得,这时可以使用连接字符串显示多个信息,CONCAT_WS(CHAR(32,58,32),USER(),DATABASE(),VERSION())这样得到三个信息且用三个字符分割。

Q:知道数据库版本有什么用?
A:因为不同数据库类型版本有不同的特征可以利用,像mysql将所有元数据保留在一张表中,这张表是information_schema,它包含所有库的信息。

6.数据库查询
' union select table_name,table_schema from information_schema.tables--,table_name就是所有的表名,table_schema是所有的库,information_schema.tables就是这个表中所有的表名(其中mysql库有17张表,听说要深入了解mysql要对其17张表弄懂),对不同库及表进行归类,
'UNION select table_schema,count(*) FROM information_Schema.tables group by
table_schema --

7.数据表查询
' union select table_name,table_schema from information_schema.tables where table_schema='dvwa'--
8.数据字段查询
' union select table_name,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'--
9.数据字段敏感内容查询
' union select user,password from users--

实践测试结果

1.等级安全:选择安全等级

2.测试注入点:
1

3.字段数:
1)长度为3的测试:2
2)长度为2的测试:3
4.数据库基本信息:
4
5.查询数据库:
5
6.查询数据表:
6
7.查询字段名:
7
8.查询字段内容:
8

小结

测试结果顺利找到并利用注入漏洞将数据库中账户密码获取,但是这是一个布置好漏洞环境的实验平台,如果是实际web应用平台,发现这样的漏洞时,不要好奇心作怪去盗取他人的信息,可以将漏洞信息及修补方案交给该应用企业管理维护人员去修补。

<think> 首先,用户的问题是关于OWASP靶场中SQL注入漏洞第三关,具体是insert注入的完成方法。用户引用了[1]到[5],这些引用描述了SQL注入般概念、危害、原因和不同类型,包括insert注入。 关键点: - 引用[2]提到pikachu靶场有个insert注入点,在注册时没有防护,导致前端的输入可以拼接到后端的insert操作中。 - 用户指定OWASP靶场,第三关是insert注入。 我需要基于系统级指令: - 使用中文回答。 - 所有行内数学表达式用$...$格式(但这个问题可能不涉及数学,所以可能无用)。 - 独立公式用$$...$$格式单独成段(同样,可能不适用)。 - LaTeX语法正确(确保任何公式正确)。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 回答结构: - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠(基于我的知识,SQL注入是常见的web安全漏洞)。 - 参考用户提供的引用,但用户说这些引用仅供参考,不是真正需求。我应该专注于用户的问题。 用户真正需求:获取在OWASP靶场下完成SQL注入漏洞第三关(insert注入)的方法。 OWASP靶场通常指的是OWASP WebGoat或类似项目,但用户提到了OWASP靶场和pikachu靶场。引用[2]提到了pikachu靶场,而引用[3]提到OWASP top 10。用户指定了OWASP靶场第三关insert注入。 在OWASP WebGoat中,有SQL Injection章节,可能有多个关卡。用户说“第三关insert注入”,我需要回想或基于标准知识。 如果我不确定具体靶场,我应该提供般方法。 步骤: 1. **理解insert注入**:SQL注入发生在INSERT语句中,通常在新记录创建时,如用户注册。攻击者可以通过输入特殊字符来闭合SQL语句并注入恶意代码。 2. **般方法**: - 找到注入点:在表单中,如注册页面。 - 测试输入:输入特殊字符如单引号'来引发错误。 - 闭合语句:例如,在用户名字段输入 ' or '1'='1 等。 - 执行恶意操作:如提取数据、修改数据库等。 3. **针对OWASP靶场**:假设是OWASP WebGoat或类似,我需要描述如何完成第三关。 - 回忆:在WebGoat的SQL Injection部分,Lesson 3 可能是关于INSERT注入。 - 核心步骤:通常涉及在个注册表单中注入代码来改变行为或窃取信息。 基于引用[2]:"前端注册信息会被后台通过insert插入到数据库",所以靶场中可能有个注册页面。 完成方法: - **登录或访问页面**:用户需要访问靶场的SQL注入第三关页面。 - **识别输入点**:如用户名、邮箱等字段。 - **注入payload**:输入精心构造的字符串来操纵SQL语句。 - **示例payload**:对于insert注入,常见的是闭合字符串并添加额外命令。 - 例如:在用户名输入 `admin'); -- ` 然后其他字段随意,这可能在插入时结束语句并注释掉剩余部分。 - 或者注入查询来泄露数据。 具体步骤: 1. 打开OWASP靶场的SQL注入第三关。 2. 页面可能是个注册表单。 3. 在输入框中,尝试测试注入:输入 `'` 看是否有错误。 4. 如果错误出现,确认SQL注入漏洞。 5. 构造payload:如 `' or 1=1 -- ` 或更复杂的来执行操作。 6. 提交表单,观察结果(如错误消息、数据库变化)。 为了更有帮助,提供具体payload和期望结果。 生成相关问题: - 在末尾添加相关问题,如系统指令所说。 引用标识:在回答中,如果引用提供的引用,添加[^n],但用户说这些仅供参考。我应该自然地融入,如果不直接引用,可能不需要。 最终回答框架: - 介绍:简要解释insert注入。 - 逐步方法:如何完成第三关。 - 示例:给出payload示例。 - 注意事项:安全实践(仅在靶场测试)。 - 相关问题。 </think> ### OWASP靶场SQL注入漏洞第三关(Insert注入)完成方法指南 OWASP靶场(如OWASP WebGoat或类似平台)是学习Web安全的标准工具,其中SQL注入漏洞第三关通常聚焦于“Insert注入”——发生在数据库INSERT操作中(如用户注册或数据添加表单)。根据您提供的引用,Insert注入的核心原因是前端输入未经严格过滤,直接拼接到后端SQL语句中执行,导致恶意操作(如数据泄露、篡改或删除)[^2][^5]。下面我将基于OWASP靶场标准设置,步步指导您完成第三关的方法。所有操作均在假设环境下进行(切勿用于真实系统),确保安全测试。 --- ### 步骤1: 访问并识别注入OWASP靶场的SQL注入第三关通常设计为个用户注册页面(例如,URL类似`/sql-injection/insert`)。 - **操作步骤**: 1. 登录OWASP靶场,导航到SQL Injection模块的第三关(常标记为“Insert Injection”或“注册表单注入”)。 2. 页面会显示个注册表单,包含字段如“用户名”、“邮箱”、“密码”等。这些是潜在的注入点,后台使用类似`INSERT INTO users (username, email, password) VALUES ('输入值', '输入值', '输入值')`的SQL语句[^1][^2]。 - **关键验证**: 在“用户名”字段输入单引号`'`,提交表单。如果系统返回SQL错误(如“语法错误”或“数据库异常”),则确认存在SQL注入漏洞[^4][^5]。 --- ### 步骤2: 构造并测试Insert注入Payload Insert注入的目标是通过闭合VALUES字符串并注入恶意代码,操纵INSERT语句(如添加额外SQL命令)。以下是常见场景和payload示例: - **基础闭合测试**: - **Payload**: 在“用户名”字段输入 `admin'); -- ` (注意:`-- `用于注释后续语句)。 - **预期结果**: SQL语句变为: ```sql INSERT INTO users (username, email, password) VALUES ('admin'); -- ', '正常邮箱', '正常密码'); ``` 这会导致仅插入`admin`用户,并忽略后续字段(不触发错误)。如果提交后系统返回“注册成功”但数据不完整,证明注入成功[^2][^5]。 (引用说明:Insert注入的形成是由于前端输入直接拼接到INSERT语句中[^2]。) - **恶意操作示例(完成关卡目标)**: OWASP靶场第三关常要求执行特定操作,如“获取管理员权限”或“泄露敏感数据”。以下是通用方法: 1. **提取数据库信息**: - **Payload**: 在“用户名”字段输入: ```sql '); SELECT 'hacked' AS result FROM users WHERE '1' = '1 ``` - **解释**: 闭合INSERT语句后,注入SELECT查询提取所有用户数据。提交后,检查响应页面是否有额外数据输出(如用户列表)[^3][^5]。 2. **添加管理员用户**: - **Payload**: 在“用户名”字段输入: ```sql '); INSERT INTO users (username, email, password) VALUES ('attacker', 'attack@example.com', 'hacked'); -- ``` - **预期结果**: 在原始INSERT后,额外插入个恶意用户。提交后,用该用户登录验证权限(靶场常设计为触发“关卡完成”通知)[^4][^5]。 --- ### 步骤3: 验证结果和调试技巧 - **验证方法**: - 提交payload后,观察页面响应: - 成功注入:显示“注册成功”但数据异常、数据库错误消息或直接关卡通关提示。 - 失败处理:如果无响应,尝试添加`OR 1=1`或换用双引号`"`闭合(引用中提到字符型注入适用)。 - 工具辅助:使用Burp Suite拦截HTTP请求,修改POST数据测试payload(更精确控制输入)[^3][^5]。 - **常见错误解决**: - **输入被过滤**: 尝试URL编码payload,如`'` 替换为 `%27`。 - **无错误回显**: 改用时间盲注payload,如 `'); IF (1=1) WAITFOR DELAY '0:0:5' -- `,延迟响应表示注入成功(引用[^4]提到盲注类型)[^4]。 - **靶场特定要求**: OWASP WebGoat关卡可能有自定义目标(如修改特定表),检查关卡提示调整payload。 --- ### 安全注意事项 - **仅在靶场测试**: Insert注入危害巨大,可导致数据泄露或服务器沦陷[^1][^3]。务必在OWASP、Pikachu等安全环境中操作。 - **防御建议**: 开发中应使用参数化查询(如PHP的PDO、Python的SQLAlchemy)和输入验证,避免直接拼接SQL[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值