드디어 Suninatas Web 부분 마지막 문제이다.

들어가니 Hard Blind Sql Injection 이라고 나오고 22번과는 달리 admin 또한 Filtering 되어 있다.


이번에는 힌트로 22번 내용에 추가적으로 admin 을 우회하라고 나와있다.

뭔가 업그레이드 된 22번의 느낌이다.

일단 guest / guest 로 로그인 해봤다.

22번과 마찬가지로 OK guest 라고 나온다.

물론 다른 ID 나 잘못된 PW 를 입력하면 False 가 나온다.

한 번 아래와 같이 Query 문을 작성해봤다.

기본적으로 로그인 되는 건 guest 인 것 같다.

admin 을 입력해서 로그인 해보니

No hack 이라고 나온다.

그래서 힌트대로 admin 이라는 문자열을 우회하기 위해 다음과 같이 자르고 쿼리문을 작성해봤다.

admin 으로 로그인 되어 OK admin 이라고 나온다.

지금 생각해보면 ad'+'min" -- 로 하나 ad'+'min' and 1=1 -- 로 하나 똑같은 데

이때는 SQL Injection 이라는 것을 처음 접해본때라 뭣도 모르고 이렇게 적은 것 같다.

아무튼 길이를 찾으려고 len 함수를 통해 찾아보니 PW 의 길이로 12가 나왔다.

여기서 왜인지는 모르겠는데 막혔다고 생각해서 풀이를 찾아보니 PW 의 첫글자가 v 라고 한다.

그래서 입력해봤는데 v 가 맞았다.



이대로 코드를 통해 돌려봤는데 v 이후로 No Hack! 이 나온다.

다른 함수를 사용해보려고 mid 함수를 사용해봤다.

위와 같이 No hack 이라고 나온다.

뭐가 문제지 싶어하다가 쿼리문의 길이가 문제인가 싶어서 aaaaaaa 이런식으로 길이를 체크해봤다.

31글자 이상이면 No hack 이 나왔다.

 left 함수는 left(string,length) 와 같이 사용하는데 string 을 왼쪽부터 length 만큼 잘라오라는 뜻인데,

이대로 코드를 작성하니 31글자 이상이 될 때부터 No hack 이 나온 것이였다.


그래서 left 함수와 right 함수를 이용해서 31글자가 안 되게 쿼리문을 작성해서 1글자씩 읽어오도록 했다.

해봤는데 false 가 나와서 ?? 해봤지만 일단 다른분들 풀이가 이렇게 하라길래 이대로 코드를 작성해봤다.



이 코드의 결과로 아래가 나온건지는 잘 모르겠지만 이상하게 암호가 나온다.

( 이유에 대해서는 밑에서 설명하도록 하겠다. )



당연히 암호가 아니다.

다른 방식으로 성공 확인을 하기로 했다.



이 태그를 통해 성공 여부를 확인하도록 코드를 작성했다.



성공했다.


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


이게 푼 지 한 일주일 정도 되는 문제이다.

지금 생각해보면 반은 수치스럽고, 반은 한심하게 풀었던 문제라고 생각한다.

솔직히 이걸 풀었다고 할 수 있을지도 의심이 간다.


물론 이런식으로 해결해서 SQL injection 에 대한 이해가 가능했지만

뭔가 맛있는 아이스크림을 먹으려고 하는데 맛을 느끼기도 전에 배속에 들어가있는 느낌이다.


위의 오류들과 확인해야 될 부분에 대해 하나 하나 확인해보도록 하자.

우선 위에서는 풀이를 보고 바로 left 함수를 사용했는데 

사실 우선적으로 생각할 수 있는 접근 방법은 mid 함수라고 생각한다.


그래서 mid 함수를 사용해보았다.

이 결과는 false 로 출력되었다. 아까 말했듯이 기본적으로 guest 로 로그인 되는건가 싶어서 admin 을 붙여보았다.

글자 수가 30자를 초과해 No hack! 이 출력된다.

기본적으로 guest 로 로그인 된다면 guest 의 PW 의 첫글자 g 로 인식되는건가 싶어서 g 로 입력해보았다.

마찬가지로 False 값이 나왔다.


그래서 찾아보니 이 문제에 사용된 DB 는 MsSQL 로 mid() function 을 지원하지 않는다고 한다.

이렇게 left, right 함수를 사용해야 된다는 것을 유추해 볼 수 있다.

그리고 이 쿼리문이 false 값으로 출력된다고 위에서 말했는데 괄호 닫기 < ) > 를 하지 않아 오류가 난 것이였다.

정상적으로 실행된다면 아래와 같이 admin 으로 로그인이 된다.

이러한 유도 과정을 통해 충분히 위에 올린 코드를 실행해 볼 수 있었고

실행했을 때 나온 아래와 같은 오류는 아까 말한 기본적으로 인식되는 게 guest 라는 것이 문제가 되는 게 아닐까 싶었다. 



guest 또한 로그인이 되면 OK 라는 사인이 나오게 되니 충분히 시도해 볼만 하다고 생각했다.

그래서 아래와 같은 쿼리문을 입력했다.

내 추론이 맞았다.

이렇게만 입력하면 false 값이 나오는데 'or left(right(pw,12),1)='g' -- 를 통해 guest 로 로그인 되는 걸 보면

OK 만 보기 때문에 guest 의 암호또한 불러오는 걸로 생각했다.

guest 의 암호는 guest 인데 오른쪽에서 12글자를 가져오게 되어

gggggggguest 이런식으로 저장되서 섞여 나오는 게 아닐까 생각했다.


이를 통해 생각해보니 기본적으로 guest 로 설정되는 것이 아니라 조건에 맞는 것으로 되는 것 같다.


아래와 같을 때 guest 로 나온다는 것때문에 오해했었는데 

학교 보안 스터디 형이 우선순위가 있을 수 있다고 하셔서 이해가 되었다.

아무튼 gggggggguest 로 설정되는 지 찾아보려고 해당 문제에서 아래와 같은 쿼리문을 입력해보았다.

그런데 글자수 제한때문에 No hack 이 출력된다.


이와 같은 문제는 MsSQL 의 right() function 처리 방식에 따라 달라지는 것 같은데 어떻게 처리되는지는 잘 모르겠다.


이 문제에 대해 드는 의문을 한 페이지에 정리해서 이미지로 첨부하며 이 글을 마치도록 하겠다.


P.S

코드를 작성하면 바로 저장하고, 문제를 풀면 바로바로 풀이하자.

일주일 전에 풀고 코드도 한 페이지에서 작성하면서 지워버리니까 어떻게 풀었는지 생각도 안 나고 이후 수정도 힘들다.

그 때 풀이하며 메모하던 걸 보면서 겨우겨우 쓰기는 했는데 복잡한 문제일수록 바로바로 풀어야 될 것 같다.

'Hacking > Web Hacking' 카테고리의 다른 글

Webhacking.kr 24번 문제  (0) 2018.09.21
Webhacking.kr 5번 문제  (0) 2018.09.21
Suninatas 22번 문제  (0) 2018.09.20
Webhacking.kr 3번 문제  (0) 2018.09.18
Webhacking.kr 14번 문제  (0) 2018.09.18