-
[L.O.S] Level 21 - iron_golemWargame/L.O.S 2022. 12. 9. 04:30반응형
Level 21 - iron_golem을 풀어보자.
새로운 공격 방법을 이용해야 하는 문제이다.
얼핏 보기에 코드에서 필터링하는 부분은 많이 없는 것 같다.
그런데, 앞의 Level들과는 달리 Blind SQL Injection을 하기 위해 출력을 보여주던 부분이 없다.
어떻게 해결해야 할까??

<iron_golem의 php 코드 내용> sleep과 benchmark 함수가 필터링되는 것을 보니, Time Based SQL Injection은 아닌 것 같다.
중간의 if문에 mysqli_error가 있으니, Error Based SQL Injection을 이용해 공격해보도록 하자.
우선 에러가 났을 때의 변화를 확인해보도록 하자.
pw 파라미터를 싱글쿼터(')로 닫았을 때 MySQL의 옳은 구문을 사용하라는 내용의 에러가 나타난다.
이것을 보니, Error Based SQL Injection을 이용한 공격이 맞는 것 같다.

<Error 출력> 우선 Column의 갯수를 구하기 위해 union select all 을 이용해 Column의 수를 입력하였다.
1에서만 참인 것으로 보아 column은 1개인 것으로 생각된다.
(왜 1개인 것일까를 생각해봤는데, 아마 pw에 관련된 Column만 있는 것 같다..)


<Column의 갯수 1개> 그런데, 이 과정 이후 문제가 있었다.
필터링 때문에 DB 명이나 Column 명 등을 구하기 위한 쿼리문을 작성할 수가 없다.
여기서 한참을 헤맨 끝에 sql에서 if 문을 활용해 Error를 일으켜 공격하는 방법을 찾았다.
(최대한 안 보려고 했지만, 결국 많은 블로그들을 찾아 다녔다.)
sql에서 if 문은 'if(조건문, 참, 거짓)'으로 표현이 된다.
이것을 이용해 if(pw 관련 조건문, Error 문, 0)과 같이 입력해 문제를 해결할 수 있다.
아래의 사진을 보면 조건이 참일 때 Error 문이 동작하고, 거짓일 때 일반 페이지가 나타난다.
여기서 Error 문은 Double 자료형의 범위를 넘는 값을 입력하는 것을 이용하였다.
(9e307 * N의 형식으로 입력하면 되는데, 왜 그보다 큰 9e123456... 등은 안되는지 모르겠다..)

<조건문이 참일 때 페이지> 
<조건문이 거짓일 때 페이지> 이것을 이용해 pw의 길이부터 알아보도록 하자.
다른 특별한 것은 없고, sql의 if 문을 잘 작성해주면 쉽게 코드를 만들 수 있다.
실행하면 pw의 길이로 32가 출력된다.

<pw의 길이 32> 다음으로 pw의 값을 알아보는데, 이번에도 코드가 복잡하지는 않다.
32 자나 되기 때문에 4개씩 끊어서 출력하였다.


<출력된 pw의 값> 출력된 비밀번호를 입력하면 IRON_GOLEM Clear!가 출력되며 문제가 해결된다.

<iron_golem 문제 완료> 이번 문제는 새로운 공격 방법이 나왔다고는 해도 관련 자료가 많이 있어 찾기가 쉽다.
그래서 기본 개념만을 알아내 해결을 하려고 했지만, 그러지 못했고 많은 블로그들을 참고하게 되었다.
생각을 더 많이 해야 한다.
반응형'Wargame > L.O.S' 카테고리의 다른 글
Level 23 - hell_fire (0) 2022.12.14 [L.O.S] Level 22 - dark_eyes (1) 2022.12.12 [L.O.S] Level 20 - dragon (0) 2022.12.08 [L.O.S] Level 19 - xavis (1) 2022.12.07 [L.O.S] Level 18 - nightmare (0) 2022.12.06