经常在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]
相关讨论:
1#
lucky (一天一洞) | 2013-12-17 15:30
先标记一下!等下看看
2#
yexin | 2013-12-17 15:42
很不错。
3#
小胖子 (流泪撒种的,必欢呼收割。) | 2013-12-17 15:44
贱人你为何不发到dorps?你在zone这么屌,@瞌睡龙 知道吗?
4#
园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-12-17 15:46
@小胖子 我在等你补充
5#
insight-labs (Root Yourself in Success) | 2013-12-17 15:49
贱人你为何不发到dorps?你在zone这么屌,@瞌睡龙 知道吗?
6#
Coody (&_&) | 2013-12-17 15:50
不错。。。。
7#
wefgod (求大牛指点) | 2013-12-17 16:25
园长大牛级别
8#
无敌L.t.H (:?门安天京北爱我?) | 2013-12-17 16:44
百度就喜欢把内网搞到搜索结果里面。
9#
ghy459 (深挖洞,广积shell。) | 2013-12-17 17:01
mark,园长毕竟大牛
10#
zzR (你说我不能笑- -!) | 2013-12-17 18:10
前几天刚刚遇到了第一种情况,明天摸摸去
11#
瞌睡龙 (<body onload=alert(1)>) | 2013-12-17 18:38
http://drops.wooyun.org/papers/154 你在zone这么吊,你家人知道吗?
12#
园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-12-17 18:44
@瞌睡龙 最近都没时间看drops
13#
luwikes (土豆你个西红柿,番茄你个马铃薯~~~) | 2013-12-17 22:49
ding
14#
GrayTrack (强大到惊人) | 2013-12-17 23:20
@园长 你们这么吊,看的是什么书啊,推荐几部吧
15#
天朝城管 | 2013-12-18 00:37
碉堡了
16#
围剿 | 2013-12-18 08:30
养肥了再看,马克
17#
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2013-12-18 10:25
mark.