[Solved in under 3 minutes]
금일 프로젝트가 모두 완성됐다.
기쁨의 뒹굴뒹굴하다가 아! velog! 생각나서 워게임 문제 풀러왔다.
여러가지의 문제를 풀어보기 위해 오늘은 SQLI 문제만 있기로 유명한
LoS(Load of SQLInjeciton) 문제를 풀기로 했다.
바로 시작해보자.

<?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__);
?>
SQL Injection의 가장 기본적인 문제이다.
여기서 중요하게 봐야 할 부분은 preg_match 함수이다.
php에서 제공하는 정규표현식관련 함수인데 해당부분에 패턴과 문자열이 존재하면 exit을 반환한다 이런말이다.
또한, 데이터를 GET으로 받기때문에 URL에 ?id= 형식으로 데이터를 전송 할 수 있다.
파라미터를 $_GET[id], $_GET[pw]로 받는것도 알아두자.
마지막으로 id값을 받으면 문제가 풀린다 대충 이런 말이다.
즉, 로그인만 하면 문제가 풀린다.

preg_match 함수를 통해 특정 문자열을 삽입하면 No Hack 이라고 친절하게 알려준다.

php?id=guest 를 입력 했을 시 파라미터가 제대로 입력된 것이 보인다.
자 그럼 생각을 해보자 pw가 뭔지 모르는데 어떻게 저걸 로그인하냐? 이건데
모두가 흔히 알고 있는 ' or '1'='1 이거다 왜 이런 구조인지 알아야한다.
Password가 1234라고 가정하자.
당연히 1234를 넣으면 되겠지만 공격자 입장에서는 전혀 모른다.
pw='12345' 라고 입력한다면 당연히 틀렸다고 하겠지만 여기서 SQLI의 논리 연산자인 OR, AND를 이용한다면 말이 달라진다.
예를들어, pw='12345' or '1'='1' 이라고 가정하자 12345는 당연히 틀렸으니 넘기고 이후 '1'='1' 항상 참인 값을 반환하여 or를 통해 후자의 논리를 맞다고 반환 하는것이다.
그로인해 결국 참으로 인식하여 로그인을 성공하게 되는 원리이다.
그럼 한번 삽입해보자.

?id=guest&pw=12345
를 넣으니 당연히 로그인을 할 수 없다.
자 그럼 논리 연산자인 or를 추가하여 후자인부분을 항상 참으로 만들어보자.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
?id=guest&pw=12345' or '1'='1
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
를 삽입하였더니 쿼리가 알맞게 들어가 문제가 풀렸다.
누군가는 이런 궁금증이 생길 수도있다.
or '1'='1' 이 맞다면서 왜 or '1'='1 으로 넣었냐 뒤에 작은 따옴표는 왜 없나요?
라고 생각 할 수 있다.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
그 것은 이 부분을 제대로 확인해보자.
'{$_GET[pw]}' 자 유심히 봐라.
pw 파라미터 를 받는 쿼리부분이 자체적으로 ''가 들어 있기 떄문에
만약에 인위적으로 작은따옴표를 넣어주지 않는다면
pw='12345 or '1'='1'' 이런 형식이 될 것이다.
따라서, pw=12345' << ' 로 닫아주고 이후 or '1'='1 << 에서 ' 를 사용안하면
쿼리에서는 pw='12345' or '1'='1' 로 인식하는것이다.
공부 열심히 하자.
LoS(Lord of SQL Injection) Gremlin Write-up
이상 보고 끝!
멋있는 풀이네요... 많이 배워갑니다~