-
[L.O.S] Level 4 - orcWargame/L.O.S 2022. 11. 30. 07:19반응형
Level 4 - orc를 풀어보자.
앞의 Level들 보다는 약간 더 높은 수준의 공격 기술이 필요하다.
이번에는 id 파라미터가 아닌 pw 파라미터에 값을 넣게 된다.
그리고 코드 사이가 띄워진 곳, 두 번째 문단이라고 한다면 그 곳의 첫 번째 줄에 addslashes 함수가 있다.
간단하게 addslashes 함수는 DB에 특수 문자를 넣을 때, 그 문자열에 역슬래시를 넣어 오류를 줄이는 함수이다.
코드 분석은 문제를 풀면서 필요한 부분만 해보도록 하자.

<orc의 php 코드 내용> 출력을 알아보기 위해 우선은 pw 값을 항상 참으로 만드는 sql문을 넣어 보았다.
Hello admin이 출력되는 것을 알 수 있다.
이것은 쿼리문의 id 값이 admin으로 고정되어 입력되는데, 이 값이 DB에 있다는 것을 의미한다.
첫 번째 문단은 해결을 한 것 같다.
두 번째 문단이 이번 Level의 진짜 문제라고 할 수 있다.
pw를 GET 방식으로 입력을 할 수 있는데, if 문을 보면 result의 pw와 GET의 pw가 같아야 문제가 해결된다.
그런데 GET 방식으로 입력을 할 때, 특수 문자는 addslashes에 의해 필터링된다.
즉, 문제 해결을 위해서는 DB에 저장되어 있는 admin의 pw를 GET 방식으로 정확하게 입력해야 한다.

<Hello admin 출력> 이 문제를 해결하기 위해 앞의 Level들과는 다른 새로운 공격방법이 필요하다.
SQL Injection을 방어하기 위한 기법들이 나타나면, 당연하게도 새로운 공격 기법이 나타난다.
SQL Injection도 다양한 공격 방법들로 분류되어 있고, 그 중 Blind SQL Injection을 사용하도록 하자.
유명한 공격 방법이므로 설명은 생략하고, 이번 Level에서 어떻게 사용되는지만 정리하자.
Hello admin이 pw가 참일 때 출력이 되므로, 출력의 유무로 참과 거짓을 알 수 있다.
우선 저장되어 있는 pw 값의 길이를 알아보도록 하자.
length 함수를 이용해 pw 값의 길이를 알 수 있다.
pw 값의 길이를 범위를 이용해 구하기 위해 10보다 작은 것으로 시작해 1씩 줄여 나갔다.

<pw 길이를 범위로 구하기> length(pw)<8에서 Hello admin이 출력이 되지 않아 8임을 알 수 있다.
확실하게 알기 위해 '='를 이용해 pw 값의 길이가 8임을 확정했다.

<pw의 길이 8> 다음으로는 pw의 정확한 값을 구해야 한다.
이것을 위해서 ascii, substr 함수를 이용할 수 있다.
함수의 사용법에 대해서는 설명을 생략하도록 한다.
또 반복 작업을 통해 문제를 해결할 수 있고 그렇게 했겠지만, 앞으로를 위해 코드를 작성하며 공부한다.
파이썬의 requests 모듈을 이용해 원하는 url(L.O.S - orc)에 직접 값을 입력해보도록 하자.
i의 for문은 비밀번호의 길이를, j의 for문은 각 i 번째 자리의 비밀번호 값을 입력한다.
cookie는 세션 ID를 입력하는데 딕셔너리 형식으로 입력해야 한다. (이걸 몰라 error 해결이 오래 걸렸다..)
코드는 간단하므로 많은 설명이 필요하지는 않은데, requests 모듈을 통해 GET 혹은 POST로 요청할 수 있다.
그리고 그 결과로 text나 content, json 등 원하는 형식으로 응답받을 수 있다.

<requests 모듈을 이용한 파이썬 코드> 그 결과로 각 자리마다 pw 값이 하나씩 출력되는 것을 알 수 있다.
원래라면 addslashes 함수가 있으니 특수 문자들은 필터링이 된다고 할 수 있다.
그런데 원활한 풀이를 위해 이번 Level에서는 pw에 특수 문자가 없을 것이라고 생각했다. (아직 낮은 Level)
코드 실행 결과 출력되는 pw 값에 특수 문자가 없는 것을 보고 생각이 맞았다는 것을 알았다.

<출력되는 pw의 값> 알아낸 pw의 값을 url의 pw 파라미터에 넣으니 Hello admin과 함께 ORC Clear!가 출력되었다.

<orc 문제 완료> 반응형'Wargame > L.O.S' 카테고리의 다른 글
[L.O.S] Level 6 - darkelf (0) 2022.12.01 [L.O.S] Level 5 - wolfman (1) 2022.11.30 [L.O.S] Level 3 - goblin (0) 2022.11.29 [L.O.S] Level 2 - cobolt (0) 2022.11.29 [L.O.S] Level 1 - gremlin (0) 2022.11.29