출처
인프런, 비박스를 활용한 웹 모의해킹 완벽 실습 16강 https://www.inflearn.com/course/%EB%B9%84%EB%B0%95%EC%8A%A4-%EB%AA%A8%EC%9D%98%ED%95%B4%ED%82%B9-%EC%8B%A4%EC%8A%B5/
취약한 직접 객체 참조
- 클라이언트에서 보내는 값을 무작정 믿고 인증을 처리한다면 문제가 발생할 수 있다는 것
Insecure DOR (Change Secret)
- 비밀번호 힌트를 바꾸는 내용임을 알 수 있음
- New secret에 test1234를 누르고 SQL Injection (Login Form/user)에 들어가면 secret 값이 바뀜을 알 수 있음
SQL Injection (Login Form/User)
- ID:
bee
, Password:bug
를 입력하면 위와 같은 결과가 나오며 Your secret: test1234가 뜸 - SQL 인젝션으로 조회할 수 있음 –> ID:
' or 1=1 #
, Password:bug
ID에 SQL 인젝션한 결과 나오는 아이디 –> A.I.M.
- A.I.M의 secret 값을 바꾸기 위해 다시 Insecure DOR (Change Secret)으로 이동
- BurpSuite로 login 항목 값 변경
Insecure DOR에서 BurpSuite로 login 값 변경
SQL Injection (Login Form/User)에서 다시 A.I.M. 조회한 결과
- 클라이언트 요청에 대하여 웹에서 로그인 된 유저인지 확인을 하지 않아 문제가 됨
Insecure DOR (Change Secret) (High)
New secret = test4321로 값을 입력하고 BurpSuite로 이를 확인하면 다음과 같음
BurpSuite로 확인한 High 레벨 Insecure DOR
- token이 존재함을 알 수 있음
insecure_direct_object_ref_1.php에서 취약한 부분
// If the security level is not MEDIUM or HIGH
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{
if(isset($_REQUEST["login"]) && $_REQUEST["login"])
{
$login = $_REQUEST["login"];
$login = mysqli_real_escape_string($link, $login);
$secret = mysqli_real_escape_string($link, $secret);
$secret = htmlspecialchars($secret, ENT_QUOTES, "UTF-8");
$sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
$login
에 대하여 검증절차 없이 받아 문제가 됨
insecure_direct_object_ref_1.php에서 Medium이나 High에서 처리하는 부분
else
{
// If the security level is MEDIUM or HIGH
if(!isset($_REQUEST["token"]) or !isset($_SESSION["token"]) or $_REQUEST["token"] != $_SESSION["token"])
{
$message = "<font color=\"red\">Invalid token!</font>";
}
else
{
$secret = mysqli_real_escape_string($link, $secret);
$secret = htmlspecialchars($secret, ENT_QUOTES, "UTF-8");
$sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
// Debugging
// echo $sql;
$recordset = $link->query($sql);
- token을 설정하여 서버에 있는 token과 일치하는지 확인함
Insecure DOR (Reset Secret)
BurpSuite로 확인
- login으로
bee
를 secret으로bug
를 보내주고 있음
SQL Injection (Login Form/User)에서 확인
A.I.M.으로 바꾸기
A.I.M. secret 값 확인
- 당연히 High 레벨에서는 안 됨
insecure_direct_object_ref_3.php에서 High 레벨에서 안 되게 하는 부분
function ResetSecret()
{
var xmlHttp;
// Code for IE7+, Firefox, Chrome, Opera, Safari
if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
// Code for IE6, IE5
else
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.open("POST","xxe-2.php",true);
xmlHttp.setRequestHeader("Content-type","text/xml; charset=UTF-8");
xmlHttp.send("<reset><login><?php if(isset($_SESSION["login"])){echo $_SESSION["login"];}?></login><secret>Any bugs?</secret></reset>");
}
- xxe-2.php로 넘어가 secret을 reset함을 알 수 있음
xxe-2.php
// If the security level is MEDIUM or HIGH
else
{
// Disables XML external entities. Doesn't work with older PHP versions!
// libxml_disable_entity_loader(true);
$xml = simplexml_load_string($body);
// Debugging
// print_r($xml);
$login = $_SESSION["login"];
$secret = $xml->secret;
$_SESSION
이라는 변수를 두어 방어하였음
Insecure DOR (Order Tickets)
BurpSuite로 ticket_price를 15에서 1로 바꾸기
가격 조작한 결과
- 겁나 유치하네
Insecure DOR (Order Tickets) (Medium)
- price 항목이 없어졌음
BurpSuite에서 ticket_price 항복을 입력 후 Forward와 그 결과
insecure_direct_object_ref_2.php에서 문제가 되는 코드 부분
if(isset($_REQUEST["ticket_quantity"]))
{
if($_COOKIE["security_level"] != "2")
{
if(isset($_REQUEST["ticket_price"]))
{
$ticket_price = $_REQUEST["ticket_price"];
}
}
$ticket_quantity = abs($_REQUEST["ticket_quantity"]);
$total_amount = $ticket_quantity * $ticket_price;
- 레벨 1에서 ticket_price가 설정되어 있는지 확인하고 설정되어 있다면 적용
- 즉, ticket_price 값을 보내면 그대로 적용
Comments