LOS링크 : https://los.eagle-jump.org/
오늘 풀어볼 문제는 2단계 Cobolt다.
답 보기 링크↓
패스워드에 'or 1=1#을 사용해도 id가 admin으로 우회되지 않는다.
따라서 주석을 이용해 쿼리문에서 패스워드에 대한 쿼리를 아예 무시해버리는 방법을 택한다.
여기서 주의해야 될 점이 있다.
바로 주석을 파라미터로 받아오는 값을 싱글쿼터를 닫고 사용해야한다는 점이다.
(id='admin'#') 이런식으로 말이다.
싱글쿼터를 닫지 않고 실행한 결과를 확인해보도록 하겠다.

아무런 반응도 일어나지 않는다.
#을 문자열로 취급해버리기 때문에 주석의 기능을 하지 못하게 된다.
그러면 파라미터로 받아오는 문자열을 닫고 주석을 사용해보자.

Cobolt Clear!
바로 코드를 살펴보자.
데이터베이스 쿼리문이다.
GET방식으로 id와 pw를 받아온다.
여기서 pw는 md5 알고리즘의 암호화가 적용된다.
md5는 임의의 길이의 메시지를 입력받아, 128비트짜리 고정 길이의 출력값을 내는 암호화 해시함수다.
해시함수는 일방향암호로 암호화를 적용할 경우 암호화에 대한 복호화가 불가능한 것을 의미한다.
다음 코드는 if조건문에 대한 코드로
이 조건문을 만족하게 되면 문제가 해결된다는 것으로 보인다.
조건문은 쿼리문 실행 결과의 값인 GET방식으로 받아온 id가 admin과 같다면 cobolt문제가 해결된다.
과연 그럴까?
사진을 보게 되면 if조건문 코드와 달리 id에 대한 값 일치만 이루어지는게 아니라 pw에 대한 값 일치도 수행한다고 추측할 수 있다.
출제자가 만약 pw 값 일치 코드도 넣었다면 admin에 대한 pw를 코드로 확인할 수 있어 누구나 풀 수 있는 문제가 된다.
즉, pw값 일치 코드는 출제자의 의도에 의해 숨겨진 것이라고 생각한다.
이어서 if조건문과 연결되는 else if조건문 코드다.
위의 조건문이 만족하지 않을 시(id가 admin이 아닐 시) else if조건문 조건에 대한 코드를 실행한다.
else if조건문을 실행하기 위해서는 id와 그에 맞는 정확한 pw를 입력해야하기에 다음 쿼리문으로 실행했다.
그렇다면 답을 추측해 볼 수 있게 된다.
그결과는 어떻게 나올까?
전 쿼리문의 결과와 다를께 없어 보인다.
지금부터 그 이유를 설명하겠다.
결론부터 말하자면 '' or 1=1# 코드에 의한 결과라고 할 수 있다.
간단하게 설명하기 위해 비박스를 사용한다.
먼저 Iron Man을 검색하고 Iron Man 검색 요청에 대한 패킷을 Proxy tool을 이용하여 잡아보았다.
proxy tool을 통해 title로 검색 값을 입력받는다는 사실을 알 수 있다. (GET방식이라 URL로도 확인 가능)
조금 더 쉽게 보기 위해 데이터베이스를 통해 살펴보겠다.
데이터베이스에서 Iron Man을 검색하는 쿼리문을 실행한 결과다.
이제 대망의 하이라이트라고 할 수 있다.
바로 ' or 1=1#을 입력해보자.(주석은 뒤에 쿼리문이 따로 없어서 생략했다.)
Iron Man외에 모든 영화와 정보들이 출력되는 것을 확인 할 수 있다.
이러한 이유는 ' or 1=1#을 쿼리문에서 참(true)이라는 값으로 인식하기 때문이다.
또한 title이 Iron Man인 영화를 검색했지만 맨 처음 오는 레코드는 G. I. Joe 영화에 관한 정보다.
이러한 사실을 통해 문제에서 id와 pw에 관한 데이터베이스 구조를 다음과 같이 추측할 수 있다.
no | id | pw |
1 | rubiya | ? |
2 | admin | ? |
' or 1=1#에 의해 데이터베이스(정확히 말하자면 id와 pw에 대한 정보가 들어있는 테이블) 내에 모든 데이터를 가져오면서 데이터베이스에 가장 처음에 위치한 rubiya에 대한 정보가 먼저 $result['id']에 들어가게 된다.
이로 인해 조금전에 url로 id에 1234와 admin의 값을 받아 왔음에도 불구하고
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Hello 1234 | Hello admin |
| You are not admin :( | You are not admin :( |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
의 문구가 출력되지 않은것이다.
'LOS 풀이' 카테고리의 다른 글
[Lord Of SQL injection] LOS 1단계 - Gremlin 코드 분석 및 문제풀이 (1) | 2019.10.29 |
---|