我目前正在对一个 Web 应用程序进行渗透测试,并遇到了一个有趣的现象。在我的测试过程中,我使用代理收集了 URL。现在我想测试我的 URL 列表是否可以匿名访问,所以我写了这个小工具
public static void main(String[] args) {
try {
TrustAllCerts.disableCertChecks();
FileReader fr = new FileReader(new File("urls.txt"));
BufferedReader br = new BufferedReader(fr);
String urlStr = br.readLine();
while (urlStr != null) {
if (urlStr.trim().length() > 0) {
URL url = new URL(urlStr);
HttpsURLConnection urlc = (HttpsURLConnection) url.openConnection();
urlc.connect();
if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) {
System.out.println(urlStr);
} else {
System.out.println("["+urlc.getResponseCode()+"] "+urlStr);
}
urlc.disconnect();
}
urlStr = br.readLine();
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
它基本上什么都不做,只是在给定的 URL 上打开一个 URL 连接并测试 HTTP 响应代码(实际上我实现了更多测试,如果我被重定向到登录页面)。然而,问题是,这个特定的应用程序(一些自定义的 MS SQL Server 报告服务)被配置为使用 NTLM WWW 身份验证。如果我尝试使用 Firefox 访问某些 URL,我会得到 401 Unauthorized + login dlg。Internet Exploder 在后台执行 NTLM 身份验证并授予访问权限。似乎 Java URLConnection(或 URL)类也是如此,因为我没有收到 401。有没有办法在 Java 中禁用隐式 NTLM 身份验证?这对我来说是一个糟糕的陷阱。