쉽고 깔끔하게

[LOS ; Lord of SQL Injection] 18번 nightmare 문제풀이 본문

WebHacking/LOS

[LOS ; Lord of SQL Injection] 18번 nightmare 문제풀이

찐무 2022. 4. 7. 16:59
728x90
반응형


문제

https://los.rubiya.kr/chall/nightmare_be1285a95aa20e8fa154cb977c37fee5.php


풀이

  • preg_match($pattern, $subject, [, $matches]) : 문자열 안에서 특정한 정규식 패턴의 존재 여부를 찾는데 유용한 함수

- $pattern : 문자열로 검색할 패턴

- $subject : 입력 문자열

- [$matches] : 사용 시 패턴에 매치되는 내용을 배열에 담아둠

 

따라서 얻을 수 있는 정보로는 id와 pw의 입력 값 필터링 규칙으로 다음과 같은 정보를 필터링한다는 것이다.

1) prob

2) _

3) .

4) ( )

5) #

6) -

 

또한 pw의 입력값의 길이가 6이 넘지 않아야 한다는 조건이 있다. (strlen())

 

이를 통해 알 수 있는 것으로는 6자 이내로 id!='admin'을 우회해야 한다는 것이다.

 

가장 먼저 MySQL의 주석에 대해 살펴보면 다음과 같다.

 

주석   설명
#   # 필터링으로 사용 불가
--   - 필터링으로 사용 불가
/**/   길이 초과로 사용 불가
;%00   MySQL은 쿼리를 읽을 때 NULL을 만나면 멈춤

 

pw의 입력값을 닫아주기 위해 ')를 사용하고, 맨 마지막에 주석 처리를 위해 ;%00를 사용해주고 나면 남는 2문자로 문제를 해결해야 한다. 길이 제한을 넘기지 않으면서 쿼리문을 참으로 만들기 위해서는 결국 pw의 값이 참이 되어야 한다.

 

SQL에서는 문자열을 숫자와 비교할 때 숫자 없이 문자로만 이루어진 문자열은 0으로 자동 형변환된다.

ex) 'abc' = 0 (true), '1abc' = 0 (false), '1abc' = 1 (true)

 

이러한 점들을 이용하여 SELECT id FROM prob_nightmare where pw('')=0이 되도록 작성하면 ('')=0이기 때문에 전체 쿼리문도 참이 된다.

 

결과적으로 쿼리문을 참으로 만들어주며, id!='admin'을 우회하기 위해 뒷부분을 모두 주석 처리해주면 다음과 같이 문제를 해결할 수 있다.

 

▶︎ pw=')=0;%00

728x90
반응형