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)
์ฐธ๊ณ ๋ก, ๋ก๊ทธ์ธ ์ทจ์๋ฅผ ๋๋ฅด๋ฉด ์๋์ ๊ฐ์ด 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)
'SWLUG > web hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
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 |
7์ฃผ์ฐจ_Webhacking ๊ณผ์ 2 : dreamhack [command-injection-1] (0) | 2023.11.17 |