목록정보보안/웹 해킹 문제 (10)
훈훈훈
먼저 쿼리를 살펴보면 pw 다음에 and 1=0 (항상 거짓) 이 있는 것을 확인할 수 있다.그다음 소스코드를 살펴보면 특별한 조건은 찾을 수 없다.다만 if($result['id'] == 'admin') 조건을 만족할때 문제가 풀리는 것을 알 수 있다. 먼저 패스워드에 임의의 값을 넣어다음 쿼리 반응을 살펴보았다.다음과 같이 패스워드에 정상적으로 값이 삽입된것을 알 수 있다. 이제 문제를 풀려면 어떻게 해야될까??? 1. 패스워드엔 임의의 값을 삽입하자.2. 이제 'admin' 계정을 || 연산자와 같이 삽입하자3. 1=0은 항상 거짓이므로 주석처리시키자. ?pw= ' || id='admin'%23 을 삽입했을때 다음과 같이 클리어 메시지를 확인할 수 있다.
먼저 소스코드를 살펴보면 다음과 같은 힌트를 확인할 수 있다. 1. $_GET[id] = str_replace("admin","".$_GET[id]); => "admin" 글자를 ""으로 replace 하고 있다.2. if($result['id'] == 'admin') => id == admin 조건을 만족해야 한다. 이제 문제를 어떻게 해결할지 고민해보자. 1. str_replace( ) 함수로 "admin" 을 필터링 하고 있다.2. 따라서 두 가지 솔루션을 생각했다.3. "admin" 대신 "ADMIN"을 입력하는 것이다. (하지만 이 솔루션은 8번 Troll 문제와 같기 때문에 사용하지 않았다.)4. "admin" 문자를 ""으로 치환 시 우회 방법을 고민해보자5. 만약 "adadminmin" 으..
먼저 소스코드를 살펴보자 그러면 다음과 같은 정보를 확인할 수 있다. 1. if(@erge("admin",$_GET[id])) => 'admin' 을 필터링 하고 있다.2. if($result['id'] == 'admin') => id == 'admin' 조건을 만족시켜야 한다. 이제 문제를 어떻게 접근할지 생각해보자. 1. erge( ) 함수에 의해 'admin'을 사용할 수 없다.2. 그러나 erge( )함수는 대소문자를 구별한다.3. 따라서 'admin' 대신 'ADMIN'을 입력을 한다. ?id=ADMIN 을 입력하면 다음과 같이 클리어 메세지를 확인할 수 있다.
먼저 코드를 살펴보면 다음과 같은 정보를 얻을 수 있다. 1. if(preg_match('/or|and/i', $GET[pw])) => 'or' 와 'and'를 필터링하고 있다. 2. $_GET[pw] = addslashes($_GET[pw]) => addslahes( ) 함수를 사용함으로서 싱글쿼터를 사용할 수 없다. 3. if(($result['pw']) && ($result['pw'] == $_GET['pw'])) => GET 방식으로 입력 받은 pw 값이 admin과 같아야 한다. 이제 문제를 어떻게 해결할지 생각해보자. 1. 'or' 그리고 'and'는 필터링을 하고 있기 때문에 우회할 방법을 찾아야한다.2. 문제에서 addslahes( ) 함수를 사용하고 있다.3. 따러서 Blind SQL i..
먼저 코드를 살펴보면 다음과 같은 정보를 알 수 있다. 1. if(preg_match('/or|and/i', $GET[pw])) => 'or' 과 'and'를 필터링하고 있다.2. if($result['id'] == 'admin') => id='admin' 을 만족해야한다. 이제 문제를 어떻게 풀지 고민해보자 1. 'or' 과 'and'를 필터링 하기 때문에 우회할 방법이 필요하다.2. 'or' = || , 'and' = &&로 우회하자.3. 'or' 를 우회한 다음 id = 'admin'을 삽입하자. pw='||id='admin'%23 을 입력했을 때 다음과 같이 "클리어 메세지"를 확인할 수 있다.
먼저 코드를 보고 정보를 뽑아보자. 1. if(preg_math('/ /i', $GET[pw])) => 공백 필터링2. if($result['id'] == 'admin') => "id = admin" 이 되어야 한다. 이제 문제를 어떻게 해결할지 생각해보자. 쿼리를 보면 where id = 'guest' 인 것을 확인 할 수 있다. 따라서 이 부분을 False 시키고 id = 'admin' 을 삽입시켜야 한다. 그다음 공백 필터링에 대해 고민해 봐야한다. 공백 필터링을 하기 위해서는 어떻게 해야할까?? 여기에 공백 필터링을 우회 할 수 있는 기호를 몇 가지 정리해 보았다. - %09 : TAB - %0a : \n - %0d : \r - 주석 : /**/ - 괄호 : () 필자는 %09(TAB)을 이용하여..
먼저 쿼리를 살펴보자.id는 admin으로 전달 받고 pw는 사용자 입력으로 전달되는 것을 알 수 있다. 이제 코드를 살펴보자. 1. 3번 문제와는 다르게 싱글쿼터, 더블쿼터, 백퀘터에 대한 필터링은 존재하지 않는다. 2. $_GET[pw] = addslahes($_GET[pw]); : addslashes( )함수 이용 => pw 우회 불가 3. if($result['id'] == 'admin') solve("goblin"); : 입력 받은 pw와 데이터베이스에 저장된 admin의 pw가 같아야 한다. 따라서 이번문제는 "Blind SQL injection"을 이용해서 문제를 풀어야 한다. 먼저 데이터베이스에 저장된 admin의 pw 문자의 길이를 알기 위해 length( )함수를 이용해 pw의 길이를 ..
쿼리와 코드를 살펴보자.쿼리를 보면 id는 guest 값이 전달 되어있고 no에 값을 전달해야되는 것을 볼 수있다. 이제 코드를 살펴보자 1. if(preg_match('/\ |\"|\`/i', $GET[no])) => 싱글 쿼터( ' ) 더블 쿼터( " ) 백 쿼터( ` )를 필터링 하고 있다. 2. if($result['id'] == 'admin') solve("goblin") => id=admin 일 때 문제를 풀 수 있다. 임의로 no에 1 값을 넣었을 때 어떤 반응이 나오는지 확인을 해보았다."Hello guest"라는 문자열이 출력된 것을 통해 no=1은 guest인 것을 확인할 수 있다. 이제 문제를 어떻게 해결할지 고민을 해보자. 1. id = admin 이어야된다. 2. 싱글쿼터 더블쿼터..