반응형

와.. 삽질하면서 깨달은 점을 적는다..



문제는 이러하다.


싱글쿼터도 되는데 왜 안된다고 생각을 했는지 모르겠지만..


일단 진행한 순서대로 서술해보자.


일단 blind sql injection을 진행해야 할 때 데이터 일치 여부에 따라 화면에 출력되는 부분이 없다면 time based sql Injection을 진행해야 한다.



따라서 id부분에 아래와 같이 작성하였다.

id=' || length(id)>9 %26%26 sleep(2)#&pw=1


= 가 필터링 되어 있어 >를 이용하여 길이를 구해주었고 or과 and가 필터링 되어 있어 ||와 &&를 사용하였다.


그 후 각 id 값을 구할 땐 아래와 같이 진행하여 찾았다.

id=' || right(left(id,1),1)>0x71 %26%26 sleep(2)#&pw=1


그래서 ID를 잘 찾았다!

그 결과는 sup3rADM2N


여기서 삽질을 했던 것이 있는데 hex라는 것을 잊고 49 다음에 50으로 넘어 M과 N을 둘다 50이라고 착각해서 시간을 낭비했다 ㅠㅠ


이건 잠깐의 실수라고 해서 넘어갈 수 있다.. 그런데 나중에 큰 멘붕이 온다..


ID를 찾았겠다! 이제 PW를 찾기 시작했다.

일단 아래의 쿼리를 입력하여 PW의 길이를 찾았다.

id=sup3rADM2N' %26%26 length(pw)>B %26%26 sleep(2)#&pw=1


총 12자인 것을 확인 후 아래와 같은 방식을 이용하여 PW를 찾았다.

id=sup3rADM2N' %26%26 right(left(pw,1,1))>0x4A %26%26 sleep(2)#&pw=1


그래서 결과적으로 pw를 찾았다.

그 결과는 KKKBANGS2R1S 이다.


다 찾았다~ 해서 id에 sup3rADM2N를 넣고 pw에 KKKBANGS2R1S를 넣고 로그인을 시도했는데 응?? 해결이 안된다.


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

나중에 알게 된 사실인데..

문자의 경우 hex 값으로 비교를 진행하면 소문자라도 대문자의 hex값으로 일치한다고 뜬다..


아래의 두 사진을 보자.


아래의 사진은 Name 중 3번째 문자가 'j'로 hex 값으로 0x6A라서 where 절에 넣었을 때 제대로 출력되는 것을 볼 수 있다.


그런데 동일한 문자('j')를 대문자 J의 hex 값인 0x4A로 했을 때도 일치하다고 뜨는 것을 볼 수 있다.


이렇기 때문에 blind sql injection을 진행하면 항상 대문자로 나와 대소문자를 따지는 로그인이 진행되지 않은 것이다.


이를 해결하기 위해 난 아래의 방법을 사용할 것이다.


id=sup3rADM2N' %26%26 cast(hex(right(left(pw,12),1)) as unsigned) > 73 %26%26 sleep(2) & pw=1


위의 쿼리를 이용한 것은 hex 함수로 해당 문자를 hex값으로 출력시킨 뒤 cast 함수를 이용하여 숫자형으로 변경 시켜준 것이다.


그렇게 하면 싱글쿼터를 사용할 필요가 없다.


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

** 추가

문자열 비교인 = 혹은 like가 필터링 되어 있다면 in 함수를 사용해주면 된다.


'a'='a'

'a' like 'a'

'a' in ('a')


모두 동일하다고 보면 된다.



반응형

'Solve Problem > HackCTF' 카테고리의 다른 글

[HackCTF] LOL  (2) 2019.11.20
[HackCTF] Secret Document  (0) 2018.12.31
[HackCTF] No Password  (0) 2018.12.30
[HackCTF] 가위바위보  (0) 2018.12.28
블로그 이미지

rootable

,