비록 아직까지는 Bandit 밖에 올리지 못했지만 Leviathan부터 해서 Over The Wire의 워게임 들을 도장깨기를 하고 싶어서 아예 Wargame 카테고리를 하나 만들어 풀이법을 포스팅하고 있다.
요즘은 SQL Injection을 공부하고 있는데, Lord of SQL Injection이라는 SQL Injection을 연습할 수 있는 워게임 사이트를 알게 되어 포스팅한다.
시작할 때 로그인을 하라고 하길래, '오? 시작부터 SQL Injection인가?'하고 admin' # 입력했다가 Hacking 하지 말라고 일침 당했다...ㅠ
join을 눌러 회원가입을 해준 후 로그인하면 목록이 뜬다.
Level 1은 Gremlin(기계에 고장을 일으킨다고 여겨지는 가상의 존재)이다.
풀이 방식이 쓰여 있지 않은 불친절한 사이트라서 처음 접속한 사람은 조금 난항을 겪을 수 있다. (그것은 바로 나의 얘기!)
[Level 1. Gremlin] Sol → ?id=' or 1=1#(' or 1=1%23)
gremlin에 들어가면 다음과 같은 php 코드가 뜬다.
코드를 살펴보니 $_GET[id]와 $_GET[pw]로 아이디와 패스워드를 받고 있다.
$_GET은 Url에서 파라미터로 값을 받아오는 기능이므로 url의 끝 부분에 ?id=''&pw="" 꼴로 입력해주면
위의 query 부분에 값이 들어간다.
코드를 살펴보면 preg_match는 첫 번째 인자에 넣어준 문자와 겹치는 값이 있는지 체크하는 함수이다.
id 값으로 prob / _ / . / \ 등이 들어가면 안 된다는 의미이다.
$query가 식별 - 인증 동시 코드이므로 값이 존재하기만 하면 로그인에 성공한다.
따라서 or 1 = 1 논리 기호와 주석을 사용하여 SQL Injection을 시도해주었다.
or 앞 뒤로 띄어쓰기를 제대로 해야 Clear를 받을 수 있고, 답은 여러 가지가 있을 수 있다.
url에서 #은 무시되기 때문에 #은 %23로 쳐주었고, '은 %27로 공백은 %20에 해당한다.
해결하면 다음과 같이 줄이 그어지고 다음 단계로 넘어갈 수 있다.
[Level 2. Cobolt] Sol → ?id=admin'# (admin'%23)
cobolt는 이론에서 정리했던 5가지 Case 중 식별 - 인증 동시 with Hash에 해당한다.
비밀번호가 Hashing 될 뿐이므로 1번과 동일하게 통과할 수 있다.
하지만 $result 밑에 조건문을 보면 id가 admin이어야 통과되므로 id에 admin을 넣고 뒤에는 주석 처리해준다.
[Level 3. Goblin] Sol → ?no=0 or no=2(?no=0 or id=0x61646D696E)
코드를 보면 id가 admin이어야 로그인이 가능한데 id가 guest로 고정되어 있다.
우선 출력이 어떻게 뜨나 보려고 no에 1을 넣어보았다.
Hello guest가 떴다.
(사실 코드를 분석했으면 알 수 있었지만) no에 2도 넣어보고 3도 넣어보다가 안 사실인데, 1이 아니면 Hello guest도 뜨지 않는다. 왜냐하면 id: guest, no: 1이 하나의 Set이기 때문이다.
여기서 두 가지 방식이 떠올랐다.
첫 번째는 no를 2(1이 아닌 값)로 주고 or id = 'admin'을 넣어 앞의 쿼리는 없는 쿼리로 만든 후 새로운 쿼리를 넣는 것이다. 근데 $_GET[no] 부분에 preg_match로 따옴표(')를 넣어두어서 따옴표를 사용할 수가 없기 때문에 이 방법은 안된다. (풀이법이 깔끔하게 받아들여지지 않아 찾아보니 admin을 16진수로 변환하면 따옴표 없이 문자열로 사용할 수 있어서 ?no = 0 or id = 0x61646D696E도 답이 된다.)
그래서 guest가 1번이면 admin이 0번이겠거니 하여 no=2 or no = 0으로 사실 admin의 no는 2였다.
그래서 no = 0 or no = 2로 해야 통과할 수 있다.
사실 admin의 no는 925일 수도 있으니 얻어걸린 것 같아서 찝찝하다.
'WarGames > SQL Injection' 카테고리의 다른 글
Lord of SQL Injection : Troll[8] ~ Vampire[9] (0) | 2021.11.29 |
---|---|
Lord of SQL Injection : Orge[7] (0) | 2021.11.24 |
Lord of SQL Injection : Darkelf[6] (0) | 2021.11.23 |
Lord of SQL Injection : Wolfman[5] (0) | 2021.11.22 |
Lord of SQL Injection : Orc[4] (0) | 2021.11.13 |
댓글