WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 18 - Nightmare

필자는 리듬게임을 좋아한다. 매니악하게 빠져든 편은 아니지만 얼 불춤도 했고, 리듬 닥터도 했고, deemo나 Bullet per Minute 등 리듬이 들어가는 게임은 전반적으로 좋아한다. 리듬게임을 접해본 사람은 알겠지만, 보통 악몽 난이도는 게임의 끝판왕처럼 여겨지고는 한다. 우리는 벌써 SQL Injection의 nightmare까지 왔다. 자축하자.

 

<출처 : 몬스터위키 https://monster.fandom.com/wiki/Nightmare_(Dungeons_%26_Dragons) >

 


코드 

우선 다음과 같은 문자열이 필터링 된다. (통상 주석으로 사용되던 #과 -가 필터링된걸 보니, 이번에는 query끝에 무슨 짓을 한 것이 틀림없다.)

prob,  언더바(_), 점(.), 역슬래쉬(\), 샵(#), 대시(-)

추가로 strlen()함수를 이용해서  pw에 넣을 수 있는 값을 6자리로 제한하고 있다.

 

query는 직관적이다ㅓ. pw를 소괄호(())로 묶고, id!=admin을 가져오도록 하는 query이다. 색다른 접근 방법이 필요하다.

 


해결방법

 

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=%27)=0;%00

 

우선 6단어 안에 콤팩트한 파라미터를 전송해야 되니, 한문자 한문자 신경 써서 적어야 한다. 처음으로 선택한 문자와 두 번째로 선택한 문자인 %27와 )는  pw=('')를 만들어 주기 위한 작업이다. 다음으로 선정한 =0이라는 두 문자는 다음과 같은 사전 지식이 필요하다.

DB query문은 등호계산이 우측부터 이루어진다.

이에 따라 ('')=0은 True가 된다.

 

또한 주석을 만드는 색다른 방법으로 끝에 NULL문자(\00)를 넣어줌으로 그 Query문을 끝내버리는 방법을 채용했다. (왜 문자열 끝에는 \00 있지 않는가. 문법적으로 끝을 의미하는 것도 NULL의 역할이다.)

 


축하한다. 사실 필자는 이 문제에서 애를 조금 먹은 기억이 난다. 쿼리를 만드는 건 감이 왔는데, 6자리 이하로 맞추는 것이 정신 나가는 줄 알았다. msdn문서나 주요한 함수의 사용법을 열심히 찾아보고 자신만의 실력으로 흡수하자. 누구나 모르는 것이 있는 법이다.