Cross Site Scripting

2

同一URL在多个选项卡之间共享cookie。

体验新开一个相同URL的选项卡页面,在控制台输出cookie。

其实,直接点击复选按钮,提交就过关,这里只是为了让你了解相关知识。

7

反射型XSS。

确定哪个字段容易受到XSS的影响。可以用 alert() 或者 console.log() 测试。

首先尝试这两个可以直接输入的输入框,发现不行。

那就看看发送的请求数据包,然后直接改请求参数。发现上面的四个价格参数是要转为数值类型的,没法xss。

那么还是要搞下面的这两个可控参数了。直接提交正常的参数,发现页面回显了 credit card。那么这个参数可能存在xss,现在只测试 credit card 这个值。

credit card 这个参数确实存在反射型xss。

刚才同时测试下面两个输入框的时候显示做了xss安全检查,其实只做了第二个参数 access code的检查。

所以说,别急着上来就注入,应该先看看正常请求有什么响应。

10

DOM型XSS。

基于DOM的XSS通常可以通过在客户端代码中(HTML或JavaScript)通过查找路由配置来找到,即寻找一条将输入“反射”到页面的路径。

检查JavaScript源代码,找到测试用的路由路径。

搜索js文件夹下包含 route的文件,可以找到一个 testRoute路由路径。

那么,提交 start.mvc#test 这个路由就行了。

不过还是来验证一下吧:

1
2
# 访问这个链接
http://www.webgoat.local:8080/WebGoat/start.mvc#test/%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E

出现了xss弹窗,验证成功。

11

利用上面找到的路由路径实施DOM XSS攻击。

使用上面找到的路由路径,看看是否可以使用它来反射路由中的参数,而无需编码即可在WebGoat中执行内部函数。要执行的函数是:webgoat.customjs.phoneHome() 。一旦触发它,浏览器控制台将收到一个随机数作为后续响应。

直接使用上面的路由路径来执行指定的js代码:webgoat.customjs.phoneHome()

1
2
# 访问这个链接,在开发者工具的控制台中即可获得返回的随机数
http://www.webgoat.local:8080/WebGoat/start.mvc#test/%3Cscript%3Ewebgoat.customjs.phoneHome%28%29%3C%2Fscript%3E

12

回答安全问题。

淦,依旧看不到题目。参考上面的CIA Triad解决吧。

答案:4,3,1,2,4

Cross Site Scripting (stored)

3

存储型XSS。

发一条评论,使其可以执行js代码:webgoat.customjs.phoneHome()。将控制台回显的随机数提交即可。

1
2
# 评论框提交内容
<script>webgoat.customjs.phoneHome()</script>

Cross Site Scripting (mitigation)

5

尝试通过转义JSP文件中的URL参数来防止反射型XSS。

可以使用OWASP提供的OWASP Java Encoder进行转义处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@taglib prefix="e" uri="https://www.owasp.org/index.php/OWASP_Java_Encoder_Project" %>
<html>
<head>
<title>Using GET and POST Method to Read Form Data</title>
</head>
<body>
<h1>Using POST Method to Read Form Data</h1>
<table>
<tbody>
<tr>
<td><b>First Name:</b></td>
<td>${e:forHtml(param.first_name)}</td>
</tr>
<tr>
<td><b>Last Name:</b></td>
<td>${e:forHtml(param.last_name)}</td>
</tr>
</tbody>
</table>
</body>
</html>

6

防止存储型XSS。

参考OWASP AntiSamy,通过在saveNewComment()函数中创建一个干净的字符串来防止存储型XSS。使用“antisamy slashdot.xml”作为此示例的策略文件。

1
2
3
4
5
6
7
8
9
10
11
import org.owasp.validator.html.*;
import MyCommentDAO;

public class AntiSamyController {
public void saveNewComment(int threadID, int userID, String newComment){
Policy policy = Policy.getInstance("antisamy-slashdot.xml");
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(newComment, policy);
MyCommentDAO.addComment(threadID, userID, cr.getCleanHTML());
}
}

Path traversal

2

在该任务中,目标是覆盖文件系统上的特定文件。需要将文件上传到默认上传位置之外的位置。

1
2
3
4
# 默认文件上传位置:
C:\Users\xxx\.webgoat-2023.8\PathTraversal\admin12138\
# 题目要求位置:
C:\Users\xxx/.webgoat-2023.8/PathTraversal

点击头像可以上传文件:

上传图像的数据包显示文件保存成功,但是文件名并不是原来的文件名,而是 test。猜测保存的文件名由 fullName决定。

发现确实如此。

那么将 fullName 修改为 ../test 即可。

3

同上一题目的要求,但是这里修复了程序,从输入中过滤了 ../

可以尝试双写绕过,即 ..././

4

同上一题目的要求,但是这里又修复了程序,但是这里又开始改用原始文件名来保存上传的文件了。

那直接改原始文件名就行了。

5

通过路径遍历检索其他文件。

路径遍历不限于文件上传;在检索文件时,可能会出现路径遍历可以从系统中检索其他文件的情况。在这个题目中,需要找到一个名为path-traversal-secret.jpg的文件。

点击show random cat picture,查看数据包响应,回显了图像的文件名。

那我们直接试试添加指定图像的文件名参数访问。

根据返回的响应可以看到指定的id值不对,不需要加扩展名。

那么,我们直接通过目录穿越来遍历path-traversal-secret.jpg这个文件。响应表明需要对 ../ 进行URL编码为 %2e%2e%2f

依次向上翻了两层目录,终于找到了该文件,回显得到了文件内容。

文件内容提示:username 的 SHA-512 hash 值即为需要提交的结果。

找个工具计算一下就行了,注意是webgoat的登录用户名。

7

题目只允许上传zip文件。但是上传的zip文件会被解压,但不会替换您的图像。

您需要替换的配置文件图像的位置:
C:\Users\xxx/.webgoat-2023.8/PathTraversal/admin12138/admin12138.jpg

直接上传包含图像的zip文件,报错。

从回显中可知,需要先向上遍历四层目录到达 C:\Users\xxx,再切换到目标目录 .webgoat-2023.8\PathTraversal\admin12138\admin12138.jpg 就行了。

1
2
# 通过目录穿越到目标地址
../../../..\.webgoat-2023.8\PathTraversal\admin12138\admin12138.jpg

首先,按照上面响应回显的文件夹路径创建文件夹和文件:

此处,在Windows下使用zip命令(需要自行安装)来压缩一个带有自定义相对路径的压缩包。

1
2
3
4
5
# 切换目录
cd C:\Users\xxx\AppData\Local\Temp\admin121389178308080598400146

# 压缩文件
zip C:\Users\xxx\Desktop\1.zip ../../../..\.webgoat-2023.8\PathTraversal\admin12138\admin12138.jpg

注意,先删除原先自己制作的 C:\Users\xxx\.webgoat-2023.8\PathTraversal\admin12138\admin12138.jpg文件!

然后,上传这个压缩包 1.zip,搞定。