쉽고 깔끔하게
[LOS ; Lord of SQL Injection] 18번 nightmare 문제풀이 본문
문제
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
'WebHacking > LOS' 카테고리의 다른 글
[LOS ; Lord of SQL Injection] 17번 zombie_assasin 문제풀이 (0) | 2022.04.05 |
---|---|
[LOS ; Lord of SQL Injection] 16번 succubus 문제풀이 (0) | 2022.04.01 |
[LOS ; Lord of SQL Injection] 15번 assassin 문제풀이 (0) | 2022.03.31 |
[LOS ; Lord of SQL Injection] 14번 giant 문제풀이 (0) | 2022.03.30 |
[LOS ; Lord of SQL Injection] 13번 bugbear 문제풀이 (0) | 2022.03.28 |