Code::War Game/los.rubiya.kr

[LOS] Lord of the SQL Injection - goblin

태군 코드 2022. 12. 29. 15:09
반응형

허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위입니다. 해킹을 시도할 때에 발생하는 법적인 책임은 그것을 행한 사용자에게 있다는 것을 명심하시기 바랍니다.

조금 더 구체적인 내용들은 [LOS] Lord of the SQL Injection - gremlin 문제를 풀면서 작성해 두었고, 빠진 부분이나 필요한 부분들에 대해서는 조금씩 추가하면서 작성 하도록 하겠습니다.

 

goblin

 

[LOS] Lord of the SQL Injection - goblin

preg_match : porb _ . ( ) 필터링이 되어 있고 i 옵션을 통하여 대소문자를 구분하지 않음 no='필터링값'이 있을 경우 "No Hack ~_~" 문구를 출력합니다.

 

preg_match : ' " ` 필터링이 되어 있고 i 옵션을 통하여 대소문자를 구분하지 않음 no='필터링값'이 있을 경우 "No Quotes ~_~" 문구를 출력합니다.

 

$query "select id from prob_goblin where id='guest' and no={$_GET[no]}";

쿼리문에서는 id 값은 'guest'로 고정되어 있고, no 변수에 입력되는 값만 GET으로 넘겨주는 것을 알 수 있습니다.

 

if($result['id']) echo "<h2>Hello {$result[id]}</h2>"
if(
$result['id'] == 'admin'solve("goblin");

검색된 쿼리 결과를 통하여 조건이 맞을 경우 id 값을 반환해 주고 있으며, 최종적으로 id가 'admin'일 경우 문제가 해결되는 것을 알 수 있습니다.

 

no=1 값 입력

아무 생각 없이 no 변수에 1을 입력하였더니 Hello guest 문구가 출력되는 것을 확인할 수 있었습니다. 즉 id가 'guest'일 경우 no의 값은 1이라는 것을 알 수 있습니다.

 

조금 더 이해하기 쉽게 비박스 데이터 베이스를 통하여 예시를 들어 보도록 하겠습니다.

 

bWAPP DB

bWAPP DB로 예를 들어 보면 여기서 bWAPP의 login 값은 LOS의 id, bWAPP id 값은 LOS의 no로 생각하시면 조금 더 이해가 되실 거라고 생각됩니다.

 

반응형

 

그럼 다시 문제로 돌아와서 id='guest' and no=1이라는 것을 알았습니다. 그렇다면 'admin'도 다른 no값을 가지고 있다는 것을 추측할 수 있습니다.

 

?no=0 OR no=2

select id from prob_goblin where id='guest' and no=0 OR no=2

연산은 and 연산부터 수행되기 때문에 id='guest'이고 no=0은 거짓이기 때문에 OR 연산을 수행하여 no=2의 값을 출력하게 됩니다. 즉 'admin'의 no 값은 2가 되게 됩니다.

 

bWAPP DB

bWAPP DB로 예시를 들어 보겠습니다.

 

select login, id from heroes where login='neo' and id=1;

heroes 테이블의 login, id 컬럼에서 login='neo' and id=1 값의 결과를 출력합니다.

 

select login, id from heroes where login='neo' and id=0 or id=2;

heroes 테이블의 login, id 컬럼에서 login='neo' and id=0 값을 출력하였으나 조건에 맞지 않아 or 조건을 통하여 id=2의 값을 출력합니다.

 

해당 문제에서는 ' " ` 필터링이 되어 문자를 입력하지 못하게 막고 있지만, char, hex, binary를 통하여 문자를 입력할 수도 있습니다.

 

10진수 - char(97,100,109,105,110)

16진수 - 0x61646D696E (16진수는 앞에 0x를 표기하여 줍니다.)

2진수 - 0b0110000101100100011011010110100101101110

 

char를 이용하여 admin을 출력하였습니다. 이처럼 필터링된 문자열을 우회할 수 있는 방법도 있으니 참고하여 직접 테스트를 해보시기를 추천드립니다.

 

참고

https://ko.wikipedia.org/wiki/ASCII#%EC%B6%9C%EB%A0%A5_%EA%B0%80%EB%8A%A5_%EC%95%84%EC%8A%A4%ED%82%A4_%EB%AC%B8%EC%9E%90%ED%91%9C

 

반응형