我想在这个URL读取文本的第二行:“http://vuln2014.picoctf.com:51818/”(这是一个捕获标志的竞争,但只是要求标志或标志的方向打破竞争规则)。我试图从URL打开输入流,但我得到一个无效的HTTP响应异常。任何帮助都表示赞赏,我认识到我的错误可能非常愚蠢。
代码:
URL url = new URL("http://vuln2014.picoctf.com:51818");
URLConnection con = url.openConnection();
InputStream is = con.getInputStream()
错误发生在第三行。 java.io.IOException:sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1342)在name.main(name.java:41)上的无效Http响应
curl愉快地从页面获取文本,并且可以从Web浏览器中完全访问它。
答案 0 :(得分:2)
执行此操作时:
URL url = new URL("http://vuln2014.picoctf.com:51818");
URLConnection con = url.openConnection();
您正在签订一份合同,声明此网址使用http
协议。当您致电openConnection
时,由于您在网址中使用http
作为协议,因此预计会收到http://
个回复。 Java Documentation说:
如果对于URL的协议(例如HTTP或JAR),存在属于以下某个包或其子包之一的公共专用URLConnection子类:java.lang,java.io,java .util,java.net,返回的连接将是该子类。 例如,对于HTTP,将返回HttpURLConnection ,对于JAR,将返回JarURLConnection。
您要连接的服务器只返回几行数据。我使用命令nc vuln2014.picoctf.com 51818
检索它们。没有http
响应代码,例如 HTTP/1.1 200 OK
:
欢迎来到Daedalus Corp间谍RSA密钥生成服务。您应该用来发送更新的公共模数如下。记得使用指数65537。 b4ab920c4772c5247e7d89ec7570af7295f92e3b584fc1a1a5624d19ca07cd72ab4ab9c8ec58a63c09f382aa319fa5a714a46ffafcb6529026bbc058fc49fb1c29ae9f414db4aa609a5cab6ff5c7b4c4cfc7c18844f048e3899934999510b2fe25fcf8c572514dd2e14c6e19c4668d9ad82fe647cf9e700dcf6dc23496be30bb
在这种情况下,我会使用java.net.Socket
建立连接然后读取行。这是一种简单的方法,假设有两行数据:
Socket theSocket;
try {
theSocket = new Socket("vuln2014.picoctf.com", 51818);
BufferedReader inFile = new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
String strGreet = inFile.readLine();
String strData = inFile.readLine();
} catch (IOException e) {
e.printStackTrace();
}
至于为什么curl和浏览器可以正确呈现它?他们可能对他们阅读的数据更加宽容,并且只会转储从端口读取的内容,即使它不符合指定的协议(如http
)