와.. 삽질하면서 깨달은 점을 적는다..
문제는 이러하다.
싱글쿼터도 되는데 왜 안된다고 생각을 했는지 모르겠지만..
일단 진행한 순서대로 서술해보자.
일단 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 |