tidy
This commit is contained in:
parent
22f312cbb9
commit
4f984a46f8
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -15,4 +15,7 @@
|
||||||
|
|
||||||
# src-tauri
|
# src-tauri
|
||||||
**/target/
|
**/target/
|
||||||
**/gen/schemas
|
**/gen/schemas
|
||||||
|
|
||||||
|
# server
|
||||||
|
server/server
|
35
README.md
35
README.md
|
@ -1,21 +1,12 @@
|
||||||
# cspj application
|
# CSPJ Application
|
||||||
|
|
||||||
## attacks
|
## Services
|
||||||
|
|
||||||
1. sql injection
|
- 3331: Apache + ModSecurity
|
||||||
2. xss
|
- 3332: Suricata
|
||||||
3. command injection
|
- 3333: Backend server
|
||||||
4. file inclusion attacks
|
- 3334: Python backend server
|
||||||
5. csrf
|
- 3335: PostgreSQL
|
||||||
6. directory traversal
|
|
||||||
7. insecure deserialization
|
|
||||||
8. session hijacking
|
|
||||||
9. xml external entity injection
|
|
||||||
10. sever side request forgery
|
|
||||||
11. broken authentication and session management
|
|
||||||
12. clickjacking
|
|
||||||
|
|
||||||
## backend
|
|
||||||
|
|
||||||
backend-for-frontend server
|
backend-for-frontend server
|
||||||
|
|
||||||
|
@ -41,7 +32,8 @@ PGPASSWORD=asdfpassword
|
||||||
|
|
||||||
### SQL Injection
|
### SQL Injection
|
||||||
|
|
||||||
Use `' OR 1=1; --`
|
Use `' OR 1=1; --`
|
||||||
|
Use `tohyouxuan@gmail.com' UNION SELECT id, email, password FROM users WHERE email = 'tohyouxuan@gmail.com'; --`
|
||||||
|
|
||||||
- `/unsecure-register-sql`
|
- `/unsecure-register-sql`
|
||||||
- `/secure-register-sql`
|
- `/secure-register-sql`
|
||||||
|
@ -52,3 +44,12 @@ Use `' OR 1=1; --`
|
||||||
|
|
||||||
Used `pool.Query()` with a parameterized query, instead of dynamically constructing the SQL query by directly inserting the user input.
|
Used `pool.Query()` with a parameterized query, instead of dynamically constructing the SQL query by directly inserting the user input.
|
||||||
Parameterized queries separate the SQL code from the data, so user input is never directly put into the query's structure. Placeholders are used instead, and the data is passed as parameters. The DB will treat them as data, not executable code.
|
Parameterized queries separate the SQL code from the data, so user input is never directly put into the query's structure. Placeholders are used instead, and the data is passed as parameters. The DB will treat them as data, not executable code.
|
||||||
|
|
||||||
|
## ZAP
|
||||||
|
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"email": "tohyouxuan@gmail.com",
|
||||||
|
"password": "testpassword"
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
import { BugReportOutlined } from "@mui/icons-material";
|
import { BugReportOutlined } from "@mui/icons-material";
|
||||||
import { Box, Button, IconButton, useTheme } from "@mui/material";
|
import { Box, Button, IconButton, useTheme } from "@mui/material";
|
||||||
import { fetch } from "@tauri-apps/plugin-http";
|
import { fetch } from "@tauri-apps/plugin-http";
|
||||||
|
import { useAtom } from "jotai";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
import { serverUrlAtom } from "../../lib/jotai";
|
||||||
import { defaultSettings } from "../../lib/settings";
|
import { defaultSettings } from "../../lib/settings";
|
||||||
import { FloatingDialog } from "../Generic/FloatingDialog";
|
import { FloatingDialog } from "../Generic/FloatingDialog";
|
||||||
|
|
||||||
|
@ -9,6 +11,9 @@ export const Testing = () => {
|
||||||
// contexts
|
// contexts
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
|
|
||||||
|
// atoms
|
||||||
|
const [serverUrl, setServerUrl] = useAtom(serverUrlAtom);
|
||||||
|
|
||||||
// states
|
// states
|
||||||
const [openState, setOpenState] = useState(false);
|
const [openState, setOpenState] = useState(false);
|
||||||
const [maximisedState, setMaximisedState] = useState(false);
|
const [maximisedState, setMaximisedState] = useState(false);
|
||||||
|
@ -17,10 +22,10 @@ export const Testing = () => {
|
||||||
const close = () => setOpenState(false);
|
const close = () => setOpenState(false);
|
||||||
|
|
||||||
const testing = () => {
|
const testing = () => {
|
||||||
fetch("http://localhost:5000/nuke-db").then((response) => {
|
fetch(serverUrl + "/nuke-db").then((response) => {
|
||||||
console.log(response);
|
console.log(response);
|
||||||
});
|
});
|
||||||
fetch("http://localhost:5000/setup-demo-db").then((response) => {
|
fetch(serverUrl + "/setup-demo-db").then((response) => {
|
||||||
console.log(response);
|
console.log(response);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,13 +4,13 @@ services:
|
||||||
container_name: modsecurity
|
container_name: modsecurity
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "3331:3331"
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- "host.docker.internal:host-gateway"
|
- "host.docker.internal:host-gateway"
|
||||||
environment:
|
environment:
|
||||||
BACKEND: "http://host.docker.internal:5000"
|
BACKEND: "http://host.docker.internal:3333" # TODO: CHANGE THIS TO SURICATA'S PORT COS INLINE
|
||||||
SERVER_NAME: "localhost"
|
SERVER_NAME: "localhost"
|
||||||
PORT: "8080"
|
PORT: "3331"
|
||||||
networks:
|
networks:
|
||||||
- modsec-network
|
- modsec-network
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ services:
|
||||||
POSTGRES_PASSWORD: asdfpassword
|
POSTGRES_PASSWORD: asdfpassword
|
||||||
POSTGRES_DB: asdfdb
|
POSTGRES_DB: asdfdb
|
||||||
ports:
|
ports:
|
||||||
- "5432:5432"
|
- "3335:5432"
|
||||||
volumes:
|
volumes:
|
||||||
- postgres_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
volumes:
|
volumes:
|
||||||
|
|
1
docker/zaproxy/run.sh
Normal file
1
docker/zaproxy/run.sh
Normal file
|
@ -0,0 +1 @@
|
||||||
|
docker run -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap.sh -cmd -autorun /zap/wrk/zap.yaml
|
10
docker/zaproxy/zap.yaml
Normal file
10
docker/zaproxy/zap.yaml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
jobs:
|
||||||
|
- type: spider
|
||||||
|
parameters:
|
||||||
|
context: "Default Context"
|
||||||
|
url: "http://localhost:5000/unsafe-login"
|
||||||
|
maxDuration: 2
|
||||||
|
- type: activeScan
|
||||||
|
parameters:
|
||||||
|
context: "Default Context"
|
||||||
|
policy: "SQL Injection"
|
|
@ -14,7 +14,7 @@ import (
|
||||||
// !MIGHT CHANGE
|
// !MIGHT CHANGE
|
||||||
const (
|
const (
|
||||||
host = "localhost"
|
host = "localhost"
|
||||||
port = 5432
|
port = 3335
|
||||||
user = "asdfuser"
|
user = "asdfuser"
|
||||||
password = "asdfpassword"
|
password = "asdfpassword"
|
||||||
dbname = "asdfdb"
|
dbname = "asdfdb"
|
||||||
|
|
|
@ -26,8 +26,8 @@ func ServeApi() {
|
||||||
http.HandleFunc("/unsecure-login-sql", sql_injection.UnsecureLoginSql)
|
http.HandleFunc("/unsecure-login-sql", sql_injection.UnsecureLoginSql)
|
||||||
http.HandleFunc("/secure-login-sql", sql_injection.SecureLoginSql)
|
http.HandleFunc("/secure-login-sql", sql_injection.SecureLoginSql)
|
||||||
|
|
||||||
log.Println("Server is running on http://localhost:5000")
|
log.Println("Server is running on http://localhost:3333")
|
||||||
if err := http.ListenAndServe(":5000", nil); err != nil {
|
if err := http.ListenAndServe(":3333", nil); err != nil {
|
||||||
log.Fatalf("Failed to start server: %v", err)
|
log.Fatalf("Failed to start server: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue