지난 글에서도 언급했지만 나는 웹, 특히 데이터베이스 부분에 대해서 많이 취약하기 때문에 이 부분에 대해 공부를 좀 할 필요가 있다. 그래서 인터넷에서도 이런저런 문서를 찾아보고 있긴 한데 얼마전 이 글을 읽고서 LoS, 즉 Lord of SQLInjection 문제를 풀면서 공부하기로 했다.
리버스 엔지니어링도 기초 지식을 공부한 후 워게임 문제를 풀면서 흥미를 가졌던 것처럼 SQL Injection도 문제를 풀어보면서 공부하면 효과가 더 좋을거라 생각해서 이렇게 문제를 풀게 되었다. Wargame.kr에도 SQL Injection 문제가 있긴 하지만 아직은 모르는 부분이 좀 많아서 단계별로 SQL Injection 문제만 제공되는 rubiya의 LoS를 먼저 시작하려고 한다.
그래서 첫 번째 문제인 gremlin이다. 지금은 풀었기 때문에 X 표시와 함께 취소선이 그어져 있다. 이 los는 다른 워게임들처럼 따로 설명은 제공되지 않고 문제를 클릭하면 웹 소스 코드와 우리가 입력한 값으로 생성된 쿼리가 어떤 식으로 처리되는지 그대로 보여주는 친절한 문제다. 그래서 이를 참고하며 해당 소스 코드의 검증 로직을 우회할 수 있는 SQL Query를 작성해야 한다.
첫 번째 문제인 gremlin은 다음과 같다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
highlight_file(__FILE__);
?>
제일 먼저 보이는 preg_match() 함수는 php에서 정규표현식 매칭을 수행하는 함수로 현재 문제와 상관없는 다른 테이블을 SQL Injection 하는 것을 방지하기 위한 구문이다. 간단히 해석해보자면 "prob"라는 문자열과 매칭되거나 '_'라는 문자와 매칭되거나 '.'라는 문자와 매칭되거나 "()"라는 문자열과 매칭될 경우 문제를 종료한다는 것이다. 테이블 이름이 문제마다 prob_gremlin, prob_cobolt 처럼 구성되어 있기 때문에 이에 대한 접근 시도를 방지하는 것 같다.
그렇다면 이 부분은 별로 신경 쓸 필요가 없고 그 아래를 살펴봐야 하는데 사실 사용자의 입력값을 거의 그대로 쿼리에 집어넣고 있기 때문에 SQL Injection의 대표적인 예시인 "' or '1'='1'--" 같은 쿼리를 조금만 변경해서 사용하면 된다. 일단 mysql에서 한 라인의 주석 처리는 '#' 문자를 사용하기 때문에 id 파라미터에 OR 연산으로 참 값을 만든 후 맨 마지막에 '#' 문자를 넣어보자.
확인해보니 '#' 문자는 쿼리에 아예 나타나지 않는데 해당 문자는 필터링되는 것 같다. 그렇다면 이를 URL Encoding으로 넣어보면 어떨까? '#'은 %23으로 인코딩된다.
어렵지 않게 클리어할 수 있었다.
기초 중의 기초인 맨 첫번째 문제기 때문에 별다른 지식 없이도 쉽게 풀 수 있었던 문제였다. 얼른 다음 문제를 풀어봐야겠다.
'챌린지 > los.rubiya.kr' 카테고리의 다른 글
Lord of SQLInjection - darkelf (0) | 2020.12.27 |
---|---|
Lord of SQLInjection - wolfman (0) | 2020.12.22 |
Lord of SQLInjection - orc (0) | 2020.12.19 |
Lord of SQLInjection - goblin (0) | 2020.12.17 |
Lord of SQLInjection - cobolt (0) | 2020.12.16 |