필자는 리듬게임을 좋아한다. 매니악하게 빠져든 편은 아니지만 얼 불춤도 했고, 리듬 닥터도 했고, deemo나 Bullet per Minute 등 리듬이 들어가는 게임은 전반적으로 좋아한다. 리듬게임을 접해본 사람은 알겠지만, 보통 악몽 난이도는 게임의 끝판왕처럼 여겨지고는 한다. 우리는 벌써 SQL Injection의 nightmare까지 왔다. 자축하자.
코드
우선 다음과 같은 문자열이 필터링 된다. (통상 주석으로 사용되던 #과 -가 필터링된걸 보니, 이번에는 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문서나 주요한 함수의 사용법을 열심히 찾아보고 자신만의 실력으로 흡수하자. 누구나 모르는 것이 있는 법이다.
'WarGame > Lord of SQL Injection' 카테고리의 다른 글
[LOSI] Lord of SQL Injection Level 20 - dragon (0) | 2021.04.17 |
---|---|
[LOSI] Lord of SQL Injection Level 19 - xavis (0) | 2021.04.17 |
[LOSI] Lord of SQL Injection Level 17 - Zombie assasin (0) | 2021.04.17 |
[LOSI] Lord of SQL Injection Level 16 - Succubus (0) | 2021.04.17 |
[LOSI] Lord of SQL Injection Level 15 - assassin (0) | 2021.04.14 |