블로그를 만들자마자 전공 과제 폭탄을 맞아버려서 약 2주만에 글을 올리게 되었다.
웹해킹을 공부하는 사람이라면 대부분이 이 문제를 풀어봤을 것이다.
문제 살펴보기

문제에 풀이에 필요한 코드만 살펴보면 다음과 같다.
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 ~_~");
GET 방식으로 입력받은 id, pw 값에 'prob', '_', '.', '\' 중 어느 문자라도 존재할 경우 exit 함수를 호출한다.
테이블 이름과 주석을 보아하니 다른 테이블이나 데이터베이스에 대한 공격 방지를 위한 코드인 것 같다.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
...
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
'prob_gremlin' 테이블에 id='GET 방식으로 입력받은 id 값' and pw = 'GET 방식으로 입력받은 pw 값'인 행이 존재할 경우
solve 함수를 호출한다.
문제 풀이 과정
가장 간단하게 where 문을 우회할 수 있는 ' or 1#에 대한 필터링이 존재하지 않는다.
' or 1#을 id파라미터의 값으로 넣어주면 where문을 모두 참으로 만들고 이후 코드를 주석처리한다.
참고로 #은 php에서 주석을 의미하며, url을 통해 입력할 때 %23으로 url 인코딩을 해서 넣어주어야 값이 들어간다.
따라서 ?id=' or 1%23을 url에 추가적으로 입력하게 되면 문제가 풀릴 것이다.

페이로드 : ?id=' or 1%23
이 문제는 기초적인 지식만 있다면 누구나 풀 수 있을 정도로 매우 쉬운 문제였다.
풀이 방식이 다양하게 있겠지만 다른 풀이 과정으로 푸는건 다음에 하도록 하자...
'web > Lord of SQLInjection' 카테고리의 다른 글
| Lord of SQLInjection - 6번 : darkelf (1) | 2023.12.10 |
|---|---|
| Lord of SQLInjection - 5번 : wolfman (0) | 2023.12.10 |
| Lord of SQLInjection - 4번 : orc (0) | 2023.12.09 |
| Lord of SQLInjection - 3번 : goblin (0) | 2023.12.09 |
| Lord of SQLInjection - 2번 : cobolt (0) | 2023.12.08 |