본문 바로가기

Webhacking/LOS[Lord Of Sql injection]

[LOS 4번 : orc] 문제 풀이

728x90
반응형

LOS 4번 orc를 풀이해보도록 하겠습니다.

먼저 문제를 보면, 기존 1~3번의 일반적인 SQL Injection들과는 다른점을 볼 수있습니다.
바로, 빨간박스 부분입니다.

빨간 박스 부분을 간단히 해석해보면 아래와 같은 순서로 진행됩니다.

1. 사용자로부터 입력받은 pw 내 특수문자(', ", `, \)에 대하여 역슬래시를 앞에 붙인 뒤, 저장
2. 특수문자 처리를 끝낸 값을 쿼리에 넣어 실행
3. 쿼리 실행 결과 pw필드에 데이터가 조회되었으며, 이 조회된 값이 사용자의 입력값과 동일하다면, 문제가 풀림

여기서 핵심은 1번, 즉 특수문자를 처리하는 과정에 있습니다.
특수문자앞에 역슬래시가 붙으면서, 쿼터가 제 역할을 하지 못하고 문자처리가 되며, 이로인해 SQL Injection이 불가해집니다.

또한 3번을 보면, 실제 조회된 데이터와 입력한 데이터가 일치해야한다는 조건을 걸어, 인젝션 구문을 통해서는 인증우회가 불가하도록 설계해 두었습니다.

정리하면, 결국 이 문제는 일반적인 인증 우회가 아닌, 실제 PW를 추출해야하는 문제가 되겠습니다.

즉 이 문제는 참, 거짓에 대한 응답의 차이점만을 이용하여 한글자씩, 데이터를 추출하는 Blind SQL Injection 문제입니다.

그렇다면, 우선 참과 거짓을 어떻게 구별할 수 있는지를 알아봐야 합니다.

위 그림의 1번 박스와 같이 일반적인 SQL Injection구문을 넣어 참 값으로 인젝션을 시도하면, 
Hello admin이라는 값을 응답함을 알 수 있습니다.

하지만 위 그림처럼, 거짓인 값으로 인젝션 시, Hello admin이 나타나지 않음을 확인할 수 있습니다.
즉 Hello admin의 출력 여부를 통해 쿼리의 참/거짓을 판별할 수 있음을 알 수 있습니다.

그렇다면, 참/거짓을 구별할 수 있으니, PW를 추출해내면 되는데, 그전에 PW가 몇글자인지는 알아야, 추출에 효율적이기에 length() 함수를 통해 PW의 길이를 알아냅니다.
※ 여기서 and id='admin'을 넣어준 이유는, admin의 PW에 대해서만 비교를 수행하기 위함입니다.
※ length(필드명) : 원하는 필드의 데이터의 길이를 알아내는 역할

몇번의 노가다 끝에, 8글자임을 확인할 수 있었습니다.

이어, PW 추출을 시작합니다.
문자열 추출은 한번에 여러자를 추출하는 것보다, 한글자씩 추출하는 것이 효율적이기 때문에, substring 함수를 이용하여 1글자씩 추출을 시도합니다.
또한, substring만으로 추출 시, 대소문자에 대한 구별이 되지 않기에, ascii 함수를 이용하여 이를 ascii 코드로 변환하여 비교를 수행했습니다.
※ substring(필드명, 몇번째 글자부터, 몇글자를 자른다) : 원하는 필드의 데이터를 자르는 역할
※ ascii(문자 한글자) : 문자를 Ascii 코드값으로 바꾸어 줌)

결과적으로 첫번째 글자가, Ascii 코드 48 즉 문자로 '0' 임을 알아낼 수 있었습니다.

위와 같이 한글자씩 추출하는 작업을 수동으로 진행하면, 너무나 많은 수고가 필요하기에, 자동화 스크립트를 Python을 이용하여 작성했습니다.

8번 박스와 같이 user-agent(사용하는 브라우저에 대한 정보) 를 임의로 넣어주려 하는 이유는, los 사이트에서 python을 이용한 자동화 공격에 대하여 방어를 해두었기 때문입니다.
user-agent를 일반 브라우저인 것처럼 변경함으로써, 방어로직을 우회하였습니다.

정답이 추출된 이후 PW 파라미터에 값을 전달하여 orc clear!

혹시나, 제 글이 이상하거나, 이해가 안가시는 부분이 있으시다면 언제든지 댓글/이메일/쪽지 등의 방법으로 연락주세요

공감은 큰 힘이 됩니다!

728x90
반응형