ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Lord of SQLInjection] #15 assassin
    [+] Security [+]/Lord of SQLInjection 2020. 5. 4. 03:54

     

    15번째 몬스터 어쌔신!

     

     

     

    pw는 '가 필터링 되어있어 추가적으로 쿼리를 끊거나 생성하는 것이 안되고,

     

    like연산자를 이용해 레코드를 조회하고 조회된 레코드의 id값을 출력 받아서 해당 레코드가 admin인지 아닌지 알 수 있다.

     

    간단한 부르트포싱 문제다!

    (브루트 포싱: 무차별 대입 공격)

     

    여기서 like 연산자를 잠깐 살펴보고 가자.

     

    like 는 기본적으로 = 과 똑같이 동작한다.

     

    하지만!

     

    like 연산자는 특별히 % 나 _ 같은 기호를 사용할 수 있다.

     

    %: 0개 이상의 모든 글자를 대체 가능

    _: 1개의 모든 글자를 대체 가능

     

    예를 들어 보자

     

    'admin' like '%'  => True

    'admin' like 'admi%' => True

    'admin' like 'a%n' => True

    'admin' like 'abd%' => False

    'admin' like 'admin%' => True!

     

    'admin' like '_ _ _ _ _' => True

    'admin' like '_ _ _' => False

    'admin' like 'a_mi_' => True

    'admin' like '_%' => True

     

    자 이제 풀이를 들어가 보면!

     

    우선 비밀번호의 길이를 알아내보자.

     

     

     

     

     

     

     

    Guest의 비밀번호가 8자리 임을 알 수 있다.

     

    그리고 _를 50개 입력해도 admin의 비밀번호를 찾을 수 없다.

     

    아마 Guest와 마찬가지로 admin의 비밀번호도 8자리 일 것이다. 아마도 그렇다.

     

     

    ㅇㅋ!!!

     

    이제 비밀번호를 알아내보자!

     

    이렇게 코드를 작성해 보았는데 픽! 하고 

     

     

    클리어 해버렸다.

     

    ??

     

    admin의 첫번째 비밀번호는 9다 

     

    그리고 guest의 첫번째 비밀번호 또한 9라서

     

    if "Hello admin' in bod 로 캐치를 못하다.

     

    if "Hello " in bod로 코드를 바꾸었다.

     

    그러니 

     

    guest의 비밀번호가 앞부분에 채워지며 비밀번호가 이어져 나가는데 중간에 픽! 하고 클리어 됬다.

     

    아마 guest비밀번호와 admin비밀번호의 앞부분은 동일하고 뒷부분에 차이가 있는데,

     

    '%' 때문에 admin 비밀번호의 일부분 만으로도 풀 수 있었는듯 하다!

     

     

    여튼!

     

    어쌔신 처치!1

    댓글

Designed by Tistory.