经常在wooyun看到“漫游内网”之类的漏洞,那么这样的漏洞一般是怎么产生的呢?
Demo1:未经校验的url重定向
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class wooyun extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect(request.getParameter("url"));
}
}
当请求里面带有url=xxxx内网ip的时候server会把请求重定向到对应的地址(请求转发不行,因为转发只能在本应用内)。
类似场景:
Demo2:文件下载问题
不得不说某个木JJ的黑阔非常的贱。迅雷等下载工具都流行用一个叫做“离线下载”的功能(这里说的只是一个想法,不代表迅雷有这个问题),这个功能实际上 是一个文件下载代理。当客户端下载一个文件的时候可以同时在服务器端建立一个“离线任务”。这个离线任务其实就是在服务器上下载目标文件,一旦在服务器上 下载完成后就把资源共享给本地客户端这样用户可以享受到服务器的高速带宽,下载速度自然就噌噌噌的了。这里其实也存在一个逻辑问题,当服务器拿到目标地址 为内网ip的且不进行处理继续下载的话,假如建立一个离线任务地址是:http://192.168.xxx.xxx,云端会访问内网的这个URL,并且 下载页面返回结果,就算不返回结果通常也可以通过看返回的状态判定。
比如:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class wooyun extends HttpServlet {
private static final long serialVersionUID = 1L;
public String download(String url){
String t = "",s = "";
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new URL(url).openConnection().getInputStream(),"GBK"));
while((t=br.readLine())!=null){
s+=t+"n";
}
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println(download(request.getParameter("url")));
out.flush();
out.close();
}
}
请求会经过服务器发送到内网其他服务器:
类似场景:
如何防御:
1、限定demo1的跳转地址
2、处理下载请求时忽略内网IP
3、在请求或响应的包装类(HttpServletRequestWrapper、HttpServletResponseWrapper)做好危险请求处理
4、加强开发者的安全意识,做好内网安全工作
思维扩撒:
可以枚举内网所有端口和ip进行内网信息刺探,寻求如Struts2、Tomcat等突破口。。。
欢迎补充……
[http://p2j.cn/?p=292]
转载请注明:jinglingshu的博客 » “内网漫游”-web