Compare commits
No commits in common. "main" and "v2025.2" have entirely different histories.
@ -1,18 +0,0 @@
|
|||||||
on: [push]
|
|
||||||
|
|
||||||
name: DDSCA
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
software-composition-analysis:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Datadog SBOM Generation and Upload
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Check imported libraries are secure and compliant
|
|
||||||
id: datadog-software-composition-analysis
|
|
||||||
uses: DataDog/datadog-sca-github-action@main
|
|
||||||
with:
|
|
||||||
dd_api_key: ${{ secrets.DD_API_KEY }}
|
|
||||||
dd_app_key: ${{ secrets.DD_APP_KEY }}
|
|
||||||
dd_site: datadoghq.com
|
|
@ -1,21 +0,0 @@
|
|||||||
on: [push]
|
|
||||||
|
|
||||||
name: DDSDS
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
static-analysis:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Datadog Static Analyzer
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Check code for comitted secrets
|
|
||||||
id: datadog-static-analysis
|
|
||||||
uses: DataDog/datadog-static-analyzer-github-action@v1
|
|
||||||
with:
|
|
||||||
dd_api_key: ${{ secrets.DD_API_KEY }}
|
|
||||||
dd_app_key: ${{ secrets.DD_APP_KEY }}
|
|
||||||
dd_site: datadoghq.com
|
|
||||||
secrets_enabled: true
|
|
||||||
static_analysis_enabled: false
|
|
||||||
cpu_count: 2
|
|
@ -1,23 +0,0 @@
|
|||||||
on: [push]
|
|
||||||
|
|
||||||
name: DDSAST
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
static-analysis:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Datadog Static Analyzer
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Check code meets quality and security standards
|
|
||||||
id: datadog-static-analysis
|
|
||||||
uses: DataDog/datadog-static-analyzer-github-action@v1
|
|
||||||
with:
|
|
||||||
dd_api_key: ${{ secrets.DD_API_KEY }}
|
|
||||||
dd_app_key: ${{ secrets.DD_APP_KEY }}
|
|
||||||
dd_site: datadoghq.com
|
|
||||||
cpu_count: 8
|
|
||||||
env:
|
|
||||||
DD_API_KEY: ${{ secrets.DD_API_KEY }}
|
|
||||||
DD_APP_KEY: ${{ secrets.DD_APP_KEY }}
|
|
||||||
DD_SITE: datadoghq.com
|
|
@ -1,171 +0,0 @@
|
|||||||
name: Scheduled Fake Commits
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Trigger the workflow on a schedule.
|
|
||||||
schedule:
|
|
||||||
# This expression means "run every 3 minutes". Useful for testing.
|
|
||||||
# To revert to the original 8-hour schedule, change this to '0 */8 * * *'.
|
|
||||||
- cron: "0 */12 * * *" # Original schedule: every 8 hours
|
|
||||||
|
|
||||||
# To trigger manually for testing, you can add workflow_dispatch:
|
|
||||||
# workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
create_scheduled_commits:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
# Fetch the full history to ensure pushes work correctly
|
|
||||||
fetch-depth: 0
|
|
||||||
# Use a token with write access. This should be stored as a secret in your Gitea repo settings.
|
|
||||||
# The default GITEA_TOKEN might not have push permissions, so a Personal Access Token is recommended.
|
|
||||||
# Ensure you have a secret named GITEA_TOKEN with appropriate permissions (including write:actions or api)
|
|
||||||
token: ${{ secrets.GLOBAL_KEY }} # Replace GITEA_TOKEN with the name of your secret
|
|
||||||
|
|
||||||
- name: Set up Git config
|
|
||||||
# Configure Git user details globally for the runner
|
|
||||||
run: |
|
|
||||||
echo "setting up git config"
|
|
||||||
git config --global user.name "Gitea Actions Bot"
|
|
||||||
git config --global user.email "actions-bot@your-gitea-instance.com" # Replace with a suitable email
|
|
||||||
echo "git config setup complete"
|
|
||||||
|
|
||||||
- name: Create and Push Commits and Trigger Workflows
|
|
||||||
id: push_commits_and_trigger # Updated ID
|
|
||||||
env:
|
|
||||||
# Define your list of authors here. Each author should be on a new line,
|
|
||||||
# formatted as "Author Name <author@email.com>".
|
|
||||||
# For production, this should ideally be stored as a secret named FAKE_COMMIT_AUTHORS.
|
|
||||||
# For debugging, you can define it directly here as you have done.
|
|
||||||
AUTHOR_LIST: |
|
|
||||||
Author One <author1@example.com>
|
|
||||||
Author Two <author2@example.com>
|
|
||||||
Author Three <author3@example.com>
|
|
||||||
Author Four <author4@example.com>
|
|
||||||
Author Five <author5@example.com>
|
|
||||||
Author Six <author6@example.com>
|
|
||||||
Author Seven <author7@example.com>
|
|
||||||
Author Eight <author8@example.com>
|
|
||||||
Author Nine <author9@example.com>
|
|
||||||
Author Ten <author10@example.com>
|
|
||||||
DWSAuthor One <dwsauthor1@example.com>
|
|
||||||
DWSAuthor Two <dwsauthor2@example.com>
|
|
||||||
DWSAuthor Three <dwsauthor3@example.com>
|
|
||||||
DWSAuthor Four <autdwshor4@example.com>
|
|
||||||
DWSAuthor Five <autdwshor5@example.com>
|
|
||||||
DWSAuthor Six <autdwshor6@example.com>
|
|
||||||
DWSAuthor Seven <adwsuthor7@example.com>
|
|
||||||
DWSAuthor Eight <adwsuthor8@example.com>
|
|
||||||
DWSAuthor Nine <autdwshor9@example.com>
|
|
||||||
DWSAuthor Ten <autdwshor10@example.com>
|
|
||||||
COMMIT_COUNT: 3 # Number of commits to create
|
|
||||||
SLEEP_SECONDS: 150 # Delay between commits in seconds
|
|
||||||
TARGET_BRANCH: main # The branch to commit to and trigger workflows on
|
|
||||||
GITEA_BASE_URL: https://git.dws.rip # Replace with your Gitea instance URL
|
|
||||||
REPO_OWNER: dubey # Replace with your repository owner/organization
|
|
||||||
REPO_NAME: WebGoat # Replace with your repository name
|
|
||||||
# Define a space-separated list of workflow names to trigger
|
|
||||||
WORKFLOW_NAMES: "DDSAST DDSDS DDSCA" # Replace with the actual names of your workflows
|
|
||||||
|
|
||||||
run: |
|
|
||||||
echo "starting Create and Push Commits and Trigger Workflows step"
|
|
||||||
echo "AUTHOR_LIST content:"
|
|
||||||
# Mask sensitive content if AUTHOR_LIST were a secret, but here it's in the workflow file for debugging
|
|
||||||
# echo "$AUTHOR_LIST" | sed 's/@[^>]*>/@***/g' # Example masking
|
|
||||||
|
|
||||||
echo "reading author's list into array"
|
|
||||||
# Read authors into a Bash array using readarray
|
|
||||||
readarray -t authors <<< "$AUTHOR_LIST"
|
|
||||||
echo "finished reading author's list into array"
|
|
||||||
|
|
||||||
# Check if authors list is empty
|
|
||||||
if [ ${#authors[@]} -eq 0 ]; then
|
|
||||||
echo "Error: AUTHOR_LIST is empty or could not be parsed into an array."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Shuffle the authors array to randomize the order
|
|
||||||
authors=($(printf "%s\n" "${authors[@]}" | shuf))
|
|
||||||
|
|
||||||
# Read workflow names into a Bash array
|
|
||||||
IFS=' ' read -r -a workflow_array <<< "$WORKFLOW_NAMES"
|
|
||||||
echo "Workflows to trigger: ${workflow_array[@]}"
|
|
||||||
|
|
||||||
echo "Starting commit creation process..."
|
|
||||||
echo "Authors available: ${#authors[@]}"
|
|
||||||
echo "Commits to create: $COMMIT_COUNT"
|
|
||||||
echo "Delay between commits: $SLEEP_SECONDS seconds"
|
|
||||||
echo "Target branch: $TARGET_BRANCH"
|
|
||||||
|
|
||||||
# Loop to create the specified number of commits
|
|
||||||
for i in $(seq 1 $COMMIT_COUNT); do
|
|
||||||
# Calculate the index for the current author, cycling through the list
|
|
||||||
author_index=$(( (i - 1) % ${#authors[@]} ))
|
|
||||||
current_author="${authors[$author_index]}"
|
|
||||||
|
|
||||||
echo "Processing author: $current_author" # Debug echo
|
|
||||||
|
|
||||||
# Extract name and email from the author string
|
|
||||||
# Assumes format "Name <email>"
|
|
||||||
author_name=$(echo "$current_author" | sed -E 's/^(.*) <.*>$/\1/')
|
|
||||||
author_email=$(echo "$current_author" | sed -E 's/^.* <(.*)>$/\1/')
|
|
||||||
|
|
||||||
echo "Extracted name: $author_name, email: $author_email" # Debug echo
|
|
||||||
|
|
||||||
echo "--- Creating commit $i of $COMMIT_COUNT by $author_name ---"
|
|
||||||
|
|
||||||
# Configure git user for this specific commit
|
|
||||||
git config user.name "$author_name"
|
|
||||||
git config user.email "$author_email"
|
|
||||||
|
|
||||||
# Create a dummy change: append current timestamp and author to a file
|
|
||||||
# This ensures there's always something to commit
|
|
||||||
echo "$(date): Commit $i by $author_name" >> fake_commit_log.txt
|
|
||||||
|
|
||||||
# Stage the changes
|
|
||||||
git add fake_commit_log.txt
|
|
||||||
|
|
||||||
# Commit the changes
|
|
||||||
git commit -m "Automated commit $i by $author_name"
|
|
||||||
|
|
||||||
# Push the commit to the target branch
|
|
||||||
# Use --set-upstream origin $TARGET_BRANCH on the first push if needed
|
|
||||||
echo "Pushing commit..."
|
|
||||||
git push origin HEAD:$TARGET_BRANCH
|
|
||||||
|
|
||||||
echo "Commit $i pushed successfully."
|
|
||||||
|
|
||||||
# --- Trigger the other workflows after each successful push ---
|
|
||||||
echo "Triggering specified workflows on branch '$TARGET_BRANCH' for commit $i..."
|
|
||||||
|
|
||||||
# Loop through the list of workflow names and trigger each one
|
|
||||||
for workflow_name in "${workflow_array[@]}"; do
|
|
||||||
echo "Attempting to trigger workflow: $workflow_name"
|
|
||||||
# Construct the API URL
|
|
||||||
API_URL="${GITEA_BASE_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/actions/workflows/${workflow_name}/dispatches"
|
|
||||||
|
|
||||||
# Use curl to send the API request
|
|
||||||
# Requires a GITEA_TOKEN with write:actions or api scope
|
|
||||||
curl -X POST \
|
|
||||||
-H "Authorization: Bearer ${{ secrets.GLOBAL_KEY }}" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"ref": "'"$TARGET_BRANCH"'"}' \
|
|
||||||
"$API_URL"
|
|
||||||
|
|
||||||
echo "Workflow trigger request sent for workflow '$workflow_name' for commit $i."
|
|
||||||
done
|
|
||||||
echo "Finished triggering workflows for commit $i."
|
|
||||||
# --- End Trigger ---
|
|
||||||
|
|
||||||
|
|
||||||
# Wait for the specified delay before the next commit, unless it's the last one
|
|
||||||
if [ $i -lt $COMMIT_COUNT ]; then
|
|
||||||
echo "Waiting for $SLEEP_SECONDS seconds before the next commit..."
|
|
||||||
sleep $SLEEP_SECONDS
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Finished creating $COMMIT_COUNT commits and triggering workflows."
|
|
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
@ -68,7 +68,7 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: "Set up QEMU"
|
- name: "Set up QEMU"
|
||||||
uses: docker/setup-qemu-action@v3.6.0
|
uses: docker/setup-qemu-action@v3.4.0
|
||||||
with:
|
with:
|
||||||
platforms: all
|
platforms: all
|
||||||
|
|
||||||
@ -76,13 +76,13 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: "Login to dockerhub"
|
- name: "Login to dockerhub"
|
||||||
uses: docker/login-action@v3.4.0
|
uses: docker/login-action@v3.3.0
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: "Build and push WebGoat"
|
- name: "Build and push WebGoat"
|
||||||
uses: docker/build-push-action@v6.16.0
|
uses: docker/build-push-action@v6.14.0
|
||||||
with:
|
with:
|
||||||
context: ./
|
context: ./
|
||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
@ -95,7 +95,7 @@ jobs:
|
|||||||
webgoat_version=${{ env.WEBGOAT_MAVEN_VERSION }}
|
webgoat_version=${{ env.WEBGOAT_MAVEN_VERSION }}
|
||||||
|
|
||||||
- name: "Build and push WebGoat desktop"
|
- name: "Build and push WebGoat desktop"
|
||||||
uses: docker/build-push-action@v6.16.0
|
uses: docker/build-push-action@v6.14.0
|
||||||
with:
|
with:
|
||||||
context: ./
|
context: ./
|
||||||
file: ./Dockerfile_desktop
|
file: ./Dockerfile_desktop
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -39,6 +39,7 @@ UserDatabase.mv.db
|
|||||||
webgoat-container/src/main/webapp/users/guest.org.owasp.webgoat.plugin.*.props
|
webgoat-container/src/main/webapp/users/guest.org.owasp.webgoat.plugin.*.props
|
||||||
webgoat-container/src/main/webapp/plugin_lessons/dist-*.pom
|
webgoat-container/src/main/webapp/plugin_lessons/dist-*.pom
|
||||||
webgoat-lessons/**/target
|
webgoat-lessons/**/target
|
||||||
|
**/*.jar
|
||||||
**/.DS_Store
|
**/.DS_Store
|
||||||
webgoat-server/mongo-data/*
|
webgoat-server/mongo-data/*
|
||||||
webgoat-lessons/vulnerable-components/dependency-reduced-pom.xml
|
webgoat-lessons/vulnerable-components/dependency-reduced-pom.xml
|
||||||
|
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
Binary file not shown.
2
.mvn/wrapper/maven-wrapper.properties
vendored
2
.mvn/wrapper/maven-wrapper.properties
vendored
@ -1,2 +1,2 @@
|
|||||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
|
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
|
||||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
||||||
|
@ -99,7 +99,7 @@ For a full overview of all the parameters you can use, please check the [WebGoat
|
|||||||
|
|
||||||
### Prerequisites:
|
### Prerequisites:
|
||||||
|
|
||||||
* Java 23
|
* Java 17 or 21
|
||||||
* Your favorite IDE
|
* Your favorite IDE
|
||||||
* Git, or Git support in your IDE
|
* Git, or Git support in your IDE
|
||||||
|
|
||||||
|
@ -1,17 +1,5 @@
|
|||||||
# WebGoat release notes
|
# WebGoat release notes
|
||||||
|
|
||||||
## Version 2025.3
|
|
||||||
|
|
||||||
### 🐞 Bug fixes
|
|
||||||
|
|
||||||
- Changed URLs imply other exclusion filters for ZAP (#2052)
|
|
||||||
- XSS lesson stage 12 (2 issues) (#1178)
|
|
||||||
|
|
||||||
### 🔄 Technical tasks
|
|
||||||
|
|
||||||
- bump docker/setup-qemu-action from 3.4.0 to 3.6.0 (#2049)
|
|
||||||
- bump docker/build-push-action from 6.14.0 to 6.15.0 (#2050)
|
|
||||||
|
|
||||||
## Version 2025.2
|
## Version 2025.2
|
||||||
|
|
||||||
### 🐞 Bug fixes
|
### 🐞 Bug fixes
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="refresh" content="0;url=https://webgoat.org" />
|
<meta http-equiv="refresh" content="0;url=https://owasp.org/www-project-webgoat/" />
|
||||||
<link rel="canonical" href="https://webgoat.org" />
|
<link rel="canonical" href="https://owasp.org/www-project-webgoat/" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>
|
<h1>
|
||||||
The page been moved to <a href="https://webgoat.org">https://webgoat.org</a>
|
The page been moved to <a href="https://owasp.org/www-project-webgoat/">https://owasp.org/www-project-webgoat/</a>
|
||||||
</h1>
|
</h1>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,751 +0,0 @@
|
|||||||
Sat May 10 12:27:40 UTC 2025: Commit 1 by Author One
|
|
||||||
Sat May 10 12:28:00 UTC 2025: Commit 2 by Author Two
|
|
||||||
Sat May 10 16:00:41 UTC 2025: Commit 1 by Author One
|
|
||||||
Sat May 10 16:02:46 UTC 2025: Commit 2 by Author Two
|
|
||||||
Sat May 10 16:04:50 UTC 2025: Commit 3 by Author Three
|
|
||||||
Sat May 10 16:06:55 UTC 2025: Commit 4 by Author Four
|
|
||||||
Sat May 10 16:08:59 UTC 2025: Commit 5 by Author Five
|
|
||||||
Sat May 10 16:11:03 UTC 2025: Commit 6 by Author Six
|
|
||||||
Sat May 10 16:13:08 UTC 2025: Commit 7 by Author Seven
|
|
||||||
Sat May 10 16:15:12 UTC 2025: Commit 8 by Author Eight
|
|
||||||
Sat May 10 16:17:17 UTC 2025: Commit 9 by Author Nine
|
|
||||||
Sat May 10 16:19:21 UTC 2025: Commit 10 by Author Ten
|
|
||||||
Sat May 10 16:21:26 UTC 2025: Commit 11 by DWSAuthor One
|
|
||||||
Sat May 10 16:23:30 UTC 2025: Commit 12 by DWSAuthor Two
|
|
||||||
Sat May 10 16:45:47 UTC 2025: Commit 1 by Author One
|
|
||||||
Sat May 10 16:48:41 UTC 2025: Commit 1 by Author One
|
|
||||||
Sat May 10 16:51:41 UTC 2025: Commit 1 by Author One
|
|
||||||
Sat May 10 16:54:41 UTC 2025: Commit 1 by Author One
|
|
||||||
Sat May 10 18:00:41 UTC 2025: Commit 1 by Author
|
|
||||||
Sat May 10 18:03:27 UTC 2025: Commit 2 by Seven
|
|
||||||
Sat May 10 18:06:14 UTC 2025: Commit 3 by <author7@example.com>
|
|
||||||
Sat May 10 18:09:01 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Sat May 10 18:11:47 UTC 2025: Commit 5 by Four
|
|
||||||
Sat May 10 18:14:34 UTC 2025: Commit 6 by <autdwshor4@example.com>
|
|
||||||
Sat May 10 18:17:21 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sat May 10 18:20:07 UTC 2025: Commit 8 by Seven
|
|
||||||
Sat May 10 18:22:54 UTC 2025: Commit 9 by <adwsuthor7@example.com>
|
|
||||||
Sat May 10 18:25:41 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Sat May 10 18:28:27 UTC 2025: Commit 11 by Six
|
|
||||||
Sat May 10 18:31:14 UTC 2025: Commit 12 by <autdwshor6@example.com>
|
|
||||||
Sat May 10 21:00:41 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sat May 10 21:03:28 UTC 2025: Commit 2 by Seven
|
|
||||||
Sat May 10 21:06:15 UTC 2025: Commit 3 by <adwsuthor7@example.com>
|
|
||||||
Sat May 10 21:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Sat May 10 21:11:48 UTC 2025: Commit 5 by One
|
|
||||||
Sat May 10 21:14:35 UTC 2025: Commit 6 by <author1@example.com>
|
|
||||||
Sat May 10 21:17:22 UTC 2025: Commit 7 by Author
|
|
||||||
Sat May 10 21:20:08 UTC 2025: Commit 8 by Three
|
|
||||||
Sat May 10 21:22:55 UTC 2025: Commit 9 by <author3@example.com>
|
|
||||||
Sat May 10 21:25:42 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Sat May 10 21:28:28 UTC 2025: Commit 11 by Eight
|
|
||||||
Sat May 10 21:31:15 UTC 2025: Commit 12 by <adwsuthor8@example.com>
|
|
||||||
Sun May 11 00:00:41 UTC 2025: Commit 1 by Author
|
|
||||||
Sun May 11 00:03:27 UTC 2025: Commit 2 by Eight
|
|
||||||
Sun May 11 00:06:14 UTC 2025: Commit 3 by <author8@example.com>
|
|
||||||
Sun May 11 00:09:01 UTC 2025: Commit 4 by Author
|
|
||||||
Sun May 11 00:11:47 UTC 2025: Commit 5 by Four
|
|
||||||
Sun May 11 00:14:34 UTC 2025: Commit 6 by <author4@example.com>
|
|
||||||
Sun May 11 00:17:21 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sun May 11 00:20:07 UTC 2025: Commit 8 by Eight
|
|
||||||
Sun May 11 00:22:54 UTC 2025: Commit 9 by <adwsuthor8@example.com>
|
|
||||||
Sun May 11 00:25:40 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Sun May 11 00:28:27 UTC 2025: Commit 11 by Ten
|
|
||||||
Sun May 11 00:31:14 UTC 2025: Commit 12 by <autdwshor10@example.com>
|
|
||||||
Sun May 11 03:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 11 03:03:29 UTC 2025: Commit 2 by Eight
|
|
||||||
Sun May 11 03:06:16 UTC 2025: Commit 3 by <adwsuthor8@example.com>
|
|
||||||
Sun May 11 03:09:02 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Sun May 11 03:11:49 UTC 2025: Commit 5 by One
|
|
||||||
Sun May 11 03:14:36 UTC 2025: Commit 6 by <dwsauthor1@example.com>
|
|
||||||
Sun May 11 03:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sun May 11 03:20:09 UTC 2025: Commit 8 by Six
|
|
||||||
Sun May 11 03:22:55 UTC 2025: Commit 9 by <autdwshor6@example.com>
|
|
||||||
Sun May 11 03:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Sun May 11 03:28:29 UTC 2025: Commit 11 by Six
|
|
||||||
Sun May 11 03:31:15 UTC 2025: Commit 12 by <author6@example.com>
|
|
||||||
Sun May 11 06:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 11 06:03:29 UTC 2025: Commit 2 by One
|
|
||||||
Sun May 11 06:06:16 UTC 2025: Commit 3 by <dwsauthor1@example.com>
|
|
||||||
Sun May 11 06:09:02 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Sun May 11 06:11:49 UTC 2025: Commit 5 by Ten
|
|
||||||
Sun May 11 06:14:36 UTC 2025: Commit 6 by <autdwshor10@example.com>
|
|
||||||
Sun May 11 06:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sun May 11 06:20:09 UTC 2025: Commit 8 by Five
|
|
||||||
Sun May 11 06:22:56 UTC 2025: Commit 9 by <autdwshor5@example.com>
|
|
||||||
Sun May 11 06:25:42 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Sun May 11 06:28:29 UTC 2025: Commit 11 by Six
|
|
||||||
Sun May 11 06:31:16 UTC 2025: Commit 12 by <autdwshor6@example.com>
|
|
||||||
Sun May 11 09:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 11 09:03:28 UTC 2025: Commit 2 by Eight
|
|
||||||
Sun May 11 09:06:15 UTC 2025: Commit 3 by <adwsuthor8@example.com>
|
|
||||||
Sun May 11 09:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Sun May 11 09:11:49 UTC 2025: Commit 5 by One
|
|
||||||
Sun May 11 09:14:35 UTC 2025: Commit 6 by <author1@example.com>
|
|
||||||
Sun May 11 09:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sun May 11 09:20:08 UTC 2025: Commit 8 by Four
|
|
||||||
Sun May 11 09:22:55 UTC 2025: Commit 9 by <autdwshor4@example.com>
|
|
||||||
Sun May 11 09:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Sun May 11 09:28:28 UTC 2025: Commit 11 by Seven
|
|
||||||
Sun May 11 09:31:15 UTC 2025: Commit 12 by <author7@example.com>
|
|
||||||
Sun May 11 12:00:41 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 11 12:03:28 UTC 2025: Commit 2 by Four
|
|
||||||
Sun May 11 12:06:15 UTC 2025: Commit 3 by <autdwshor4@example.com>
|
|
||||||
Sun May 11 12:09:01 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Sun May 11 12:11:48 UTC 2025: Commit 5 by Three
|
|
||||||
Sun May 11 12:14:35 UTC 2025: Commit 6 by <dwsauthor3@example.com>
|
|
||||||
Sun May 11 12:17:21 UTC 2025: Commit 7 by Author
|
|
||||||
Sun May 11 12:20:08 UTC 2025: Commit 8 by Seven
|
|
||||||
Sun May 11 12:22:54 UTC 2025: Commit 9 by <author7@example.com>
|
|
||||||
Sun May 11 12:25:41 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Sun May 11 12:28:28 UTC 2025: Commit 11 by One
|
|
||||||
Sun May 11 12:31:14 UTC 2025: Commit 12 by <dwsauthor1@example.com>
|
|
||||||
Sun May 11 15:00:41 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 11 15:03:28 UTC 2025: Commit 2 by Four
|
|
||||||
Sun May 11 15:06:15 UTC 2025: Commit 3 by <autdwshor4@example.com>
|
|
||||||
Sun May 11 15:09:01 UTC 2025: Commit 4 by Author
|
|
||||||
Sun May 11 15:11:48 UTC 2025: Commit 5 by Nine
|
|
||||||
Sun May 11 15:14:35 UTC 2025: Commit 6 by <author9@example.com>
|
|
||||||
Sun May 11 15:17:21 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sun May 11 15:20:08 UTC 2025: Commit 8 by Nine
|
|
||||||
Sun May 11 15:22:55 UTC 2025: Commit 9 by <autdwshor9@example.com>
|
|
||||||
Sun May 11 15:25:41 UTC 2025: Commit 10 by Author
|
|
||||||
Sun May 11 15:28:28 UTC 2025: Commit 11 by One
|
|
||||||
Sun May 11 15:31:15 UTC 2025: Commit 12 by <author1@example.com>
|
|
||||||
Sun May 11 18:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 11 18:03:28 UTC 2025: Commit 2 by Four
|
|
||||||
Sun May 11 18:06:15 UTC 2025: Commit 3 by <autdwshor4@example.com>
|
|
||||||
Sun May 11 18:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Sun May 11 18:11:48 UTC 2025: Commit 5 by Five
|
|
||||||
Sun May 11 18:14:35 UTC 2025: Commit 6 by <author5@example.com>
|
|
||||||
Sun May 11 18:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sun May 11 18:20:08 UTC 2025: Commit 8 by Nine
|
|
||||||
Sun May 11 18:22:55 UTC 2025: Commit 9 by <autdwshor9@example.com>
|
|
||||||
Sun May 11 18:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Sun May 11 18:28:28 UTC 2025: Commit 11 by Three
|
|
||||||
Sun May 11 18:31:15 UTC 2025: Commit 12 by <author3@example.com>
|
|
||||||
Sun May 11 21:00:41 UTC 2025: Commit 1 by Author
|
|
||||||
Sun May 11 21:03:28 UTC 2025: Commit 2 by Eight
|
|
||||||
Sun May 11 21:06:14 UTC 2025: Commit 3 by <author8@example.com>
|
|
||||||
Sun May 11 21:09:01 UTC 2025: Commit 4 by Author
|
|
||||||
Sun May 11 21:11:48 UTC 2025: Commit 5 by Two
|
|
||||||
Sun May 11 21:14:34 UTC 2025: Commit 6 by <author2@example.com>
|
|
||||||
Sun May 11 21:17:21 UTC 2025: Commit 7 by Author
|
|
||||||
Sun May 11 21:20:08 UTC 2025: Commit 8 by Five
|
|
||||||
Sun May 11 21:22:54 UTC 2025: Commit 9 by <author5@example.com>
|
|
||||||
Sun May 11 21:25:41 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Sun May 11 21:28:28 UTC 2025: Commit 11 by Seven
|
|
||||||
Sun May 11 21:31:14 UTC 2025: Commit 12 by <adwsuthor7@example.com>
|
|
||||||
Mon May 12 00:00:42 UTC 2025: Commit 1 by Author
|
|
||||||
Mon May 12 00:03:29 UTC 2025: Commit 2 by Seven
|
|
||||||
Mon May 12 00:06:16 UTC 2025: Commit 3 by <author7@example.com>
|
|
||||||
Mon May 12 00:09:03 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Mon May 12 00:11:49 UTC 2025: Commit 5 by Eight
|
|
||||||
Mon May 12 00:14:36 UTC 2025: Commit 6 by <adwsuthor8@example.com>
|
|
||||||
Mon May 12 00:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Mon May 12 00:20:09 UTC 2025: Commit 8 by Ten
|
|
||||||
Mon May 12 00:22:56 UTC 2025: Commit 9 by <autdwshor10@example.com>
|
|
||||||
Mon May 12 00:25:42 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Mon May 12 00:28:29 UTC 2025: Commit 11 by Seven
|
|
||||||
Mon May 12 00:31:16 UTC 2025: Commit 12 by <adwsuthor7@example.com>
|
|
||||||
Mon May 12 03:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Mon May 12 03:03:28 UTC 2025: Commit 2 by Nine
|
|
||||||
Mon May 12 03:06:15 UTC 2025: Commit 3 by <autdwshor9@example.com>
|
|
||||||
Mon May 12 03:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Mon May 12 03:11:49 UTC 2025: Commit 5 by Nine
|
|
||||||
Mon May 12 03:14:35 UTC 2025: Commit 6 by <author9@example.com>
|
|
||||||
Mon May 12 03:17:22 UTC 2025: Commit 7 by Author
|
|
||||||
Mon May 12 03:20:09 UTC 2025: Commit 8 by Two
|
|
||||||
Mon May 12 03:22:55 UTC 2025: Commit 9 by <author2@example.com>
|
|
||||||
Mon May 12 03:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Mon May 12 03:28:29 UTC 2025: Commit 11 by One
|
|
||||||
Mon May 12 03:31:15 UTC 2025: Commit 12 by <author1@example.com>
|
|
||||||
Mon May 12 06:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Mon May 12 06:03:28 UTC 2025: Commit 2 by Two
|
|
||||||
Mon May 12 06:06:15 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Mon May 12 06:09:02 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Mon May 12 06:11:48 UTC 2025: Commit 5 by Ten
|
|
||||||
Mon May 12 06:14:35 UTC 2025: Commit 6 by <autdwshor10@example.com>
|
|
||||||
Mon May 12 06:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Mon May 12 06:20:08 UTC 2025: Commit 8 by Five
|
|
||||||
Mon May 12 06:22:55 UTC 2025: Commit 9 by <autdwshor5@example.com>
|
|
||||||
Mon May 12 06:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Mon May 12 06:28:28 UTC 2025: Commit 11 by One
|
|
||||||
Mon May 12 06:31:15 UTC 2025: Commit 12 by <author1@example.com>
|
|
||||||
Mon May 12 09:00:41 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Mon May 12 09:03:28 UTC 2025: Commit 2 by Two
|
|
||||||
Mon May 12 09:06:15 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Mon May 12 09:09:01 UTC 2025: Commit 4 by Author
|
|
||||||
Mon May 12 09:11:48 UTC 2025: Commit 5 by Three
|
|
||||||
Mon May 12 09:14:35 UTC 2025: Commit 6 by <author3@example.com>
|
|
||||||
Mon May 12 09:17:21 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Mon May 12 09:20:08 UTC 2025: Commit 8 by Six
|
|
||||||
Mon May 12 09:22:55 UTC 2025: Commit 9 by <autdwshor6@example.com>
|
|
||||||
Mon May 12 09:25:41 UTC 2025: Commit 10 by Author
|
|
||||||
Mon May 12 09:28:28 UTC 2025: Commit 11 by One
|
|
||||||
Mon May 12 09:31:14 UTC 2025: Commit 12 by <author1@example.com>
|
|
||||||
Mon May 12 12:00:43 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Mon May 12 12:03:30 UTC 2025: Commit 2 by Eight
|
|
||||||
Mon May 12 12:06:17 UTC 2025: Commit 3 by <adwsuthor8@example.com>
|
|
||||||
Mon May 12 12:09:04 UTC 2025: Commit 4 by Author
|
|
||||||
Mon May 12 12:11:50 UTC 2025: Commit 5 by Five
|
|
||||||
Mon May 12 12:14:37 UTC 2025: Commit 6 by <author5@example.com>
|
|
||||||
Mon May 12 12:17:23 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Mon May 12 12:20:10 UTC 2025: Commit 8 by Ten
|
|
||||||
Mon May 12 12:22:57 UTC 2025: Commit 9 by <autdwshor10@example.com>
|
|
||||||
Mon May 12 12:25:43 UTC 2025: Commit 10 by Author
|
|
||||||
Mon May 12 12:28:30 UTC 2025: Commit 11 by Nine
|
|
||||||
Mon May 12 12:31:17 UTC 2025: Commit 12 by <author9@example.com>
|
|
||||||
Mon May 12 15:00:41 UTC 2025: Commit 1 by Author
|
|
||||||
Mon May 12 15:03:28 UTC 2025: Commit 2 by Two
|
|
||||||
Mon May 12 15:06:15 UTC 2025: Commit 3 by <author2@example.com>
|
|
||||||
Mon May 12 15:09:01 UTC 2025: Commit 4 by Author
|
|
||||||
Mon May 12 15:11:48 UTC 2025: Commit 5 by Eight
|
|
||||||
Mon May 12 15:14:35 UTC 2025: Commit 6 by <author8@example.com>
|
|
||||||
Mon May 12 15:17:21 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Mon May 12 15:20:08 UTC 2025: Commit 8 by Eight
|
|
||||||
Mon May 12 15:22:55 UTC 2025: Commit 9 by <adwsuthor8@example.com>
|
|
||||||
Mon May 12 15:25:41 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Mon May 12 15:28:28 UTC 2025: Commit 11 by Five
|
|
||||||
Mon May 12 15:31:15 UTC 2025: Commit 12 by <autdwshor5@example.com>
|
|
||||||
Mon May 12 18:00:41 UTC 2025: Commit 1 by Author
|
|
||||||
Mon May 12 18:03:28 UTC 2025: Commit 2 by Eight
|
|
||||||
Mon May 12 18:06:15 UTC 2025: Commit 3 by <author8@example.com>
|
|
||||||
Mon May 12 18:09:01 UTC 2025: Commit 4 by Author
|
|
||||||
Mon May 12 18:11:48 UTC 2025: Commit 5 by Nine
|
|
||||||
Mon May 12 18:14:35 UTC 2025: Commit 6 by <author9@example.com>
|
|
||||||
Mon May 12 18:17:21 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Mon May 12 18:20:08 UTC 2025: Commit 8 by Six
|
|
||||||
Mon May 12 18:22:55 UTC 2025: Commit 9 by <autdwshor6@example.com>
|
|
||||||
Mon May 12 18:25:41 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Mon May 12 18:28:28 UTC 2025: Commit 11 by Eight
|
|
||||||
Mon May 12 18:31:14 UTC 2025: Commit 12 by <adwsuthor8@example.com>
|
|
||||||
Mon May 12 21:00:43 UTC 2025: Commit 1 by Author
|
|
||||||
Mon May 12 21:03:30 UTC 2025: Commit 2 by Ten
|
|
||||||
Mon May 12 21:06:16 UTC 2025: Commit 3 by <author10@example.com>
|
|
||||||
Mon May 12 21:09:03 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Mon May 12 21:11:50 UTC 2025: Commit 5 by Nine
|
|
||||||
Mon May 12 21:14:36 UTC 2025: Commit 6 by <autdwshor9@example.com>
|
|
||||||
Mon May 12 21:17:23 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Mon May 12 21:20:09 UTC 2025: Commit 8 by One
|
|
||||||
Mon May 12 21:22:56 UTC 2025: Commit 9 by <dwsauthor1@example.com>
|
|
||||||
Mon May 12 21:25:43 UTC 2025: Commit 10 by Author
|
|
||||||
Mon May 12 21:28:29 UTC 2025: Commit 11 by Seven
|
|
||||||
Mon May 12 21:31:16 UTC 2025: Commit 12 by <author7@example.com>
|
|
||||||
Tue May 13 00:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 13 00:03:29 UTC 2025: Commit 2 by Six
|
|
||||||
Tue May 13 00:06:15 UTC 2025: Commit 3 by <autdwshor6@example.com>
|
|
||||||
Tue May 13 00:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Tue May 13 00:11:48 UTC 2025: Commit 5 by Five
|
|
||||||
Tue May 13 00:14:35 UTC 2025: Commit 6 by <author5@example.com>
|
|
||||||
Tue May 13 00:17:22 UTC 2025: Commit 7 by Author
|
|
||||||
Tue May 13 00:20:08 UTC 2025: Commit 8 by Ten
|
|
||||||
Tue May 13 00:22:55 UTC 2025: Commit 9 by <author10@example.com>
|
|
||||||
Tue May 13 00:25:42 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Tue May 13 00:28:28 UTC 2025: Commit 11 by One
|
|
||||||
Tue May 13 00:31:15 UTC 2025: Commit 12 by <dwsauthor1@example.com>
|
|
||||||
Tue May 13 03:00:43 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 13 03:03:30 UTC 2025: Commit 2 by Seven
|
|
||||||
Tue May 13 03:06:17 UTC 2025: Commit 3 by <adwsuthor7@example.com>
|
|
||||||
Tue May 13 03:09:03 UTC 2025: Commit 4 by Author
|
|
||||||
Tue May 13 03:11:50 UTC 2025: Commit 5 by Two
|
|
||||||
Tue May 13 03:14:37 UTC 2025: Commit 6 by <author2@example.com>
|
|
||||||
Tue May 13 03:17:23 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Tue May 13 03:20:10 UTC 2025: Commit 8 by Ten
|
|
||||||
Tue May 13 03:22:57 UTC 2025: Commit 9 by <autdwshor10@example.com>
|
|
||||||
Tue May 13 03:25:44 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Tue May 13 03:28:30 UTC 2025: Commit 11 by Five
|
|
||||||
Tue May 13 03:31:17 UTC 2025: Commit 12 by <autdwshor5@example.com>
|
|
||||||
Tue May 13 06:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 13 06:03:29 UTC 2025: Commit 2 by Two
|
|
||||||
Tue May 13 06:06:16 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Tue May 13 06:09:02 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Tue May 13 06:11:49 UTC 2025: Commit 5 by Four
|
|
||||||
Tue May 13 06:14:36 UTC 2025: Commit 6 by <autdwshor4@example.com>
|
|
||||||
Tue May 13 06:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Tue May 13 06:20:09 UTC 2025: Commit 8 by Five
|
|
||||||
Tue May 13 06:22:56 UTC 2025: Commit 9 by <autdwshor5@example.com>
|
|
||||||
Tue May 13 06:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Tue May 13 06:28:29 UTC 2025: Commit 11 by Five
|
|
||||||
Tue May 13 06:31:16 UTC 2025: Commit 12 by <author5@example.com>
|
|
||||||
Tue May 13 09:00:45 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 13 09:03:32 UTC 2025: Commit 2 by Three
|
|
||||||
Tue May 13 09:06:19 UTC 2025: Commit 3 by <dwsauthor3@example.com>
|
|
||||||
Tue May 13 09:09:06 UTC 2025: Commit 4 by Author
|
|
||||||
Tue May 13 09:11:52 UTC 2025: Commit 5 by Three
|
|
||||||
Tue May 13 09:14:39 UTC 2025: Commit 6 by <author3@example.com>
|
|
||||||
Tue May 13 09:17:26 UTC 2025: Commit 7 by Author
|
|
||||||
Tue May 13 09:20:12 UTC 2025: Commit 8 by Five
|
|
||||||
Tue May 13 09:22:59 UTC 2025: Commit 9 by <author5@example.com>
|
|
||||||
Tue May 13 09:25:45 UTC 2025: Commit 10 by Author
|
|
||||||
Tue May 13 09:28:32 UTC 2025: Commit 11 by Eight
|
|
||||||
Tue May 13 09:31:19 UTC 2025: Commit 12 by <author8@example.com>
|
|
||||||
Tue May 13 12:00:41 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 13 12:03:28 UTC 2025: Commit 2 by Two
|
|
||||||
Tue May 13 12:06:15 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Tue May 13 12:09:01 UTC 2025: Commit 4 by Author
|
|
||||||
Tue May 13 12:11:48 UTC 2025: Commit 5 by Three
|
|
||||||
Tue May 13 12:14:35 UTC 2025: Commit 6 by <author3@example.com>
|
|
||||||
Tue May 13 12:17:21 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Tue May 13 12:20:08 UTC 2025: Commit 8 by Seven
|
|
||||||
Tue May 13 12:22:55 UTC 2025: Commit 9 by <adwsuthor7@example.com>
|
|
||||||
Tue May 13 12:25:41 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Tue May 13 12:28:28 UTC 2025: Commit 11 by One
|
|
||||||
Tue May 13 12:31:14 UTC 2025: Commit 12 by <dwsauthor1@example.com>
|
|
||||||
Tue May 13 15:00:43 UTC 2025: Commit 1 by Author
|
|
||||||
Tue May 13 15:03:30 UTC 2025: Commit 2 by Three
|
|
||||||
Tue May 13 15:06:16 UTC 2025: Commit 3 by <author3@example.com>
|
|
||||||
Tue May 13 15:09:03 UTC 2025: Commit 4 by Author
|
|
||||||
Tue May 13 15:11:50 UTC 2025: Commit 5 by Five
|
|
||||||
Tue May 13 15:14:36 UTC 2025: Commit 6 by <author5@example.com>
|
|
||||||
Tue May 13 15:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Tue May 13 15:20:09 UTC 2025: Commit 8 by Seven
|
|
||||||
Tue May 13 15:22:56 UTC 2025: Commit 9 by <author7@example.com>
|
|
||||||
Tue May 13 15:25:43 UTC 2025: Commit 10 by Author
|
|
||||||
Tue May 13 15:28:29 UTC 2025: Commit 11 by Six
|
|
||||||
Tue May 13 15:31:16 UTC 2025: Commit 12 by <author6@example.com>
|
|
||||||
Tue May 13 18:00:42 UTC 2025: Commit 1 by Author
|
|
||||||
Tue May 13 18:03:29 UTC 2025: Commit 2 by Six
|
|
||||||
Tue May 13 18:06:16 UTC 2025: Commit 3 by <author6@example.com>
|
|
||||||
Tue May 13 18:09:02 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Tue May 13 18:11:49 UTC 2025: Commit 5 by Two
|
|
||||||
Tue May 13 18:14:36 UTC 2025: Commit 6 by <dwsauthor2@example.com>
|
|
||||||
Tue May 13 18:17:22 UTC 2025: Commit 7 by Author
|
|
||||||
Tue May 13 18:20:09 UTC 2025: Commit 8 by Four
|
|
||||||
Tue May 13 18:22:56 UTC 2025: Commit 9 by <author4@example.com>
|
|
||||||
Tue May 13 18:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Tue May 13 18:28:29 UTC 2025: Commit 11 by Ten
|
|
||||||
Tue May 13 18:31:16 UTC 2025: Commit 12 by <author10@example.com>
|
|
||||||
Tue May 13 21:00:42 UTC 2025: Commit 1 by Author
|
|
||||||
Tue May 13 21:03:29 UTC 2025: Commit 2 by Eight
|
|
||||||
Tue May 13 21:06:15 UTC 2025: Commit 3 by <author8@example.com>
|
|
||||||
Tue May 13 21:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Tue May 13 21:11:49 UTC 2025: Commit 5 by Seven
|
|
||||||
Tue May 13 21:14:35 UTC 2025: Commit 6 by <author7@example.com>
|
|
||||||
Tue May 13 21:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Tue May 13 21:20:09 UTC 2025: Commit 8 by Three
|
|
||||||
Tue May 13 21:22:55 UTC 2025: Commit 9 by <dwsauthor3@example.com>
|
|
||||||
Tue May 13 21:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Tue May 13 21:28:29 UTC 2025: Commit 11 by Six
|
|
||||||
Tue May 13 21:31:15 UTC 2025: Commit 12 by <author6@example.com>
|
|
||||||
Wed May 14 00:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 14 00:03:29 UTC 2025: Commit 2 by Eight
|
|
||||||
Wed May 14 00:06:15 UTC 2025: Commit 3 by <adwsuthor8@example.com>
|
|
||||||
Wed May 14 00:09:02 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Wed May 14 00:11:49 UTC 2025: Commit 5 by Six
|
|
||||||
Wed May 14 00:14:35 UTC 2025: Commit 6 by <autdwshor6@example.com>
|
|
||||||
Wed May 14 00:17:22 UTC 2025: Commit 7 by Author
|
|
||||||
Wed May 14 00:20:09 UTC 2025: Commit 8 by Two
|
|
||||||
Wed May 14 00:22:55 UTC 2025: Commit 9 by <author2@example.com>
|
|
||||||
Wed May 14 00:25:42 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Wed May 14 00:28:29 UTC 2025: Commit 11 by Ten
|
|
||||||
Wed May 14 00:31:15 UTC 2025: Commit 12 by <autdwshor10@example.com>
|
|
||||||
Wed May 14 03:00:43 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 14 03:03:30 UTC 2025: Commit 2 by Nine
|
|
||||||
Wed May 14 03:06:17 UTC 2025: Commit 3 by <autdwshor9@example.com>
|
|
||||||
Wed May 14 03:09:03 UTC 2025: Commit 4 by Author
|
|
||||||
Wed May 14 03:11:50 UTC 2025: Commit 5 by One
|
|
||||||
Wed May 14 03:14:37 UTC 2025: Commit 6 by <author1@example.com>
|
|
||||||
Wed May 14 03:17:23 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Wed May 14 03:20:10 UTC 2025: Commit 8 by Four
|
|
||||||
Wed May 14 03:22:56 UTC 2025: Commit 9 by <autdwshor4@example.com>
|
|
||||||
Wed May 14 03:25:43 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Wed May 14 03:28:30 UTC 2025: Commit 11 by Six
|
|
||||||
Wed May 14 03:31:16 UTC 2025: Commit 12 by <autdwshor6@example.com>
|
|
||||||
Wed May 14 06:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 14 06:03:29 UTC 2025: Commit 2 by Six
|
|
||||||
Wed May 14 06:06:16 UTC 2025: Commit 3 by <autdwshor6@example.com>
|
|
||||||
Wed May 14 06:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Wed May 14 06:11:49 UTC 2025: Commit 5 by Three
|
|
||||||
Wed May 14 06:14:36 UTC 2025: Commit 6 by <author3@example.com>
|
|
||||||
Wed May 14 06:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Wed May 14 06:20:09 UTC 2025: Commit 8 by Eight
|
|
||||||
Wed May 14 06:22:56 UTC 2025: Commit 9 by <adwsuthor8@example.com>
|
|
||||||
Wed May 14 06:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Wed May 14 06:28:29 UTC 2025: Commit 11 by One
|
|
||||||
Wed May 14 06:31:16 UTC 2025: Commit 12 by <author1@example.com>
|
|
||||||
Wed May 14 09:00:43 UTC 2025: Commit 1 by Author
|
|
||||||
Wed May 14 09:03:30 UTC 2025: Commit 2 by Two
|
|
||||||
Wed May 14 09:06:16 UTC 2025: Commit 3 by <author2@example.com>
|
|
||||||
Wed May 14 09:09:03 UTC 2025: Commit 4 by Author
|
|
||||||
Wed May 14 09:11:50 UTC 2025: Commit 5 by Four
|
|
||||||
Wed May 14 09:14:36 UTC 2025: Commit 6 by <author4@example.com>
|
|
||||||
Wed May 14 09:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Wed May 14 09:20:09 UTC 2025: Commit 8 by Seven
|
|
||||||
Wed May 14 09:22:56 UTC 2025: Commit 9 by <author7@example.com>
|
|
||||||
Wed May 14 09:25:43 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Wed May 14 09:28:29 UTC 2025: Commit 11 by Five
|
|
||||||
Wed May 14 09:31:16 UTC 2025: Commit 12 by <autdwshor5@example.com>
|
|
||||||
Wed May 14 12:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 14 12:03:29 UTC 2025: Commit 2 by Three
|
|
||||||
Wed May 14 12:06:16 UTC 2025: Commit 3 by <dwsauthor3@example.com>
|
|
||||||
Wed May 14 12:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Wed May 14 12:11:49 UTC 2025: Commit 5 by Two
|
|
||||||
Wed May 14 12:14:36 UTC 2025: Commit 6 by <author2@example.com>
|
|
||||||
Wed May 14 12:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Wed May 14 12:20:09 UTC 2025: Commit 8 by Five
|
|
||||||
Wed May 14 12:22:56 UTC 2025: Commit 9 by <autdwshor5@example.com>
|
|
||||||
Wed May 14 12:25:42 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Wed May 14 12:28:29 UTC 2025: Commit 11 by Seven
|
|
||||||
Wed May 14 12:31:16 UTC 2025: Commit 12 by <adwsuthor7@example.com>
|
|
||||||
Wed May 14 15:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 14 15:03:29 UTC 2025: Commit 2 by Ten
|
|
||||||
Wed May 14 15:06:15 UTC 2025: Commit 3 by <autdwshor10@example.com>
|
|
||||||
Wed May 14 15:09:02 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Wed May 14 15:11:49 UTC 2025: Commit 5 by Five
|
|
||||||
Wed May 14 15:14:35 UTC 2025: Commit 6 by <autdwshor5@example.com>
|
|
||||||
Wed May 14 15:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Wed May 14 15:20:09 UTC 2025: Commit 8 by One
|
|
||||||
Wed May 14 15:22:55 UTC 2025: Commit 9 by <dwsauthor1@example.com>
|
|
||||||
Wed May 14 15:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Wed May 14 15:28:29 UTC 2025: Commit 11 by One
|
|
||||||
Wed May 14 15:31:15 UTC 2025: Commit 12 by <author1@example.com>
|
|
||||||
Wed May 14 18:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 14 18:03:29 UTC 2025: Commit 2 by Six
|
|
||||||
Wed May 14 18:06:16 UTC 2025: Commit 3 by <autdwshor6@example.com>
|
|
||||||
Wed May 14 18:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Wed May 14 18:11:49 UTC 2025: Commit 5 by Three
|
|
||||||
Wed May 14 18:14:35 UTC 2025: Commit 6 by <author3@example.com>
|
|
||||||
Wed May 14 18:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Wed May 14 18:20:09 UTC 2025: Commit 8 by One
|
|
||||||
Wed May 14 18:22:55 UTC 2025: Commit 9 by <dwsauthor1@example.com>
|
|
||||||
Wed May 14 18:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Wed May 14 18:28:29 UTC 2025: Commit 11 by Seven
|
|
||||||
Wed May 14 18:31:15 UTC 2025: Commit 12 by <author7@example.com>
|
|
||||||
Wed May 14 21:00:43 UTC 2025: Commit 1 by Author
|
|
||||||
Wed May 14 21:03:29 UTC 2025: Commit 2 by Two
|
|
||||||
Wed May 14 21:06:16 UTC 2025: Commit 3 by <author2@example.com>
|
|
||||||
Wed May 14 21:09:03 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Wed May 14 21:11:49 UTC 2025: Commit 5 by Eight
|
|
||||||
Wed May 14 21:14:36 UTC 2025: Commit 6 by <adwsuthor8@example.com>
|
|
||||||
Wed May 14 21:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Wed May 14 21:20:09 UTC 2025: Commit 8 by Five
|
|
||||||
Wed May 14 21:22:56 UTC 2025: Commit 9 by <author5@example.com>
|
|
||||||
Wed May 14 21:25:43 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Wed May 14 21:28:29 UTC 2025: Commit 11 by Four
|
|
||||||
Wed May 14 21:31:16 UTC 2025: Commit 12 by <autdwshor4@example.com>
|
|
||||||
Thu May 15 00:00:43 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu May 15 00:03:29 UTC 2025: Commit 2 by Three
|
|
||||||
Thu May 15 00:06:16 UTC 2025: Commit 3 by <dwsauthor3@example.com>
|
|
||||||
Thu May 15 00:09:03 UTC 2025: Commit 4 by Author
|
|
||||||
Thu May 15 00:11:49 UTC 2025: Commit 5 by Six
|
|
||||||
Thu May 15 00:14:36 UTC 2025: Commit 6 by <author6@example.com>
|
|
||||||
Thu May 15 00:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Thu May 15 00:20:09 UTC 2025: Commit 8 by Eight
|
|
||||||
Thu May 15 00:22:56 UTC 2025: Commit 9 by <author8@example.com>
|
|
||||||
Thu May 15 00:25:43 UTC 2025: Commit 10 by Author
|
|
||||||
Thu May 15 00:28:29 UTC 2025: Commit 11 by Four
|
|
||||||
Thu May 15 00:31:16 UTC 2025: Commit 12 by <author4@example.com>
|
|
||||||
Thu May 15 03:00:42 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu May 15 03:03:29 UTC 2025: Commit 2 by Eight
|
|
||||||
Thu May 15 03:06:16 UTC 2025: Commit 3 by <adwsuthor8@example.com>
|
|
||||||
Thu May 15 03:09:02 UTC 2025: Commit 4 by Author
|
|
||||||
Thu May 15 03:11:49 UTC 2025: Commit 5 by Nine
|
|
||||||
Thu May 15 03:14:36 UTC 2025: Commit 6 by <author9@example.com>
|
|
||||||
Thu May 15 03:17:22 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Thu May 15 03:20:09 UTC 2025: Commit 8 by Ten
|
|
||||||
Thu May 15 03:22:56 UTC 2025: Commit 9 by <autdwshor10@example.com>
|
|
||||||
Thu May 15 03:25:42 UTC 2025: Commit 10 by Author
|
|
||||||
Thu May 15 03:28:29 UTC 2025: Commit 11 by Two
|
|
||||||
Thu May 15 03:31:16 UTC 2025: Commit 12 by <author2@example.com>
|
|
||||||
Thu May 15 06:00:43 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu May 15 06:03:30 UTC 2025: Commit 2 by Five
|
|
||||||
Thu May 15 06:06:17 UTC 2025: Commit 3 by <autdwshor5@example.com>
|
|
||||||
Thu May 15 06:09:04 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Thu May 15 06:11:50 UTC 2025: Commit 5 by Eight
|
|
||||||
Thu May 15 06:14:37 UTC 2025: Commit 6 by <adwsuthor8@example.com>
|
|
||||||
Thu May 15 06:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Thu May 15 06:20:10 UTC 2025: Commit 8 by Two
|
|
||||||
Thu May 15 06:22:57 UTC 2025: Commit 9 by <author2@example.com>
|
|
||||||
Thu May 15 06:25:43 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Thu May 15 06:28:30 UTC 2025: Commit 11 by Ten
|
|
||||||
Thu May 15 06:31:17 UTC 2025: Commit 12 by <autdwshor10@example.com>
|
|
||||||
Thu May 15 09:00:45 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu May 15 09:03:32 UTC 2025: Commit 2 by Five
|
|
||||||
Thu May 15 09:06:19 UTC 2025: Commit 3 by <autdwshor5@example.com>
|
|
||||||
Thu May 15 09:09:06 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Thu May 15 09:11:53 UTC 2025: Commit 5 by Three
|
|
||||||
Thu May 15 09:14:39 UTC 2025: Commit 6 by <dwsauthor3@example.com>
|
|
||||||
Thu May 15 09:17:26 UTC 2025: Commit 7 by Author
|
|
||||||
Thu May 15 09:20:13 UTC 2025: Commit 8 by Five
|
|
||||||
Thu May 15 09:22:59 UTC 2025: Commit 9 by <author5@example.com>
|
|
||||||
Thu May 15 09:25:46 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Thu May 15 09:28:33 UTC 2025: Commit 11 by Ten
|
|
||||||
Thu May 15 09:31:20 UTC 2025: Commit 12 by <autdwshor10@example.com>
|
|
||||||
Thu May 15 12:00:43 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu May 15 12:03:30 UTC 2025: Commit 2 by Ten
|
|
||||||
Thu May 15 12:06:17 UTC 2025: Commit 3 by <autdwshor10@example.com>
|
|
||||||
Thu May 15 12:09:03 UTC 2025: Commit 4 by Author
|
|
||||||
Thu May 15 12:11:50 UTC 2025: Commit 5 by Seven
|
|
||||||
Thu May 15 12:14:37 UTC 2025: Commit 6 by <author7@example.com>
|
|
||||||
Thu May 15 12:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Thu May 15 12:20:10 UTC 2025: Commit 8 by Six
|
|
||||||
Thu May 15 12:22:57 UTC 2025: Commit 9 by <author6@example.com>
|
|
||||||
Thu May 15 12:25:43 UTC 2025: Commit 10 by Author
|
|
||||||
Thu May 15 12:28:30 UTC 2025: Commit 11 by Five
|
|
||||||
Thu May 15 12:31:17 UTC 2025: Commit 12 by <author5@example.com>
|
|
||||||
Thu May 15 15:00:43 UTC 2025: Commit 1 by Author
|
|
||||||
Thu May 15 15:03:30 UTC 2025: Commit 2 by One
|
|
||||||
Thu May 15 15:06:16 UTC 2025: Commit 3 by <author1@example.com>
|
|
||||||
Thu May 15 15:09:03 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Thu May 15 15:11:50 UTC 2025: Commit 5 by Three
|
|
||||||
Thu May 15 15:14:36 UTC 2025: Commit 6 by <dwsauthor3@example.com>
|
|
||||||
Thu May 15 15:17:23 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Thu May 15 15:20:10 UTC 2025: Commit 8 by Four
|
|
||||||
Thu May 15 15:22:56 UTC 2025: Commit 9 by <autdwshor4@example.com>
|
|
||||||
Thu May 15 15:25:43 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Thu May 15 15:28:30 UTC 2025: Commit 11 by Nine
|
|
||||||
Thu May 15 15:31:16 UTC 2025: Commit 12 by <autdwshor9@example.com>
|
|
||||||
Thu May 15 18:00:43 UTC 2025: Commit 1 by Author
|
|
||||||
Thu May 15 18:03:29 UTC 2025: Commit 2 by One
|
|
||||||
Thu May 15 18:06:16 UTC 2025: Commit 3 by <author1@example.com>
|
|
||||||
Thu May 15 18:09:03 UTC 2025: Commit 4 by Author
|
|
||||||
Thu May 15 18:11:49 UTC 2025: Commit 5 by Four
|
|
||||||
Thu May 15 18:14:36 UTC 2025: Commit 6 by <author4@example.com>
|
|
||||||
Thu May 15 18:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Thu May 15 18:20:09 UTC 2025: Commit 8 by Two
|
|
||||||
Thu May 15 18:22:56 UTC 2025: Commit 9 by <author2@example.com>
|
|
||||||
Thu May 15 18:25:43 UTC 2025: Commit 10 by Author
|
|
||||||
Thu May 15 18:28:29 UTC 2025: Commit 11 by Eight
|
|
||||||
Thu May 15 18:31:16 UTC 2025: Commit 12 by <author8@example.com>
|
|
||||||
Thu May 15 21:00:43 UTC 2025: Commit 1 by Author
|
|
||||||
Thu May 15 21:03:29 UTC 2025: Commit 2 by Seven
|
|
||||||
Thu May 15 21:06:16 UTC 2025: Commit 3 by <author7@example.com>
|
|
||||||
Thu May 15 21:09:03 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Thu May 15 21:11:49 UTC 2025: Commit 5 by Two
|
|
||||||
Thu May 15 21:14:36 UTC 2025: Commit 6 by <dwsauthor2@example.com>
|
|
||||||
Thu May 15 21:17:23 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Thu May 15 21:20:09 UTC 2025: Commit 8 by One
|
|
||||||
Thu May 15 21:22:56 UTC 2025: Commit 9 by <dwsauthor1@example.com>
|
|
||||||
Thu May 15 21:25:43 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Thu May 15 21:28:30 UTC 2025: Commit 11 by Three
|
|
||||||
Thu May 15 21:31:16 UTC 2025: Commit 12 by <dwsauthor3@example.com>
|
|
||||||
Fri May 16 00:00:42 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 16 00:03:29 UTC 2025: Commit 2 by One
|
|
||||||
Fri May 16 00:06:16 UTC 2025: Commit 3 by <author1@example.com>
|
|
||||||
Fri May 16 00:09:03 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Fri May 16 00:11:49 UTC 2025: Commit 5 by Three
|
|
||||||
Fri May 16 00:14:36 UTC 2025: Commit 6 by <dwsauthor3@example.com>
|
|
||||||
Fri May 16 00:17:23 UTC 2025: Commit 7 by Author
|
|
||||||
Fri May 16 00:20:09 UTC 2025: Commit 8 by Nine
|
|
||||||
Fri May 16 00:22:56 UTC 2025: Commit 9 by <author9@example.com>
|
|
||||||
Fri May 16 03:00:22 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 16 03:03:08 UTC 2025: Commit 2 by Five
|
|
||||||
Fri May 16 03:05:55 UTC 2025: Commit 3 by <author5@example.com>
|
|
||||||
Fri May 16 03:08:42 UTC 2025: Commit 4 by Author
|
|
||||||
Fri May 16 03:11:29 UTC 2025: Commit 5 by One
|
|
||||||
Fri May 16 03:14:15 UTC 2025: Commit 6 by <author1@example.com>
|
|
||||||
Fri May 16 03:17:02 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Fri May 16 03:19:49 UTC 2025: Commit 8 by Seven
|
|
||||||
Fri May 16 03:22:35 UTC 2025: Commit 9 by <adwsuthor7@example.com>
|
|
||||||
Fri May 16 03:25:22 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Fri May 16 03:28:09 UTC 2025: Commit 11 by Nine
|
|
||||||
Fri May 16 03:30:55 UTC 2025: Commit 12 by <autdwshor9@example.com>
|
|
||||||
Fri May 16 06:00:19 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Fri May 16 06:03:05 UTC 2025: Commit 2 by Two
|
|
||||||
Fri May 16 06:05:52 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Fri May 16 06:08:39 UTC 2025: Commit 4 by Author
|
|
||||||
Fri May 16 06:11:25 UTC 2025: Commit 5 by Nine
|
|
||||||
Fri May 16 06:14:12 UTC 2025: Commit 6 by <author9@example.com>
|
|
||||||
Fri May 16 06:16:59 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Fri May 16 06:19:45 UTC 2025: Commit 8 by Ten
|
|
||||||
Fri May 16 06:22:32 UTC 2025: Commit 9 by <autdwshor10@example.com>
|
|
||||||
Fri May 16 06:25:19 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Fri May 16 06:28:05 UTC 2025: Commit 11 by Five
|
|
||||||
Fri May 16 06:30:52 UTC 2025: Commit 12 by <autdwshor5@example.com>
|
|
||||||
Fri May 16 09:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 16 09:03:05 UTC 2025: Commit 2 by One
|
|
||||||
Fri May 16 09:05:52 UTC 2025: Commit 3 by <author1@example.com>
|
|
||||||
Fri May 16 09:08:39 UTC 2025: Commit 4 by Author
|
|
||||||
Fri May 16 09:11:26 UTC 2025: Commit 5 by Four
|
|
||||||
Fri May 16 09:14:13 UTC 2025: Commit 6 by <author4@example.com>
|
|
||||||
Fri May 16 09:16:59 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Fri May 16 09:19:46 UTC 2025: Commit 8 by Three
|
|
||||||
Fri May 16 09:22:33 UTC 2025: Commit 9 by <dwsauthor3@example.com>
|
|
||||||
Fri May 16 09:25:19 UTC 2025: Commit 10 by Author
|
|
||||||
Fri May 16 09:28:06 UTC 2025: Commit 11 by Nine
|
|
||||||
Fri May 16 09:30:53 UTC 2025: Commit 12 by <author9@example.com>
|
|
||||||
Fri May 16 12:00:26 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 16 12:03:13 UTC 2025: Commit 2 by Five
|
|
||||||
Fri May 16 12:05:59 UTC 2025: Commit 3 by <author5@example.com>
|
|
||||||
Fri May 16 12:08:46 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Fri May 16 12:11:33 UTC 2025: Commit 5 by Six
|
|
||||||
Fri May 16 12:14:19 UTC 2025: Commit 6 by <autdwshor6@example.com>
|
|
||||||
Fri May 16 12:17:06 UTC 2025: Commit 7 by Author
|
|
||||||
Fri May 16 12:19:53 UTC 2025: Commit 8 by Six
|
|
||||||
Fri May 16 12:22:39 UTC 2025: Commit 9 by <author6@example.com>
|
|
||||||
Fri May 16 12:25:26 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Fri May 16 12:28:13 UTC 2025: Commit 11 by Two
|
|
||||||
Fri May 16 12:30:59 UTC 2025: Commit 12 by <dwsauthor2@example.com>
|
|
||||||
Fri May 16 15:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 16 15:03:05 UTC 2025: Commit 2 by Five
|
|
||||||
Fri May 16 15:05:52 UTC 2025: Commit 3 by <author5@example.com>
|
|
||||||
Fri May 16 15:08:38 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Fri May 16 15:11:25 UTC 2025: Commit 5 by One
|
|
||||||
Fri May 16 15:14:12 UTC 2025: Commit 6 by <dwsauthor1@example.com>
|
|
||||||
Fri May 16 15:16:58 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Fri May 16 15:19:45 UTC 2025: Commit 8 by Five
|
|
||||||
Fri May 16 15:22:32 UTC 2025: Commit 9 by <autdwshor5@example.com>
|
|
||||||
Fri May 16 15:25:18 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Fri May 16 15:28:05 UTC 2025: Commit 11 by Two
|
|
||||||
Fri May 16 15:30:52 UTC 2025: Commit 12 by <dwsauthor2@example.com>
|
|
||||||
Fri May 16 18:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Fri May 16 18:03:05 UTC 2025: Commit 2 by Ten
|
|
||||||
Fri May 16 18:05:52 UTC 2025: Commit 3 by <autdwshor10@example.com>
|
|
||||||
Fri May 16 18:08:39 UTC 2025: Commit 4 by Author
|
|
||||||
Fri May 16 18:11:25 UTC 2025: Commit 5 by One
|
|
||||||
Fri May 16 18:14:12 UTC 2025: Commit 6 by <author1@example.com>
|
|
||||||
Fri May 16 18:16:59 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Fri May 16 18:19:45 UTC 2025: Commit 8 by Two
|
|
||||||
Fri May 16 18:22:32 UTC 2025: Commit 9 by <dwsauthor2@example.com>
|
|
||||||
Fri May 16 18:25:19 UTC 2025: Commit 10 by Author
|
|
||||||
Fri May 16 18:28:05 UTC 2025: Commit 11 by Five
|
|
||||||
Fri May 16 18:30:52 UTC 2025: Commit 12 by <author5@example.com>
|
|
||||||
Fri May 16 21:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 16 21:03:05 UTC 2025: Commit 2 by Nine
|
|
||||||
Fri May 16 21:05:52 UTC 2025: Commit 3 by <author9@example.com>
|
|
||||||
Fri May 16 21:08:39 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Fri May 16 21:11:25 UTC 2025: Commit 5 by Nine
|
|
||||||
Fri May 16 21:14:12 UTC 2025: Commit 6 by <autdwshor9@example.com>
|
|
||||||
Fri May 16 21:16:59 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Fri May 16 21:19:45 UTC 2025: Commit 8 by Six
|
|
||||||
Fri May 16 21:22:32 UTC 2025: Commit 9 by <autdwshor6@example.com>
|
|
||||||
Fri May 16 21:25:19 UTC 2025: Commit 10 by DWSAuthor
|
|
||||||
Fri May 16 21:28:05 UTC 2025: Commit 11 by Eight
|
|
||||||
Fri May 16 21:30:52 UTC 2025: Commit 12 by <adwsuthor8@example.com>
|
|
||||||
Sat May 17 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Sat May 17 00:03:04 UTC 2025: Commit 2 by Three
|
|
||||||
Sat May 17 00:05:51 UTC 2025: Commit 3 by <author3@example.com>
|
|
||||||
Sat May 17 00:08:38 UTC 2025: Commit 4 by DWSAuthor
|
|
||||||
Sat May 17 00:11:25 UTC 2025: Commit 5 by Seven
|
|
||||||
Sat May 17 00:14:11 UTC 2025: Commit 6 by <adwsuthor7@example.com>
|
|
||||||
Sat May 17 00:16:58 UTC 2025: Commit 7 by DWSAuthor
|
|
||||||
Sat May 17 12:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sat May 17 12:03:05 UTC 2025: Commit 2 by Seven
|
|
||||||
Sat May 17 12:05:52 UTC 2025: Commit 3 by <adwsuthor7@example.com>
|
|
||||||
Sun May 18 00:00:22 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 18 00:03:09 UTC 2025: Commit 2 by Two
|
|
||||||
Sun May 18 00:05:55 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Sun May 18 12:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sun May 18 12:03:05 UTC 2025: Commit 2 by Two
|
|
||||||
Sun May 18 12:05:52 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Mon May 19 00:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Mon May 19 00:03:06 UTC 2025: Commit 2 by Nine
|
|
||||||
Mon May 19 00:05:53 UTC 2025: Commit 3 by <author9@example.com>
|
|
||||||
Mon May 19 12:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Mon May 19 12:03:04 UTC 2025: Commit 2 by Nine
|
|
||||||
Mon May 19 12:05:51 UTC 2025: Commit 3 by <autdwshor9@example.com>
|
|
||||||
Tue May 20 00:00:19 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 20 00:03:05 UTC 2025: Commit 2 by Seven
|
|
||||||
Tue May 20 00:05:52 UTC 2025: Commit 3 by <adwsuthor7@example.com>
|
|
||||||
Tue May 20 12:00:20 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 20 12:03:07 UTC 2025: Commit 2 by Six
|
|
||||||
Tue May 20 12:05:53 UTC 2025: Commit 3 by <autdwshor6@example.com>
|
|
||||||
Wed May 21 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Wed May 21 00:03:05 UTC 2025: Commit 2 by Three
|
|
||||||
Wed May 21 00:05:52 UTC 2025: Commit 3 by <author3@example.com>
|
|
||||||
Wed May 21 12:00:19 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 21 12:03:05 UTC 2025: Commit 2 by Six
|
|
||||||
Wed May 21 12:05:52 UTC 2025: Commit 3 by <autdwshor6@example.com>
|
|
||||||
Thu May 22 00:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu May 22 00:03:05 UTC 2025: Commit 2 by Five
|
|
||||||
Thu May 22 00:05:52 UTC 2025: Commit 3 by <autdwshor5@example.com>
|
|
||||||
Thu May 22 12:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Thu May 22 12:03:05 UTC 2025: Commit 2 by Ten
|
|
||||||
Thu May 22 12:05:52 UTC 2025: Commit 3 by <author10@example.com>
|
|
||||||
Fri May 23 00:00:21 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 23 00:03:08 UTC 2025: Commit 2 by Five
|
|
||||||
Fri May 23 00:05:54 UTC 2025: Commit 3 by <author5@example.com>
|
|
||||||
Fri May 23 12:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 23 12:03:05 UTC 2025: Commit 2 by Ten
|
|
||||||
Fri May 23 12:05:52 UTC 2025: Commit 3 by <author10@example.com>
|
|
||||||
Sat May 24 00:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Sat May 24 00:03:06 UTC 2025: Commit 2 by Six
|
|
||||||
Sat May 24 00:05:52 UTC 2025: Commit 3 by <author6@example.com>
|
|
||||||
Sat May 24 12:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Sat May 24 12:03:04 UTC 2025: Commit 2 by Two
|
|
||||||
Sat May 24 12:05:51 UTC 2025: Commit 3 by <author2@example.com>
|
|
||||||
Sun May 25 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Sun May 25 00:03:05 UTC 2025: Commit 2 by Four
|
|
||||||
Sun May 25 00:05:52 UTC 2025: Commit 3 by <author4@example.com>
|
|
||||||
Sun May 25 12:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Sun May 25 12:03:05 UTC 2025: Commit 2 by Two
|
|
||||||
Sun May 25 12:05:52 UTC 2025: Commit 3 by <author2@example.com>
|
|
||||||
Mon May 26 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Mon May 26 00:03:05 UTC 2025: Commit 2 by Seven
|
|
||||||
Mon May 26 00:05:52 UTC 2025: Commit 3 by <author7@example.com>
|
|
||||||
Mon May 26 12:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Mon May 26 12:03:05 UTC 2025: Commit 2 by Ten
|
|
||||||
Mon May 26 12:05:52 UTC 2025: Commit 3 by <autdwshor10@example.com>
|
|
||||||
Tue May 27 00:00:19 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue May 27 00:03:05 UTC 2025: Commit 2 by Ten
|
|
||||||
Tue May 27 00:05:52 UTC 2025: Commit 3 by <autdwshor10@example.com>
|
|
||||||
Tue May 27 12:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Tue May 27 12:03:05 UTC 2025: Commit 2 by Ten
|
|
||||||
Tue May 27 12:05:52 UTC 2025: Commit 3 by <author10@example.com>
|
|
||||||
Wed May 28 00:00:29 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 28 00:03:18 UTC 2025: Commit 2 by Two
|
|
||||||
Wed May 28 00:06:07 UTC 2025: Commit 3 by <dwsauthor2@example.com>
|
|
||||||
Wed May 28 12:00:19 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed May 28 12:03:06 UTC 2025: Commit 2 by Five
|
|
||||||
Wed May 28 12:05:52 UTC 2025: Commit 3 by <autdwshor5@example.com>
|
|
||||||
Thu May 29 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Thu May 29 00:03:05 UTC 2025: Commit 2 by Nine
|
|
||||||
Thu May 29 00:05:52 UTC 2025: Commit 3 by <author9@example.com>
|
|
||||||
Thu May 29 12:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Thu May 29 12:03:06 UTC 2025: Commit 2 by Nine
|
|
||||||
Thu May 29 12:05:53 UTC 2025: Commit 3 by <author9@example.com>
|
|
||||||
Fri May 30 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 30 00:03:05 UTC 2025: Commit 2 by One
|
|
||||||
Fri May 30 00:05:52 UTC 2025: Commit 3 by <author1@example.com>
|
|
||||||
Fri May 30 12:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Fri May 30 12:03:06 UTC 2025: Commit 2 by Three
|
|
||||||
Fri May 30 12:06:08 UTC 2025: Commit 3 by <author3@example.com>
|
|
||||||
Sat May 31 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Sat May 31 00:03:04 UTC 2025: Commit 2 by Four
|
|
||||||
Sat May 31 00:05:51 UTC 2025: Commit 3 by <author4@example.com>
|
|
||||||
Sat May 31 12:00:19 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Sat May 31 12:03:05 UTC 2025: Commit 2 by Ten
|
|
||||||
Sat May 31 12:05:52 UTC 2025: Commit 3 by <autdwshor10@example.com>
|
|
||||||
Sun Jun 1 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Sun Jun 1 00:03:05 UTC 2025: Commit 2 by One
|
|
||||||
Sun Jun 1 00:05:52 UTC 2025: Commit 3 by <author1@example.com>
|
|
||||||
Sun Jun 1 12:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Sun Jun 1 12:03:06 UTC 2025: Commit 2 by One
|
|
||||||
Sun Jun 1 12:05:52 UTC 2025: Commit 3 by <author1@example.com>
|
|
||||||
Mon Jun 2 00:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Mon Jun 2 00:03:06 UTC 2025: Commit 2 by Ten
|
|
||||||
Mon Jun 2 00:05:52 UTC 2025: Commit 3 by <author10@example.com>
|
|
||||||
Mon Jun 2 12:00:20 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Mon Jun 2 12:03:07 UTC 2025: Commit 2 by Seven
|
|
||||||
Mon Jun 2 12:05:54 UTC 2025: Commit 3 by <adwsuthor7@example.com>
|
|
||||||
Tue Jun 3 00:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Tue Jun 3 00:03:06 UTC 2025: Commit 2 by Four
|
|
||||||
Tue Jun 3 00:05:52 UTC 2025: Commit 3 by <author4@example.com>
|
|
||||||
Tue Jun 3 12:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Tue Jun 3 12:03:05 UTC 2025: Commit 2 by Five
|
|
||||||
Tue Jun 3 12:05:52 UTC 2025: Commit 3 by <autdwshor5@example.com>
|
|
||||||
Wed Jun 4 00:00:20 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed Jun 4 00:03:06 UTC 2025: Commit 2 by Ten
|
|
||||||
Wed Jun 4 00:05:53 UTC 2025: Commit 3 by <autdwshor10@example.com>
|
|
||||||
Wed Jun 4 12:00:18 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Wed Jun 4 12:03:05 UTC 2025: Commit 2 by Six
|
|
||||||
Wed Jun 4 12:05:52 UTC 2025: Commit 3 by <autdwshor6@example.com>
|
|
||||||
Thu Jun 5 00:00:20 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu Jun 5 00:03:07 UTC 2025: Commit 2 by Six
|
|
||||||
Thu Jun 5 00:05:54 UTC 2025: Commit 3 by <autdwshor6@example.com>
|
|
||||||
Thu Jun 5 12:00:22 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Thu Jun 5 12:03:09 UTC 2025: Commit 2 by Four
|
|
||||||
Thu Jun 5 12:05:55 UTC 2025: Commit 3 by <autdwshor4@example.com>
|
|
||||||
Fri Jun 6 00:00:18 UTC 2025: Commit 1 by Author
|
|
||||||
Fri Jun 6 00:03:05 UTC 2025: Commit 2 by Seven
|
|
||||||
Fri Jun 6 00:05:52 UTC 2025: Commit 3 by <author7@example.com>
|
|
||||||
Fri Jun 6 12:00:19 UTC 2025: Commit 1 by DWSAuthor
|
|
||||||
Fri Jun 6 12:03:06 UTC 2025: Commit 2 by Five
|
|
||||||
Fri Jun 6 12:05:53 UTC 2025: Commit 3 by <autdwshor5@example.com>
|
|
||||||
Sat Jun 7 00:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Sat Jun 7 00:03:06 UTC 2025: Commit 2 by Two
|
|
||||||
Sat Jun 7 00:05:53 UTC 2025: Commit 3 by <author2@example.com>
|
|
||||||
Sat Jun 7 12:00:19 UTC 2025: Commit 1 by Author
|
|
||||||
Sat Jun 7 12:03:06 UTC 2025: Commit 2 by Four
|
|
||||||
Sat Jun 7 12:05:53 UTC 2025: Commit 3 by <author4@example.com>
|
|
33
pom.xml
33
pom.xml
@ -5,12 +5,12 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
<version>3.4.4</version>
|
<version>3.4.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>org.owasp.webgoat</groupId>
|
<groupId>org.owasp.webgoat</groupId>
|
||||||
<artifactId>webgoat</artifactId>
|
<artifactId>webgoat</artifactId>
|
||||||
<version>2025.4-SNAPSHOT</version>
|
<version>2025.2</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>WebGoat</name>
|
<name>WebGoat</name>
|
||||||
@ -63,29 +63,29 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<!-- Shared properties with plugins and version numbers across submodules-->
|
<!-- Shared properties with plugins and version numbers across submodules-->
|
||||||
<asciidoctorj.version>3.0.0</asciidoctorj.version>
|
<asciidoctorj.version>3.0.0</asciidoctorj.version>
|
||||||
<bootstrap.version>5.3.5</bootstrap.version>
|
<bootstrap.version>5.3.3</bootstrap.version>
|
||||||
<cglib.version>3.3.0</cglib.version>
|
<cglib.version>3.3.0</cglib.version>
|
||||||
<!-- do not update necessary for lesson -->
|
<!-- do not update necessary for lesson -->
|
||||||
<checkstyle.version>3.6.0</checkstyle.version>
|
<checkstyle.version>3.6.0</checkstyle.version>
|
||||||
<commons-collections.version>3.2.1</commons-collections.version>
|
<commons-collections.version>3.2.1</commons-collections.version>
|
||||||
<commons-compress.version>1.27.1</commons-compress.version>
|
<commons-compress.version>1.27.1</commons-compress.version>
|
||||||
<commons-io.version>2.19.0</commons-io.version>
|
<commons-io.version>2.18.0</commons-io.version>
|
||||||
<commons-lang3.version>3.14.0</commons-lang3.version>
|
<commons-lang3.version>3.14.0</commons-lang3.version>
|
||||||
<commons-text.version>1.13.1</commons-text.version>
|
<commons-text.version>1.13.0</commons-text.version>
|
||||||
<guava.version>33.4.8-jre</guava.version>
|
<guava.version>33.4.0-jre</guava.version>
|
||||||
<jacoco.version>0.8.11</jacoco.version>
|
<jacoco.version>0.8.11</jacoco.version>
|
||||||
<java.version>23</java.version>
|
<java.version>23</java.version>
|
||||||
<jaxb.version>2.3.1</jaxb.version>
|
<jaxb.version>2.3.1</jaxb.version>
|
||||||
<jjwt.version>0.9.1</jjwt.version>
|
<jjwt.version>0.9.1</jjwt.version>
|
||||||
<jose4j.version>0.9.3</jose4j.version>
|
<jose4j.version>0.9.3</jose4j.version>
|
||||||
<jquery.version>3.7.1</jquery.version>
|
<jquery.version>3.7.1</jquery.version>
|
||||||
<jsoup.version>1.19.1</jsoup.version>
|
<jsoup.version>1.18.3</jsoup.version>
|
||||||
<maven-compiler-plugin.version>3.14.0</maven-compiler-plugin.version>
|
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
|
||||||
<maven-failsafe-plugin.version>3.5.2</maven-failsafe-plugin.version>
|
<maven-failsafe-plugin.version>3.5.2</maven-failsafe-plugin.version>
|
||||||
<maven-jar-plugin.version>3.1.2</maven-jar-plugin.version>
|
<maven-jar-plugin.version>3.1.2</maven-jar-plugin.version>
|
||||||
<maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
|
<maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
|
||||||
<maven-source-plugin.version>3.1.0</maven-source-plugin.version>
|
<maven-source-plugin.version>3.1.0</maven-source-plugin.version>
|
||||||
<maven-surefire-plugin.version>3.5.3</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.5.2</maven-surefire-plugin.version>
|
||||||
<maven.compiler.proc>full</maven.compiler.proc>
|
<maven.compiler.proc>full</maven.compiler.proc>
|
||||||
<maven.compiler.source>23</maven.compiler.source>
|
<maven.compiler.source>23</maven.compiler.source>
|
||||||
<maven.compiler.target>23</maven.compiler.target>
|
<maven.compiler.target>23</maven.compiler.target>
|
||||||
@ -96,14 +96,14 @@
|
|||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<thymeleaf.version>3.1.2.RELEASE</thymeleaf.version>
|
<thymeleaf.version>3.1.2.RELEASE</thymeleaf.version>
|
||||||
<waittimeForServerStart>60</waittimeForServerStart>
|
<waittimeForServerStart>60</waittimeForServerStart>
|
||||||
<webdriver.version>6.0.1</webdriver.version>
|
<webdriver.version>5.9.3</webdriver.version>
|
||||||
<webgoat.context>/WebGoat</webgoat.context>
|
<webgoat.context>/WebGoat</webgoat.context>
|
||||||
<webgoat.port>8080</webgoat.port>
|
<webgoat.port>8080</webgoat.port>
|
||||||
<webgoat.sslenabled>false</webgoat.sslenabled>
|
<webgoat.sslenabled>false</webgoat.sslenabled>
|
||||||
<webjars-locator-core.version>0.59</webjars-locator-core.version>
|
<webjars-locator-core.version>0.59</webjars-locator-core.version>
|
||||||
<webwolf.context>/WebWolf</webwolf.context>
|
<webwolf.context>/WebWolf</webwolf.context>
|
||||||
<webwolf.port>9090</webwolf.port>
|
<webwolf.port>9090</webwolf.port>
|
||||||
<wiremock.version>3.13.0</wiremock.version>
|
<wiremock.version>3.12.0</wiremock.version>
|
||||||
<xml-resolver.version>1.2</xml-resolver.version>
|
<xml-resolver.version>1.2</xml-resolver.version>
|
||||||
<xstream.version>1.4.5</xstream.version>
|
<xstream.version>1.4.5</xstream.version>
|
||||||
<!-- do not update necessary for lesson -->
|
<!-- do not update necessary for lesson -->
|
||||||
@ -217,12 +217,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jruby</groupId>
|
<groupId>org.jruby</groupId>
|
||||||
<artifactId>jruby</artifactId>
|
<artifactId>jruby</artifactId>
|
||||||
<version>10.0.0.1</version>
|
<version>9.4.12.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.microsoft.playwright</groupId>
|
<groupId>com.microsoft.playwright</groupId>
|
||||||
<artifactId>playwright</artifactId>
|
<artifactId>playwright</artifactId>
|
||||||
<version>1.51.0</version>
|
<version>1.50.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
@ -238,7 +238,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
<version>1.18.38</version>
|
<version>1.18.36</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
@ -510,7 +510,7 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
|
<forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
|
||||||
<!-- Necessary for vulnerable components lesson -->
|
<!-- Necessary for vulnerable components lesson -->
|
||||||
<argLine>--enable-native-access=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED
|
<argLine>--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED
|
||||||
--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED
|
--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED
|
||||||
--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
|
--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
|
||||||
--add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED
|
--add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED
|
||||||
@ -536,7 +536,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>com.diffplug.spotless</groupId>
|
<groupId>com.diffplug.spotless</groupId>
|
||||||
<artifactId>spotless-maven-plugin</artifactId>
|
<artifactId>spotless-maven-plugin</artifactId>
|
||||||
<version>2.44.4</version>
|
<version>2.44.3</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<formats>
|
<formats>
|
||||||
<format>
|
<format>
|
||||||
@ -694,7 +694,6 @@
|
|||||||
<argument>-Dwebgoat.server.directory=${java.io.tmpdir}/webgoat_${webgoat.port}</argument>
|
<argument>-Dwebgoat.server.directory=${java.io.tmpdir}/webgoat_${webgoat.port}</argument>
|
||||||
<argument>-Dwebgoat.user.directory=${java.io.tmpdir}/webgoat_${webgoat.port}</argument>
|
<argument>-Dwebgoat.user.directory=${java.io.tmpdir}/webgoat_${webgoat.port}</argument>
|
||||||
<argument>-Dspring.main.banner-mode=off</argument>
|
<argument>-Dspring.main.banner-mode=off</argument>
|
||||||
<argument>--enable-native-access=ALL-UNNAMED</argument>
|
|
||||||
<argument>--add-opens</argument>
|
<argument>--add-opens</argument>
|
||||||
<argument>java.base/java.lang=ALL-UNNAMED</argument>
|
<argument>java.base/java.lang=ALL-UNNAMED</argument>
|
||||||
<argument>--add-opens</argument>
|
<argument>--add-opens</argument>
|
||||||
|
@ -4,9 +4,12 @@
|
|||||||
*/
|
*/
|
||||||
package org.owasp.webgoat.integration;
|
package org.owasp.webgoat.integration;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import io.restassured.RestAssured;
|
import io.restassured.RestAssured;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.assertj.core.api.Assertions;
|
import org.assertj.core.api.Assertions;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -54,6 +57,19 @@ public class ChallengeIntegrationTest extends IntegrationTest {
|
|||||||
checkAssignment(webGoatUrlConfig.url("challenge/flag/1"), params, true);
|
checkAssignment(webGoatUrlConfig.url("challenge/flag/1"), params, true);
|
||||||
|
|
||||||
checkResults("Challenge1");
|
checkResults("Challenge1");
|
||||||
|
|
||||||
|
List<String> capturefFlags =
|
||||||
|
RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
|
.get(webGoatUrlConfig.url("scoreboard-data"))
|
||||||
|
.then()
|
||||||
|
.statusCode(200)
|
||||||
|
.extract()
|
||||||
|
.jsonPath()
|
||||||
|
.get("find { it.username == \"" + this.getUser() + "\" }.flagsCaptured");
|
||||||
|
assertTrue(capturefFlags.contains("Admin lost password"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -83,6 +99,19 @@ public class ChallengeIntegrationTest extends IntegrationTest {
|
|||||||
checkAssignment(webGoatUrlConfig.url("challenge/flag/5"), params, true);
|
checkAssignment(webGoatUrlConfig.url("challenge/flag/5"), params, true);
|
||||||
|
|
||||||
checkResults("Challenge5");
|
checkResults("Challenge5");
|
||||||
|
|
||||||
|
List<String> capturefFlags =
|
||||||
|
RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
|
.get(webGoatUrlConfig.url("scoreboard-data"))
|
||||||
|
.then()
|
||||||
|
.statusCode(200)
|
||||||
|
.extract()
|
||||||
|
.jsonPath()
|
||||||
|
.get("find { it.username == \"" + this.getUser() + "\" }.flagsCaptured");
|
||||||
|
assertTrue(capturefFlags.contains("Without password"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -133,9 +162,7 @@ public class ChallengeIntegrationTest extends IntegrationTest {
|
|||||||
.when()
|
.when()
|
||||||
.relaxedHTTPSValidation()
|
.relaxedHTTPSValidation()
|
||||||
.cookie("JSESSIONID", getWebGoatCookie())
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
.get(
|
.get(webGoatUrlConfig.url("challenge/7/reset-password/{link}"), "375afe1104f4a487a73823c50a9292a2")
|
||||||
webGoatUrlConfig.url("challenge/7/reset-password/{link}"),
|
|
||||||
"375afe1104f4a487a73823c50a9292a2")
|
|
||||||
.then()
|
.then()
|
||||||
.statusCode(HttpStatus.ACCEPTED.value())
|
.statusCode(HttpStatus.ACCEPTED.value())
|
||||||
.extract()
|
.extract()
|
||||||
|
@ -7,6 +7,9 @@ package org.owasp.webgoat.integration;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*/
|
||||||
class SessionManagementIT extends IntegrationTest {
|
class SessionManagementIT extends IntegrationTest {
|
||||||
|
|
||||||
private static final String HIJACK_LOGIN_CONTEXT_PATH = "HijackSession/login";
|
private static final String HIJACK_LOGIN_CONTEXT_PATH = "HijackSession/login";
|
||||||
|
@ -19,17 +19,12 @@ public class PlaywrightTest {
|
|||||||
public static class WebGoatOptions implements OptionsFactory {
|
public static class WebGoatOptions implements OptionsFactory {
|
||||||
@Override
|
@Override
|
||||||
public Options getOptions() {
|
public Options getOptions() {
|
||||||
return new Options()
|
return new Options().setHeadless(true).setContextOptions(getContextOptions());
|
||||||
.setHeadless(true)
|
|
||||||
.setContextOptions(getContextOptions());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Browser.NewContextOptions getContextOptions() {
|
protected static Browser.NewContextOptions getContextOptions() {
|
||||||
return new Browser.NewContextOptions()
|
return new Browser.NewContextOptions().setBaseURL(webGoatUrlConfig.getBaseUrl());
|
||||||
.setLocale("en-US")
|
|
||||||
.setBaseURL(webGoatUrlConfig.getBaseUrl());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String webGoatUrl(String path) {
|
public static String webGoatUrl(String path) {
|
||||||
|
@ -35,7 +35,7 @@ public class RegistrationUITest extends PlaywrightTest {
|
|||||||
@Test
|
@Test
|
||||||
@DisplayName("Should register a new user")
|
@DisplayName("Should register a new user")
|
||||||
void registerNewUser(Browser browser) {
|
void registerNewUser(Browser browser) {
|
||||||
var page = browser.newContext(new Browser.NewContextOptions().setLocale("en-US")).newPage();
|
var page = browser.newContext().newPage();
|
||||||
var registrationPage = new RegistrationPage(page);
|
var registrationPage = new RegistrationPage(page);
|
||||||
registrationPage.open();
|
registrationPage.open();
|
||||||
|
|
||||||
|
@ -33,19 +33,19 @@ public class Authentication {
|
|||||||
|
|
||||||
public static Page sylvester(Browser browser) {
|
public static Page sylvester(Browser browser) {
|
||||||
User user = login(browser, sylvester);
|
User user = login(browser, sylvester);
|
||||||
return browser.newContext(new Browser.NewContextOptions().setLocale("en-US").setStorageState(user.auth)).newPage();
|
return browser.newContext(new Browser.NewContextOptions().setStorageState(user.auth)).newPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Page tweety(Browser browser) {
|
public static Page tweety(Browser browser) {
|
||||||
User user = login(browser, tweety);
|
User user = login(browser, tweety);
|
||||||
return browser.newContext(new Browser.NewContextOptions().setLocale("en-US").setStorageState(user.auth)).newPage();
|
return browser.newContext(new Browser.NewContextOptions().setStorageState(user.auth)).newPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static User login(Browser browser, User user) {
|
private static User login(Browser browser, User user) {
|
||||||
if (user.loggedIn()) {
|
if (user.loggedIn()) {
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
var page = browser.newContext(new Browser.NewContextOptions().setLocale("en-US")).newPage();
|
var page = browser.newContext().newPage();
|
||||||
RegistrationPage registrationPage = new RegistrationPage(page);
|
RegistrationPage registrationPage = new RegistrationPage(page);
|
||||||
registrationPage.open();
|
registrationPage.open();
|
||||||
registrationPage.register(user.name, user.password);
|
registrationPage.register(user.name, user.password);
|
||||||
|
@ -42,6 +42,8 @@ public class VulnerableTaskHolder implements Serializable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a task when de-serializing a saved or received object.
|
* Execute a task when de-serializing a saved or received object.
|
||||||
|
*
|
||||||
|
* @author stupid develop
|
||||||
*/
|
*/
|
||||||
private void readObject(ObjectInputStream stream) throws Exception {
|
private void readObject(ObjectInputStream stream) throws Exception {
|
||||||
// unserialize data so taskName and taskAction are available
|
// unserialize data so taskName and taskAction are available
|
||||||
|
@ -11,6 +11,11 @@ import java.io.IOException;
|
|||||||
import org.springframework.security.core.AuthenticationException;
|
import org.springframework.security.core.AuthenticationException;
|
||||||
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AjaxAuthenticationEntryPoint class.
|
||||||
|
*
|
||||||
|
* @author zupzup
|
||||||
|
*/
|
||||||
public class AjaxAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
|
public class AjaxAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
|
||||||
public AjaxAuthenticationEntryPoint(String loginFormUrl) {
|
public AjaxAuthenticationEntryPoint(String loginFormUrl) {
|
||||||
super(loginFormUrl);
|
super(loginFormUrl);
|
||||||
|
@ -47,26 +47,17 @@ public class LessonTemplateResolver extends FileTemplateResolver {
|
|||||||
var templateName = resourceName.substring(PREFIX.length());
|
var templateName = resourceName.substring(PREFIX.length());
|
||||||
byte[] resource = resources.get(templateName);
|
byte[] resource = resources.get(templateName);
|
||||||
if (resource == null) {
|
if (resource == null) {
|
||||||
resource = loadAndCache(templateName);
|
try {
|
||||||
|
resource =
|
||||||
|
resourceLoader
|
||||||
|
.getResource("classpath:/" + templateName)
|
||||||
|
.getInputStream()
|
||||||
|
.readAllBytes();
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Unable to find lesson HTML: {}", template);
|
||||||
}
|
}
|
||||||
|
resources.put(templateName, resource);
|
||||||
if (resource == null) {
|
|
||||||
return new StringTemplateResource("Unable to find lesson HTML: %s".formatted(templateName));
|
|
||||||
}
|
}
|
||||||
return new StringTemplateResource(new String(resource, StandardCharsets.UTF_8));
|
return new StringTemplateResource(new String(resource, StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] loadAndCache(String templateName) {
|
|
||||||
try {
|
|
||||||
var resource =
|
|
||||||
resourceLoader.getResource("classpath:/" + templateName).getInputStream().readAllBytes();
|
|
||||||
resources.put(templateName, resource);
|
|
||||||
return resource;
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error(
|
|
||||||
"Unable to find lesson HTML: '{}', does the name of HTML file name match the lesson class name?",
|
|
||||||
templateName);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,7 @@ public class MvcConfiguration implements WebMvcConfigurer {
|
|||||||
registry.addViewController("/login").setViewName("login");
|
registry.addViewController("/login").setViewName("login");
|
||||||
registry.addViewController("/lesson_content").setViewName("lesson_content");
|
registry.addViewController("/lesson_content").setViewName("lesson_content");
|
||||||
registry.addViewController("/start.mvc").setViewName("main_new");
|
registry.addViewController("/start.mvc").setViewName("main_new");
|
||||||
|
registry.addViewController("/scoreboard").setViewName("scoreboard");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
@ -10,6 +10,12 @@ import org.springframework.stereotype.Controller;
|
|||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Welcome class.
|
||||||
|
*
|
||||||
|
* @author rlawson
|
||||||
|
* @version $Id: $Id
|
||||||
|
*/
|
||||||
@Controller
|
@Controller
|
||||||
public class Welcome {
|
public class Welcome {
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@ import org.springframework.context.support.ReloadableResourceBundleMessageSource
|
|||||||
/**
|
/**
|
||||||
* ExposedReloadableResourceMessageBundleSource class. Extends the reloadable message source with a
|
* ExposedReloadableResourceMessageBundleSource class. Extends the reloadable message source with a
|
||||||
* way to get all messages
|
* way to get all messages
|
||||||
|
*
|
||||||
|
* @author zupzup
|
||||||
*/
|
*/
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class Messages extends ReloadableResourceBundleMessageSource {
|
public class Messages extends ReloadableResourceBundleMessageSource {
|
||||||
|
@ -7,6 +7,12 @@ package org.owasp.webgoat.container.lessons;
|
|||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LessonInfoModel class.
|
||||||
|
*
|
||||||
|
* @author dm
|
||||||
|
* @version $Id: $Id
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class LessonInfoModel {
|
public class LessonInfoModel {
|
||||||
|
@ -7,6 +7,12 @@ package org.owasp.webgoat.container.lessons;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LessonMenuItem class.
|
||||||
|
*
|
||||||
|
* @author rlawson
|
||||||
|
* @version $Id: $Id
|
||||||
|
*/
|
||||||
public class LessonMenuItem {
|
public class LessonMenuItem {
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
@ -18,6 +18,11 @@ import org.springframework.web.bind.annotation.GetMapping;
|
|||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LessonProgressService class.
|
||||||
|
*
|
||||||
|
* @author webgoat
|
||||||
|
*/
|
||||||
@Controller
|
@Controller
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class LessonProgressService {
|
public class LessonProgressService {
|
||||||
|
@ -6,6 +6,12 @@ package org.owasp.webgoat.container.session;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LabelDebugger class.
|
||||||
|
*
|
||||||
|
* @author dm
|
||||||
|
* @version $Id: $Id
|
||||||
|
*/
|
||||||
public class LabelDebugger implements Serializable {
|
public class LabelDebugger implements Serializable {
|
||||||
|
|
||||||
private boolean enabled = false;
|
private boolean enabled = false;
|
||||||
|
@ -84,6 +84,6 @@ public class LessonProgress {
|
|||||||
}
|
}
|
||||||
|
|
||||||
long numberOfSolvedAssignments() {
|
long numberOfSolvedAssignments() {
|
||||||
return assignments.stream().filter(AssignmentProgress::isSolved).count();
|
return assignments.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,10 @@ import org.springframework.web.bind.annotation.GetMapping;
|
|||||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Controller
|
@Controller
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: Copyright © 2017 WebGoat authors
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
package org.owasp.webgoat.container.users;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.owasp.webgoat.container.i18n.PluginMessages;
|
||||||
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
|
import org.owasp.webgoat.container.session.Course;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temp endpoint just for the CTF.
|
||||||
|
*
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/23/17.
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class Scoreboard {
|
||||||
|
|
||||||
|
private final UserProgressRepository userTrackerRepository;
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
private final Course course;
|
||||||
|
private final PluginMessages pluginMessages;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
private class Ranking {
|
||||||
|
private String username;
|
||||||
|
private List<String> flagsCaptured;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/scoreboard-data")
|
||||||
|
public List<Ranking> getRankings() {
|
||||||
|
return userRepository.findAll().stream()
|
||||||
|
.filter(user -> !user.getUsername().startsWith("csrf-"))
|
||||||
|
.map(
|
||||||
|
user ->
|
||||||
|
new Ranking(
|
||||||
|
user.getUsername(),
|
||||||
|
challengesSolved(userTrackerRepository.findByUser(user.getUsername()))))
|
||||||
|
.sorted((o1, o2) -> o2.getFlagsCaptured().size() - o1.getFlagsCaptured().size())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> challengesSolved(UserProgress userTracker) {
|
||||||
|
List<String> challenges =
|
||||||
|
List.of(
|
||||||
|
"Challenge1",
|
||||||
|
"Challenge2",
|
||||||
|
"Challenge3",
|
||||||
|
"Challenge4",
|
||||||
|
"Challenge5",
|
||||||
|
"Challenge6",
|
||||||
|
"Challenge7",
|
||||||
|
"Challenge8",
|
||||||
|
"Challenge9");
|
||||||
|
return challenges.stream()
|
||||||
|
.map(userTracker::getLessonProgress)
|
||||||
|
.flatMap(Optional::stream)
|
||||||
|
.filter(LessonProgress::isLessonSolved)
|
||||||
|
.map(LessonProgress::getLessonName)
|
||||||
|
.map(this::toLessonTitle)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String toLessonTitle(String id) {
|
||||||
|
String titleKey =
|
||||||
|
course.getLessons().stream()
|
||||||
|
.filter(l -> l.getId().equals(id))
|
||||||
|
.findFirst()
|
||||||
|
.map(Lesson::getTitle)
|
||||||
|
.orElse("No title");
|
||||||
|
return pluginMessages.getMessage(titleKey, titleKey);
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,10 @@ import jakarta.validation.constraints.Size;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class UserForm {
|
public class UserForm {
|
||||||
|
@ -41,7 +41,7 @@ public class UserProgress {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an existing lesson progress or create a new one based on the lesson
|
* Returns an existing lesson tracker or create a new one based on the lesson
|
||||||
*
|
*
|
||||||
* @param lesson the lesson
|
* @param lesson the lesson
|
||||||
* @return a lesson tracker created if not already present
|
* @return a lesson tracker created if not already present
|
||||||
@ -49,7 +49,7 @@ public class UserProgress {
|
|||||||
public LessonProgress getLessonProgress(Lesson lesson) {
|
public LessonProgress getLessonProgress(Lesson lesson) {
|
||||||
Optional<LessonProgress> progress =
|
Optional<LessonProgress> progress =
|
||||||
lessonProgress.stream().filter(l -> l.getLessonName().equals(lesson.getId())).findFirst();
|
lessonProgress.stream().filter(l -> l.getLessonName().equals(lesson.getId())).findFirst();
|
||||||
if (progress.isEmpty()) {
|
if (!progress.isPresent()) {
|
||||||
LessonProgress newLessonTracker = new LessonProgress(lesson);
|
LessonProgress newLessonTracker = new LessonProgress(lesson);
|
||||||
lessonProgress.add(newLessonTracker);
|
lessonProgress.add(newLessonTracker);
|
||||||
return newLessonTracker;
|
return newLessonTracker;
|
||||||
@ -58,6 +58,16 @@ public class UserProgress {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query method for finding a specific lesson tracker based on id
|
||||||
|
*
|
||||||
|
* @param id the id of the lesson
|
||||||
|
* @return optional due to the fact we can only create a lesson tracker based on a lesson
|
||||||
|
*/
|
||||||
|
public Optional<LessonProgress> getLessonProgress(String id) {
|
||||||
|
return lessonProgress.stream().filter(l -> l.getLessonName().equals(id)).findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
public void assignmentSolved(Lesson lesson, String assignmentName) {
|
public void assignmentSolved(Lesson lesson, String assignmentName) {
|
||||||
LessonProgress progress = getLessonProgress(lesson);
|
LessonProgress progress = getLessonProgress(lesson);
|
||||||
progress.incrementAttempts();
|
progress.incrementAttempts();
|
||||||
|
@ -7,6 +7,10 @@ package org.owasp.webgoat.container.users;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
public interface UserRepository extends JpaRepository<WebGoatUser, String> {
|
public interface UserRepository extends JpaRepository<WebGoatUser, String> {
|
||||||
|
|
||||||
WebGoatUser findByUsername(String username);
|
WebGoatUser findByUsername(String username);
|
||||||
|
@ -14,6 +14,10 @@ import org.springframework.security.core.userdetails.UserDetailsService;
|
|||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Service
|
@Service
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class UserService implements UserDetailsService {
|
public class UserService implements UserDetailsService {
|
||||||
|
@ -10,6 +10,10 @@ import lombok.Getter;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/15/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor(access = AccessLevel.PROTECTED)
|
@NoArgsConstructor(access = AccessLevel.PROTECTED)
|
||||||
|
@ -9,6 +9,10 @@ import org.springframework.stereotype.Component;
|
|||||||
import org.springframework.validation.Errors;
|
import org.springframework.validation.Errors;
|
||||||
import org.springframework.validation.Validator;
|
import org.springframework.validation.Validator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class UserValidator implements Validator {
|
public class UserValidator implements Validator {
|
||||||
|
@ -15,6 +15,10 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|||||||
import org.springframework.security.core.userdetails.User;
|
import org.springframework.security.core.userdetails.User;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Entity
|
@Entity
|
||||||
public class WebGoatUser implements UserDetails {
|
public class WebGoatUser implements UserDetails {
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/21/17.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class ChallengeIntro extends Lesson {
|
public class ChallengeIntro extends Lesson {
|
||||||
|
|
||||||
|
@ -9,6 +9,10 @@ import java.time.LocalDateTime;
|
|||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@Builder
|
@Builder
|
||||||
@Data
|
@Data
|
||||||
public class Email implements Serializable {
|
public class Email implements Serializable {
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/21/17.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class Challenge1 extends Lesson {
|
public class Challenge1 extends Lesson {
|
||||||
|
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/21/17.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class Challenge5 extends Lesson {
|
public class Challenge5 extends Lesson {
|
||||||
|
|
||||||
|
@ -29,6 +29,10 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 4/8/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Assignment7 implements AssignmentEndpoint {
|
public class Assignment7 implements AssignmentEndpoint {
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/21/17.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class Challenge7 extends Lesson {
|
public class Challenge7 extends Lesson {
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@ import java.util.Random;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* WARNING: DO NOT CHANGE FILE WITHOUT CHANGING .git contents
|
* WARNING: DO NOT CHANGE FILE WITHOUT CHANGING .git contents
|
||||||
|
*
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/17/17.
|
||||||
*/
|
*/
|
||||||
public class PasswordResetLink {
|
public class PasswordResetLink {
|
||||||
|
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/21/17.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class Challenge8 extends Lesson {
|
public class Challenge8 extends Lesson {
|
||||||
|
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TMelzer
|
||||||
|
* @since 30.11.18
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class ChromeDevTools extends Lesson {
|
public class ChromeDevTools extends Lesson {
|
||||||
|
|
||||||
|
@ -15,6 +15,12 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is just a class used to make the HTTP request.
|
||||||
|
*
|
||||||
|
* @author TMelzer
|
||||||
|
* @since 30.11.18
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class NetworkDummy implements AssignmentEndpoint {
|
public class NetworkDummy implements AssignmentEndpoint {
|
||||||
|
|
||||||
|
@ -19,6 +19,9 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
/**
|
/**
|
||||||
* Assignment where the user has to look through an HTTP Request using the Developer Tools and find
|
* Assignment where the user has to look through an HTTP Request using the Developer Tools and find
|
||||||
* a specific number.
|
* a specific number.
|
||||||
|
*
|
||||||
|
* @author TMelzer
|
||||||
|
* @since 30.11.18
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@AssignmentHints({"networkHint1", "networkHint2"})
|
@AssignmentHints({"networkHint1", "networkHint2"})
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author BenediktStuhrmann
|
||||||
|
* @since 11/2/18.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class CIA extends Lesson {
|
public class CIA extends Lesson {
|
||||||
|
|
||||||
|
@ -15,6 +15,10 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 4/6/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@AssignmentHints({
|
@AssignmentHints({
|
||||||
"client.side.filtering.free.hint1",
|
"client.side.filtering.free.hint1",
|
||||||
|
@ -15,6 +15,10 @@ import org.springframework.web.bind.annotation.PathVariable;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 4/6/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/clientSideFiltering/challenge-store")
|
@RequestMapping("/clientSideFiltering/challenge-store")
|
||||||
public class ShopEndpoint {
|
public class ShopEndpoint {
|
||||||
|
@ -10,6 +10,10 @@ import lombok.Getter;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 4/8/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
@ -8,6 +8,12 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class HijackSession extends Lesson {
|
public class HijackSession extends Lesson {
|
||||||
|
|
||||||
|
@ -21,6 +21,12 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@AssignmentHints({
|
@AssignmentHints({
|
||||||
"hijacksession.hints.1",
|
"hijacksession.hints.1",
|
||||||
|
@ -9,6 +9,9 @@ import lombok.Builder;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@ToString
|
@ToString
|
||||||
public class Authentication implements Principal {
|
public class Authentication implements Principal {
|
||||||
|
@ -6,6 +6,9 @@ package org.owasp.webgoat.lessons.hijacksession.cas;
|
|||||||
|
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface AuthenticationProvider<T extends Principal> {
|
public interface AuthenticationProvider<T extends Principal> {
|
||||||
|
|
||||||
|
@ -15,6 +15,10 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.context.annotation.ApplicationScope;
|
import org.springframework.web.context.annotation.ApplicationScope;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*/
|
||||||
|
|
||||||
// weak id value and mechanism
|
// weak id value and mechanism
|
||||||
|
|
||||||
@ApplicationScope
|
@ApplicationScope
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/22/17.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class JWT extends Lesson {
|
public class JWT extends Lesson {
|
||||||
|
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.owasp.webgoat.lessons.jwt.votes;
|
package org.owasp.webgoat.lessons.jwt.votes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 4/30/17.
|
||||||
|
*/
|
||||||
public class Views {
|
public class Views {
|
||||||
public interface GuestView {}
|
public interface GuestView {}
|
||||||
|
|
||||||
|
@ -7,6 +7,10 @@ package org.owasp.webgoat.lessons.jwt.votes;
|
|||||||
import com.fasterxml.jackson.annotation.JsonView;
|
import com.fasterxml.jackson.annotation.JsonView;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 5/2/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
public class Vote {
|
public class Vote {
|
||||||
@JsonView(Views.GuestView.class)
|
@JsonView(Views.GuestView.class)
|
||||||
|
@ -17,6 +17,10 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class QuestionsAssignment implements AssignmentEndpoint {
|
public class QuestionsAssignment implements AssignmentEndpoint {
|
||||||
|
|
||||||
|
@ -29,6 +29,10 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@AssignmentHints({
|
@AssignmentHints({
|
||||||
"password-reset-hint1",
|
"password-reset-hint1",
|
||||||
|
@ -22,6 +22,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Part of the password reset assignment. Used to send the e-mail.
|
||||||
|
*
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class ResetLinkAssignmentForgotPassword implements AssignmentEndpoint {
|
public class ResetLinkAssignmentForgotPassword implements AssignmentEndpoint {
|
||||||
|
|
||||||
|
@ -17,6 +17,12 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assignment for picking a good security question.
|
||||||
|
*
|
||||||
|
* @author Tobias Melzer
|
||||||
|
* @since 11.12.18
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class SecurityQuestionAssignment implements AssignmentEndpoint {
|
public class SecurityQuestionAssignment implements AssignmentEndpoint {
|
||||||
|
|
||||||
|
@ -23,6 +23,10 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
import org.springframework.web.client.RestClientException;
|
import org.springframework.web.client.RestClientException;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class SimpleMailAssignment implements AssignmentEndpoint {
|
public class SimpleMailAssignment implements AssignmentEndpoint {
|
||||||
private final String webWolfURL;
|
private final String webWolfURL;
|
||||||
|
@ -9,6 +9,10 @@ import jakarta.validation.constraints.Size;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/18/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class PasswordChangeForm {
|
public class PasswordChangeForm {
|
||||||
|
@ -8,6 +8,10 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author BenediktStuhrmann
|
||||||
|
* @since 12/2/18.
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class SecurePasswords extends Lesson {
|
public class SecurePasswords extends Lesson {
|
||||||
|
|
||||||
|
@ -8,6 +8,12 @@ import org.owasp.webgoat.container.lessons.Category;
|
|||||||
import org.owasp.webgoat.container.lessons.Lesson;
|
import org.owasp.webgoat.container.lessons.Lesson;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class SpoofCookie extends Lesson {
|
public class SpoofCookie extends Lesson {
|
||||||
|
|
||||||
|
@ -25,6 +25,12 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
@AssignmentHints({"spoofcookie.hint1", "spoofcookie.hint2", "spoofcookie.hint3"})
|
@AssignmentHints({"spoofcookie.hint1", "spoofcookie.hint2", "spoofcookie.hint3"})
|
||||||
@RestController
|
@RestController
|
||||||
public class SpoofCookieAssignment implements AssignmentEndpoint {
|
public class SpoofCookieAssignment implements AssignmentEndpoint {
|
||||||
|
@ -9,6 +9,12 @@ import java.util.Base64;
|
|||||||
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.springframework.security.crypto.codec.Hex;
|
import org.springframework.security.crypto.codec.Hex;
|
||||||
|
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* @author Angel Olle Blazquez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
public class EncDec {
|
public class EncDec {
|
||||||
|
|
||||||
// PoC: weak encoding method
|
// PoC: weak encoding method
|
||||||
|
@ -17,6 +17,10 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 6/13/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("SqlInjectionMitigations/servers")
|
@RequestMapping("SqlInjectionMitigations/servers")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@ -18,6 +18,10 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class LandingAssignment implements AssignmentEndpoint {
|
public class LandingAssignment implements AssignmentEndpoint {
|
||||||
private final String landingPageUrl;
|
private final String landingPageUrl;
|
||||||
|
@ -20,6 +20,10 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
import org.springframework.web.client.RestClientException;
|
import org.springframework.web.client.RestClientException;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class MailAssignment implements AssignmentEndpoint {
|
public class MailAssignment implements AssignmentEndpoint {
|
||||||
|
|
||||||
|
@ -10,6 +10,10 @@ import lombok.Getter;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 4/8/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
@ -12,6 +12,10 @@ import lombok.NoArgsConstructor;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 4/8/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
@ -14,6 +14,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 5/4/17.
|
||||||
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("xxe/comments")
|
@RequestMapping("xxe/comments")
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
@ -14,6 +14,10 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
|
|||||||
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/13/17.
|
||||||
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
public class MvcConfiguration implements WebMvcConfigurer {
|
public class MvcConfiguration implements WebMvcConfigurer {
|
||||||
|
|
||||||
|
@ -18,6 +18,10 @@ import lombok.Builder;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/20/17.
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
@ -7,6 +7,10 @@ package org.owasp.webgoat.webwolf.mailbox;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/17/17.
|
||||||
|
*/
|
||||||
public interface MailboxRepository extends JpaRepository<Email, String> {
|
public interface MailboxRepository extends JpaRepository<Email, String> {
|
||||||
|
|
||||||
List<Email> findByRecipientOrderByTimeDesc(String recipient);
|
List<Email> findByRecipientOrderByTimeDesc(String recipient);
|
||||||
|
@ -21,6 +21,9 @@ import org.springframework.web.servlet.ModelAndView;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for fetching all the HTTP requests from WebGoat to WebWolf for a specific user.
|
* Controller for fetching all the HTTP requests from WebGoat to WebWolf for a specific user.
|
||||||
|
*
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/13/17.
|
||||||
*/
|
*/
|
||||||
@Controller
|
@Controller
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@ -16,6 +16,9 @@ import org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository;
|
|||||||
/**
|
/**
|
||||||
* Keep track of all the incoming requests, we are only keeping track of request originating from
|
* Keep track of all the incoming requests, we are only keeping track of request originating from
|
||||||
* WebGoat.
|
* WebGoat.
|
||||||
|
*
|
||||||
|
* @author nbaars
|
||||||
|
* @since 8/13/17.
|
||||||
*/
|
*/
|
||||||
public class WebWolfTraceRepository implements HttpExchangeRepository {
|
public class WebWolfTraceRepository implements HttpExchangeRepository {
|
||||||
private enum MatchingMode {
|
private enum MatchingMode {
|
||||||
|
@ -7,6 +7,10 @@ package org.owasp.webgoat.webwolf.user;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Repository("webWolfUserRepository")
|
@Repository("webWolfUserRepository")
|
||||||
public interface UserRepository extends JpaRepository<WebWolfUser, String> {
|
public interface UserRepository extends JpaRepository<WebWolfUser, String> {
|
||||||
|
|
||||||
|
@ -8,6 +8,10 @@ import org.springframework.security.core.userdetails.UserDetailsService;
|
|||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class UserService implements UserDetailsService {
|
public class UserService implements UserDetailsService {
|
||||||
|
|
||||||
|
@ -15,6 +15,10 @@ import org.springframework.security.core.GrantedAuthority;
|
|||||||
import org.springframework.security.core.userdetails.User;
|
import org.springframework.security.core.userdetails.User;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nbaars
|
||||||
|
* @since 3/19/17.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "WEB_GOAT_USER")
|
@Table(name = "WEB_GOAT_USER")
|
||||||
|
@ -36,6 +36,10 @@ logging.level.org.hidbernate.SQL=INFO
|
|||||||
webgoat.server.directory=${user.home}/.webgoat-${webgoat.build.version}/
|
webgoat.server.directory=${user.home}/.webgoat-${webgoat.build.version}/
|
||||||
webgoat.user.directory=${user.home}/.webgoat-${webgoat.build.version}/
|
webgoat.user.directory=${user.home}/.webgoat-${webgoat.build.version}/
|
||||||
webgoat.build.version=@project.version@
|
webgoat.build.version=@project.version@
|
||||||
|
webgoat.email=webgoat@owasp.org
|
||||||
|
webgoat.emaillist=owasp-webgoat@lists.owasp.org
|
||||||
|
webgoat.feedback.address=webgoat@owasp.org
|
||||||
|
webgoat.feedback.address.html=<A HREF=mailto:webgoat@owasp.org>webgoat@owasp.org</A>
|
||||||
webgoat.database.connection.string=jdbc:hsqldb:mem:{USER}
|
webgoat.database.connection.string=jdbc:hsqldb:mem:{USER}
|
||||||
webgoat.default.language=en
|
webgoat.default.language=en
|
||||||
webgoat.url=http://${server.address}:${server.port}${server.servlet.context-path}
|
webgoat.url=http://${server.address}:${server.port}${server.servlet.context-path}
|
||||||
@ -47,9 +51,9 @@ webwolf.url=http://${webwolf.host}:${webwolf.port}${webwolf.context}
|
|||||||
webwolf.landingpage.url=${webwolf.url}/landing
|
webwolf.landingpage.url=${webwolf.url}/landing
|
||||||
webwolf.mail.url=${webwolf.url}/mail
|
webwolf.mail.url=${webwolf.url}/mail
|
||||||
|
|
||||||
#spring.jpa.properties.jakarta.persistence.schema-generation.scripts.action=create
|
spring.jpa.properties.jakarta.persistence.schema-generation.scripts.action=create
|
||||||
#spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-target=create.sql
|
spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-target=create.sql
|
||||||
#spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-source=metadata
|
spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-source=metadata
|
||||||
|
|
||||||
spring.jackson.serialization.indent_output=true
|
spring.jackson.serialization.indent_output=true
|
||||||
spring.jackson.serialization.write-dates-as-timestamps=false
|
spring.jackson.serialization.write-dates-as-timestamps=false
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
The challenges contain more a CTF like lessons where we do not provide any explanations what you need to do, no hints
|
The challenges contain more a CTF like lessons where we do not provide any explanations what you need to do, no hints
|
||||||
will be provided. You can use these challenges in a CTF style where you can run WebGoat on one server and all
|
will be provided. You can use these challenges in a CTF style where you can run WebGoat on one server and all
|
||||||
participants can join and hack the challenges.
|
participants can join and hack the challenges. A scoreboard is available at link:scoreboard["scoreboard",window=_blank]
|
||||||
|
|
||||||
:hardbreaks:
|
:hardbreaks:
|
||||||
In this CTF you will need to solve a couple of challenges, each challenge will give you a flag which you will
|
In this CTF you will need to solve a couple of challenges, each challenge will give you a flag which you will
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<html xmlns:th="http://www.thymeleaf.org">
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
|
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
<html xmlns:th="http://www.thymeleaf.org">
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
|
||||||
|
<div class="lesson-page-wrapper">
|
||||||
|
<div class="adoc-content" th:replace="~{doc:lessons/challenges/documentation/Challenge_introduction.adoc}"></div>
|
||||||
|
</div>
|
||||||
<div class="lesson-page-wrapper">
|
<div class="lesson-page-wrapper">
|
||||||
<div class="attack-container">
|
<div class="attack-container">
|
||||||
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
||||||
<form class="attack-form" accept-charset="UNKNOWN"
|
<form class="attack-form" accept-charset="UNKNOWN"
|
||||||
method="POST" name="form"
|
method="POST" name="form"
|
||||||
th:action="@{/ChromeDevTools/network}">
|
th:action="@{/chromeDevTools/network}">
|
||||||
<script>
|
<script>
|
||||||
// sample custom javascript in the recommended way ...
|
// sample custom javascript in the recommended way ...
|
||||||
// a namespace has been assigned for it, but you can roll your own if you prefer
|
// a namespace has been assigned for it, but you can roll your own if you prefer
|
||||||
@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
<form class="attack-form" accept-charset="UNKNOWN"
|
<form class="attack-form" accept-charset="UNKNOWN"
|
||||||
method="POST" name="form"
|
method="POST" name="form"
|
||||||
th:action="@{/ChromeDevTools/network}">
|
th:action="@{/chromeDevTools/network}">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td>What is the number you found: </td>
|
<td>What is the number you found: </td>
|
||||||
|
@ -1,7 +1,24 @@
|
|||||||
==== Setting up browser
|
==== Setting up browser
|
||||||
|
|
||||||
As the ZAP setup for proxying localhost varies based on your browser, we recommend following the instructions at: https://www.zaproxy.org/docs/desktop/start/proxies/
|
If you use the latest ZAP version (>= 2.8.0), you only need to start ZAP and click the browser button to be able to proxy, see image below:
|
||||||
After you setup the proxy, you should see the following in OWASP ZAP on the history panel:
|
|
||||||
|
{nbsp} +
|
||||||
|
|
||||||
|
image::images/zap-browser-button.png[ZAP Start,style="lesson-image"]
|
||||||
|
|
||||||
|
{nbsp} +
|
||||||
|
|
||||||
|
In the browser type: http://localhost:8080/WebGoat, you should see WebGoat and the OWASP ZAP Heads On Display (if you use OWASP ZAP as the proxy):
|
||||||
|
|
||||||
|
{nbsp} +
|
||||||
|
|
||||||
|
image::images/loginscreen.png[Browser with HUD,style="lesson-image"]
|
||||||
|
|
||||||
|
{nbsp} +
|
||||||
|
|
||||||
|
You might notice that this is the Dutch login screen. The browser determines the language settings. For some pages, there will be some local translations. You can contribute to WebGoat and add more for your preferred language. You can disable the Heads On Display by clicking on the highlighted button. You can learn about the OWASP ZAP HUD on their website. For now, we recommend disabling it as it kind of blocks the menu items.
|
||||||
|
|
||||||
|
You should see the following in OWASP ZAP on the history panel:
|
||||||
|
|
||||||
{nbsp} +
|
{nbsp} +
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ And in the `URL Exc Regex` box type:
|
|||||||
|
|
||||||
[source]
|
[source]
|
||||||
----
|
----
|
||||||
.*lesson.*.mvc.*
|
.*lesson.*.mvc
|
||||||
----
|
----
|
||||||
|
|
||||||
Click 'Apply to close the window, and ZAP will now no longer show internal WebGoat requests.
|
Click 'Apply to close the window, and ZAP will now no longer show internal WebGoat requests.
|
||||||
|
BIN
src/main/resources/lessons/httpproxies/images/loginscreen.png
Normal file
BIN
src/main/resources/lessons/httpproxies/images/loginscreen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 67 KiB |
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
@ -16,9 +16,9 @@ An example JKU would look like this:
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
=== Vulnerability: JWT claim misuse with JKU
|
=== Vulnerability
|
||||||
|
|
||||||
The vulnerability arises when a JWT is signed with a weak or predictable key and the server provides a JKU that points to an external location hosting the public key.
|
JWT claim misuse with JKU The vulnerability arises when a JWT is signed with a weak or predictable key and the server provides a JKU that points to an external location hosting the public key.
|
||||||
|
|
||||||
Attackers can exploit this vulnerability by crafting a JWT with malicious claims and using the `jku` to trick the server into verifying the JWT using a weak or manipulated key.
|
Attackers can exploit this vulnerability by crafting a JWT with malicious claims and using the `jku` to trick the server into verifying the JWT using a weak or manipulated key.
|
||||||
It all depends on the library being used inside the application.
|
It all depends on the library being used inside the application.
|
||||||
@ -39,7 +39,6 @@ However, filtering on URLs is quite challenging to implement, and this can be by
|
|||||||
|
|
||||||
- **Successful attack**: If the server uses the weak or manipulated key to verify the JWT, the attacker gains unauthorized access or executes their intended exploit.
|
- **Successful attack**: If the server uses the weak or manipulated key to verify the JWT, the attacker gains unauthorized access or executes their intended exploit.
|
||||||
|
|
||||||
|
|
||||||
=== Mitigation
|
=== Mitigation
|
||||||
|
|
||||||
To prevent JWT claim misuse with JKU, developers and security professionals should follow these best practices:
|
To prevent JWT claim misuse with JKU, developers and security professionals should follow these best practices:
|
||||||
|
@ -72,7 +72,7 @@
|
|||||||
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
||||||
<form class="attack-form" accept-charset="UNKNOWN"
|
<form class="attack-form" accept-charset="UNKNOWN"
|
||||||
method="POST" name="form"
|
method="POST" name="form"
|
||||||
th:action="@{/SqlOnlyInputValidation/attack}"
|
th:action="@{/SqlInjectionMitigations/attack}"
|
||||||
enctype="application/json;charset=UTF-8">
|
enctype="application/json;charset=UTF-8">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
@ -95,7 +95,7 @@
|
|||||||
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
||||||
<form class="attack-form" accept-charset="UNKNOWN"
|
<form class="attack-form" accept-charset="UNKNOWN"
|
||||||
method="POST" name="form"
|
method="POST" name="form"
|
||||||
th:action="@{/SqlOnlyInputValidationOnKeywords/attack}"
|
th:action="@{/SqlInjectionMitigations/attack}"
|
||||||
enctype="application/json;charset=UTF-8">
|
enctype="application/json;charset=UTF-8">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
{
|
{
|
||||||
"questions": [
|
"questions": [{
|
||||||
{
|
|
||||||
"text": "What is the difference between a prepared statement and a statement?",
|
"text": "What is the difference between a prepared statement and a statement?",
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "Prepared statements are statements with hard-coded parameters.",
|
"1": "Prepared statements are statements with hard-coded parameters.",
|
||||||
"2": "Prepared statements are not stored in the database.",
|
"2": "Prepared statements are not stored in the database.",
|
||||||
"3": "A statement is faster executes faster than a prepared statement.",
|
"3": "A statement is faster.",
|
||||||
"4": "A statement includes actual values, whereas a prepared statement uses placeholders."
|
"4": "A statement has got values instead of a prepared statement"
|
||||||
}
|
}
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"text": "Which one of the following characters is a placeholder for variables?",
|
"text": "Which one of the following characters is a placeholder for variables?",
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "*",
|
"1": "*",
|
||||||
@ -17,33 +15,29 @@
|
|||||||
"3": "?",
|
"3": "?",
|
||||||
"4": "!"
|
"4": "!"
|
||||||
}
|
}
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"text": "How can prepared statements be faster than statements?",
|
"text": "How can prepared statements be faster than statements?",
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "Prepared statements are not static, allowing them to be optimized more efficiently than regular statements.",
|
"1": "They are not static so they can compile better written code than statements.",
|
||||||
"2": "Prepared statements are compiled once by the database management system and then reused with different inputs, reducing compilation overhead.",
|
"2": "Prepared statements are compiled once by the database management system waiting for input and are pre-compiled this way.",
|
||||||
"3": "Since prepared statements are stored and wait for input, they improve performance significantly.",
|
"3": "Prepared statements are stored and wait for input it raises performance considerably.",
|
||||||
"4": "Oracle optimizes prepared statements, making them faster by minimizing the use of database resources."
|
"4": "Oracle optimized prepared statements. Because of the minimal use of the databases resources it is faster."
|
||||||
}
|
}
|
||||||
},
|
}, {
|
||||||
{
|
"text": "How can a prepared statement prevent SQL-Injection?",
|
||||||
"text": "How do prepared statements help prevent SQL injection?",
|
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "Prepared statements have built-in mechanisms to distinguish between user input and SQL logic, preventing malicious manipulation.",
|
"1": "Prepared statements have got an inner check to distinguish between input and logical errors.",
|
||||||
"2": "Prepared statements use placeholders to enforce rules on allowed input, reducing the risk of SQL injection.",
|
"2": "Prepared statements use the placeholders to make rules what input is allowed to use.",
|
||||||
"3": "Placeholders prevent user input from being directly appended to the SQL query, ensuring a clear separation between code and data.",
|
"3": "Placeholders can prevent that the users input gets attached to the SQL query resulting in a seperation of code and data.",
|
||||||
"4": "Prepared statements treat all user input as literal values, never mixing it with SQL commands."
|
"4": "Prepared statements always read inputs literally and never mixes it with its SQL commands."
|
||||||
}
|
}
|
||||||
},
|
}, {
|
||||||
{
|
"text": "What happens if a person with malicious intent writes into a register form :Robert); DROP TABLE Students;-- that has a prepared statement?",
|
||||||
"text": "What happens if a person with malicious intent enters the following input into a registration form that uses a prepared statement? Input: Robert); DROP TABLE Students;--",
|
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "The Students table and all its data will be deleted.",
|
"1": "The table Students and all of its content will be deleted.",
|
||||||
"2": "The input deletes all students named Robert.",
|
"2": "The input deletes all students with the name Robert.",
|
||||||
"3": "The database registers Robert and then deletes the table.",
|
"3": "The database registers 'Robert' and deletes the table afterwards.",
|
||||||
"4": "The database treats the entire input as a plain string: Robert); DROP TABLE Students;-- without executing it as SQL."
|
"4": "The database registers 'Robert' ); DROP TABLE Students;--'."
|
||||||
}
|
}
|
||||||
}
|
}]
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
{
|
{
|
||||||
"questions": [{
|
"questions": [{
|
||||||
"text": "Is a well known website, like Netflix, immune to XSS attacks?",
|
"text": "Are trusted websites immune to XSS attacks?",
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "Yes, they are safe because the browser checks the code before executing.",
|
"1": "Yes they are safe because the browser checks the code before executing.",
|
||||||
"2": "Yes, because Google has got an algorithm that blocks malicious code.",
|
"2": "Yes because Google has got an algorithm that blocks malicious code.",
|
||||||
"3": "No, because the script that is executed will break through the defense algorithm of the browser.",
|
"3": "No because the script that is executed will break through the defense algorithm of the browser.",
|
||||||
"4": "No, because the browser trusts the website if it is acknowledged trusted, then the browser does not know that the script is malicious."
|
"4": "No because the browser trusts the website if it is acknowledged trusted, then the browser does not know that the script is malicious."
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
"text": "When do XSS attacks occur?",
|
"text": "When do XSS attacks occur?",
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "When malicious scripts are injected into a website's server-side code.",
|
"1": "Data enters a web application through a trusted source.",
|
||||||
"2": "When a user submits sensitive information without encryption.",
|
"2": "Data enters a browser application through the website.",
|
||||||
"3": "When a website fails to validate or sanitize user input, allowing malicious scripts to be executed in a user's browser.",
|
"3": "The data is included in dynamic content that is sent to a web user without being validated for malicious content.",
|
||||||
"4": "When a website uses outdated SSL/TLS protocols."
|
"4": "The data is excluded in static content that way it is sent without being validated."
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
"text": "What are Stored XSS attacks?",
|
"text": "What are Stored XSS attacks?",
|
||||||
@ -27,17 +27,17 @@
|
|||||||
"text": "What are Reflected XSS attacks?",
|
"text": "What are Reflected XSS attacks?",
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "Reflected attacks reflect malicious code from the database to the web server and then reflect it back to the user.",
|
"1": "Reflected attacks reflect malicious code from the database to the web server and then reflect it back to the user.",
|
||||||
"2": "They reflect the injected script off the web server. That occurs when input sent to the web server is part of the response.",
|
"2": "They reflect the injected script off the web server. That occurs when input sent to the web server is part of the request.",
|
||||||
"3": "Reflected attacks reflect from the firewall off to the database where the user requests information from.",
|
"3": "Reflected attacks reflect from the firewall off to the database where the user requests information from.",
|
||||||
"4": "Reflected XSS is an attack where the injected script is reflected off the database and web server to the user."
|
"4": "Reflected XSS is an attack where the injected script is reflected off the database and web server to the user."
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
"text": "Is JavaScript the only way to perform XSS attacks?",
|
"text": "Is JavaScript the only way to perform XSS attacks?",
|
||||||
"solutions": {
|
"solutions": {
|
||||||
"1": "Yes, you can only make use of tags through JavaScript.",
|
"1": "Yes you can only make use of tags through JavaScript.",
|
||||||
"2": "Yes, otherwise you cannot steal cookies.",
|
"2": "Yes otherwise you cannot steal cookies.",
|
||||||
"3": "No, there is ECMAScript too.",
|
"3": "No there is ECMAScript too.",
|
||||||
"4": "No, there are many other ways. Like HTML, Flash or any other type of code that the browser executes."
|
"4": "No there are many other ways. Like HTML, Flash or any other type of code that the browser executes."
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
@ -1172,10 +1172,46 @@ span.show-next-page, span.show-prev-page {
|
|||||||
width: 95% !important
|
width: 95% !important
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* scoreboard */
|
||||||
|
div.scoreboard-title {
|
||||||
|
font-size: xx-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scoreboard-table tr {
|
||||||
|
}
|
||||||
|
|
||||||
|
div.scoreboard-username {
|
||||||
|
background-color: #222;
|
||||||
|
color: aliceblue;
|
||||||
|
padding: 4px;
|
||||||
|
padding-left: 8px;
|
||||||
|
font-size: medium;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
th.username {
|
th.username {
|
||||||
padding-bottom: 6px;
|
padding-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
td.user-flags {
|
||||||
|
padding-left: 8px;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.captured-flag {
|
||||||
|
border-radius: 6px;
|
||||||
|
background-color: #444;
|
||||||
|
color: white;
|
||||||
|
padding: 4px;
|
||||||
|
font-size: medium;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scoreboard-page {
|
||||||
|
background-color: #e0dfdc;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.fa-flag {
|
.fa-flag {
|
||||||
color: red
|
color: red
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
define(['jquery',
|
||||||
|
'underscore',
|
||||||
|
'backbone'],
|
||||||
|
function($,
|
||||||
|
_,
|
||||||
|
Backbone) {
|
||||||
|
return Backbone.Model.extend({
|
||||||
|
});
|
||||||
|
});
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user