━━━━ ◇ ━━━━
해킹/SuNiNaTaS 모의해킹

23. 써니나타스 (Suninatas) 23번 문제풀이 Write-up

728x90
반응형

써니나타스 모의해킹 사이트

https://suninatas.com/challenges

 

써니나타스

웹해킹, 포렌식, 리버싱, 암호학, 해킹 워게임 제공.

www.suninatas.com


이번에도 Blind Sql Injection 문제다. 앞에 Hard가 적힌걸 보니까 많이 어려울거 같다. 

하단에 보니 필터링된 문자열들을 볼 수 있었다. 

 

 

개발자도구모음을 보니 이번에도 admin의 비밀번호를 알아내는 것이다. 

그리고 admin이라는 문자열을 우회하라고 적혀있었다.

 

ID/PW에 guest를 입력하니 정상적으로 OK guest라는 문구가 출력된다. 

 

 

or과 and를 사용해서 기본적인 sql문을 입력하니 둘 다 OK guest 문구가 출력됐다. 이번에는 or과 and 둘 다 필터링 되진 않았나보다. 

 

먼저 admin이 필터링 됐다는 전제하에 admin을 갈라서 ad'+'min'으로 바꿔봤다.

ad'+'min' or 1 = 1-- 같은 경우는 guest로 로그인이 됐다. 필터링이 되지 않았을 뿐 기본적인 로그인은 guest로 잡혀있기 때문에 버리는 카드. 

ad'+'min' and 1 = 1-- 같은 경우는 admin으로 로그인이 됐다.

 

 

이번에는 22번과 마찬가지로 비밀번호의 길이를 알아보기 위해 ad'+'min' and len(pw) = 1 -- 구문을 만들어서 길이를 1씩 늘려가며 계속 테스트 했다. 개발자도구를 보면 비밀번호의 최대길이가 15 였기 때문에 15정도는 무난하게 그냥 손으로 직접 대입해보는 게 나아보였다. 길이가 12가 됐을 때 드디어 OK admin 메시지를 출력 받을 수 있었다. 

 

 

이제 substring으로 각 자릿수 마다 비밀번호만 알아내면 되는데 substring 함수가 필터링 돼있었다.

 

그래서 left함수로 진행하기로 했다.

left(string, count) → 두 인수를 입력받고 string문자열의 왼쪽부터 count만큼의 문자만 출력한다. 

string은 비밀번호, count는 length(1~12)가 된다. 

그러면 ad'+'min' and left(pw,자릿수)=' '-- 라는 구문을 만들어 낼 수 있다. 그렇게 파이썬으로 코드를 작성하고 진행해 봤는데 정작 알아낸 건 첫번째 자리의 비밀번호인 V만 알아낼 수 있었다. 

 

일단 ad'+'min' and left(pw,1)='V'--로 첫번째 자리가 V인지 재확인을 했고 OK admin을 출력받았다. 이제 뭐가 문젠지 파악을 해야한다. 

 

두 번째 자리 비밀번호를 알아내기 위해서 ad'+'min' and left(pw,2)='Va'--로 바꾸고 로그인을 시도 해봤는데 No hack 메시지가 출력됐다. 같은 구문인데 왜 필터링이 될까 생각을 하다가 ad'+'min' and left(pw,1) = 'V'-- 이런식으로 '=' 양 옆에 공백을 넣은 뒤 로그인 시도를 했더니 No hack 메시지가 출력됐다. 

이 말은 글자 수 제한이 걸려있다는 뜻이었다. 역시나 확인해보니 글자 수 제한 30이 있었다. 

 

 

고민을 조금 하다가 ad'+'min' and left(pw,1)='V'-- 에서 ' or left(pw,1)='V'--로 변형한 뒤 진행해봤다. 

일단 기본 틀은 SELECT * WHERE id = "" AND pw="" 형식이고,

ad'+'min' and left(pw,1)='V'-- 같은 경우는 SELECT * WHERE id = "" AND LEFT(pw, 자릿수)=''-- 형식이기 때문에 그냥 or을 넣어서 아이디가 틀려도 pw가 맞을 경우에 참이 나올 수 있게 만드는 것이 맞는 듯 했다. 

' or left(pw,1)='V'--SELECT * WHERE id = "" OR LEFT(pw, 자릿수)=''--

그렇게 진행을 해봤더니 OK admin이 출력됐다. 

 

 

' or left(pw, )=''-- 이렇게 진행을 했는데 9번째 자리까지만 출력되고 나머지는 출력되지 않았다. 10번째 자리로 넘어가는 순간부터 또 payload가 30글자가 넘어가나보다.. 그래서 함수중에 right함수도 곁들이기로 했다. 

 

right(string, count) ☞ 두 인수를 입력받고 string문자열의 오른쪽부터 count만큼의 문자만 출력한다. .

'or right(pw, 자릿수)=''-- 이런 형태가 될 듯 하다. 그리고 left함수는 왼쪽부터 오른쪽이었지만, right함수는 문자열을 추가할 때 오른쪽부터 왼쪽으로 추가한다는 것을 주의해야했다. 

 

 

아직은 파이썬을 공부하는 중이라 코드를 작성할 때 다른 풀이를 참고했다. 일단 이 코드에서는 left함수를 먼저 작성하고 그 후에 right함수 값을 받아와 연결해서 출력해주는 구조의 코딩이었다. 그렇게 인증키를 얻었다. 

 

 

처음에 대문자로 인증을 시도하다가 안돼서 그냥 소문자로 했더니 인증이 되었다. 이번 문제도 꽤 시간이 오래 걸렸다. 그래도 이 문제를 통해서 sql문과 left, right함수를 공부할 수 있어서 좋았다. 

 

 

문제 23번

 

성공

 

728x90
반응형
COMMENT