본문 바로가기

WHOIS/Web hacking

LoS Gremlin, Cobolt, Goblin 문제 풀이 및 보안 패치 방안

1. Gremlin

문제는 위와 같다. 쿼리문 실행 후 단순히 'id' 값이 조회가 가능하면 해결되는 문제이다. 다음과 같이 간단한 sql 공격문을 통해서 해결 할 수 있다.

 

간단히 설명하자면 id는 1이라는 의미 없는 값을 넣어준 뒤 pw에 '로 pw를 임의로 닫아준 후 or 1=1 식을 통해 조건을 그냥 true로 만들어 버린다. 이후 %23 주석문을 통해 뒤에 내용들을 전부 주석 처리 해서 실행하면,

 

다음과 같이 정상적으로 쿼리 실행 후 solve("gremlin")이 실행되어 문제가 풀린걸 확인 할 수 있다. %23을 통해 '를 주석 처리를 해주었기 때문에 쿼리문이 정상적으로 실행된 것이다.

 

----------------------------------------------------------------------------------------------------------------------

 

2. Cobolt

이번 문제는 쿼리문 실행 이후 'admin'이라는 id가 조회 되어야지 solve("cobolt")가 실행되어 풀리는 문제이다. 뒤에 pw는 md5함수를 한 번 거쳐서 들어가지만 그냥 저 부분은 무시하고 id에 "admin ' "으로 admin을 넣은 뒤 id를 임의로 닫아준 후 뒷 부분을 그냥 %23으로 주석 처리 해주면 풀리는 문제이다.

 

다음과 같이 작성 후 실행하면,

문제가 풀린것을 확인 할 수 있다. 그냥 and pw=md5('') 부분을 주석 처리해서 id='admin'만 실행하게 해서 간단하게 해결하였다.

 

----------------------------------------------------------------------------------------------------------------------

 

3. Goblin

 

이번 문제는 조오금 까다롭다. 이전 문제와 마찬가지로 'admin' 이라는 id 값이 조회되면 해결되는 문제이지만, preg_match 정규표현식 검사 함수로 인해서 ', " 를 못사용하기 때문에 'admin'을 못 사용한다. 그으러나

binary 인코딩을 통해 'admin'을 인코딩한 후 집어넣으면 우회가 슥~ 가능하다. 인코딩 사이트는 다음과 같다.

 

https://www.rapidtables.org/ko/convert/number/ascii-to-binary.html

 

이진 변환기 텍스트

이진 변환기 텍스트 ASCII / 유니 코드 텍스트 문자열을 입력 하고 변환 버튼을 누릅니다 (예 : "01000101 01111000 01100001 01101101 01110000 01101100 01100101"을 얻으려면 " 예" 를 입력 ) : 바이너리-텍스트 변환

www.rapidtables.org

위 사이트에서 인코딩을 진행하면 다음과 같은 값이 나온다.

 

 

이후 no에다가 터무니 없이 큰 값을 집어넣어 where id='guest' and no=10000000 부분을 다음과 같이 거짓으로 만든 다음 or id=0b0110000101100100011011010110100101101110 문을 통해 'admin'만 조회 시키면 해결 할 수 있다.

다음과 같이 문제가 풀린것을 확인 할 수 있다.

 

----------------------------------------------------------------------------------------------------------------------

취약점 패치 방안

1. 정규표현식 검사를 더욱 강화 한다 (임력값 검증)

     - 문제 2,3 번 같은 경우는 이미 정규표현식 검사를 통해서 악의적인 공격으로 사용할 수 있는 문자들을 사용하는 것을 차단하고 있다.           사실 사용자 입장에서 'admin' 이라는 특수한 계정을 조회할 일이 없기 때문에 'admin' 같은 문자열 검사를 추가하는 방법도 있을 것         이다. 그 외에도 'or'이나 %23 주석문등 sql 인젝션 공격으로 악용될 수 있는 input이 들어왔는지 검사를 통해 sql 인젝션 공격을 완           화 할 수 있을 것이다.

 

2. Prepared Statement 적용

   - 수업 시간에도 다루었던 것 처럼 Prepared Statement 방식을 적용해 고정된 sql 구문만을 사용하게 하는것도 완화 방법일것이다.