问题 如何保护Web服务器免受反向代理服务器的影响


我有一个网站“www.website.com”。

最近我发现了 有人建立了反向代理 在我的网站前面有一个几乎相同的网址“www.website1.com”。

我担心那些通过反向代理来到我网站的用户。他们登录时可能会记录他们的用户名和密码。

有没有办法让我的Web服务器拒绝反向代理? 

例如,我在“www.stackoverflow.com”前面使用网址“www.fakestackoverflow.com”设置了反向代理。因此,每当我在网络浏览器地址栏中输入“www.fakestackoverflow.com”时,我都会被反向代理重定向到“www.stackoverflow.com”。然后我注意到我的地址栏中的网址已更改为“www.stackoverflow.com”,表示我不再通过反向代理。

“www.stackoverflow.com”一定检测到我从另一个网址进入网站,然后通过实际网址将我重定向到网站。 

我如何在ASP.NET Web应用程序中执行类似的操作?

询问服务器故障


4064
2017-10-10 06:32


起源

我可以看到这个问题在这里是否合适。但您也可以考虑使用ServerFault.com - Andrew Barber
@Twisted真的吗?谢谢你的信息,你能给我一些更多的信息吗?或者一个例子如何避免它?我删除了我的答案以找到更好的方法,请建议,因为我认为这是非常严重的伎俩。 - Aristos
@Twisted顺便说一句如果你找到了reverce代理,你可以阻止他的ip进行快速解决。当然,我们在这里寻求自动解决方案。 - Aristos
我不知道如何预防它。到目前为止,基于反馈,javascript可能是要走的路,但它会阻止翻译服务和谷歌缓存访问特定的网页。 - Twisted Whisper
@Twisted当stackoverflow修复网址时,你会看到任何消息通知你吗? - Aristos


答案:


首先,使用JavaScript来嗅探document.location.href并将其与您的域匹配:

var MyHostName =  "www.mydomain.com";
if (0 == document.location.href.indexOf("https://")) 
{
    MyHostName = "https://" + MyHostName + "/";
    if (0 != document.location.href.indexOf(MyHostName)) {
        var new_location = document.location.href.replace(/https:\/\/[^\/]+\//, MyHostName);

        if(new_location != document.location.href)
            document.location.replace(new_location);
    }
}
else
{
    MyHostName = "http://" + MyHostName + "/";
    if (0 != document.location.href.indexOf(MyHostName)) {
        var new_location = document.location.href.replace(/http:\/\/[^\/]+\//, MyHostName);

        if(new_location != document.location.href)
            document.location.replace(new_location);
    }
}

第二:将init脚本写入所有ASP页面,以检查远程用户IP地址是否与反向代理的地址匹配。如果匹配,则重定向到tinyurl链接,该链接重定向回您的真实域。使用tinyurl或其他重定向服务来反击反向代理的URL重写。

第三:编写计划任务以在假域上执行DNS查找,并更新步骤2中的init脚本使用的配置文件。 注意: 不要在ASP中进行DNS查找,因为DNS查找可能会停顿5秒钟。这为您的网站打开了一扇门。此外,不要仅仅基于IP地址阻止,因为它很容易重新定位。

编辑:如果您被认为是代理运营商窃取用户密码和用户名,则应记录所有服务于代理IP地址的用户,并禁用其帐户。然后向他们发送电子邮件,说明他们是通过拼写错误的域名成为网络钓鱼攻击的受害者,并请求他们更改密码。


9
2017-10-10 06:55



@jmz +1很好的代码,我认为它的工作,但如果有一些自定义反向代理窃取一些密码然后它将删除可能大多数的JavaScript,以避免这种情况发送页面时。 - Aristos
@Aristos:针对此类攻击的一种解决方案是使用JavaScript创建登录表单。此外,从HTTPS连接提供登录页面会提醒大多数精通技术的用户。你也可以警告像Last.fm这样的恶意网站(last.fm/login) - jmz
我认为阻止IP是一个公平的想法,直到更强大的防御即将到来。阻止它们通常比更改它们更容易。 - strainer
我建议在检测到反向代理IP时提供色情服务。 - usr
@jmz~请参阅以下来自Josh Stodola的评论,以及来自Aristos的评论... javascript不能解决基于服务器的问题。你也只做基于javascript的验证吗? (-1) - jcolebrand


如果您使用https://进行SSL身份验证,则在大多数情况下可以绕过代理。

你也可以寻找 X - 转发,对于 传入请求中的标头,并将其与可疑代理进行匹配。


1
2017-10-18 03:00



麻烦的是,这只有在代理不是定制/恶意的情况下才有效。如果它是恶意的自定义代理,则不太可能遵循最佳实践! - Paul Russell


正如我所看到的,你的根本问题是,无论你采取什么样的应用层防御措施来缓解这种攻击,攻击者都可以解决这个问题,假设这确实是一个有能力的攻击者做出的恶意攻击。

在我看来,你肯定应该使用HTTPS,原则上它允许用户确认他们是否正在与正确的服务器通话,但这依赖于用户知道检查这一点。有些浏览器现在在URL栏中显示有关哪个法人实体拥有SSL证书的额外信息,这将有所帮助,因为攻击者不太可能说服合法的证书颁发机构以您的名义颁发证书。

这里的一些其他评论说,HTTPS可以被中间代理服务器拦截,这实际上并不正确。使用HTTPS,客户端向代理服务器发出CONNECT请求,代理服务器将所有未来流量直接隧道传送到源服务器,而无法读取任何流量服务器。如果我们假设这个代理服务器完全是定制的和恶意的,那么它可以终止SSL会话并拦截流量,但它只能用自己的SSL证书来做,而不是用你的。此证书将自签名(在这种情况下客户端将收到大量警告消息)或证书颁发机构颁发的正版证书,在这种情况下,它将具有错误的法人实体名称,您应该能够返回如果您有合理的怀疑他们是网络钓鱼,则向证书颁发机构撤销证书并可能要求警方对证书的所有者采取行动。

我能想到的另一件事就是减轻这种威胁 在某种程度上 将实现一次性密码功能,使用硬件/软件令牌或使用(我个人最喜欢的)在用户登录时发送到用户手机的短信。这不会阻止攻击者访问会话 一旦,但应该阻止他们将来登录。您可以通过要求另一个一次性密码来进一步保护用户,然后再允许他们查看/编辑特别敏感的详细信息。


1
2017-10-19 16:51





最简单的方法可能是在您检查的页面上放置一些Javascript代码 window.location 查看顶级域名(TLD)是否与您期望的相匹配,如果不匹配,则将其替换为正确的域名(导致浏览器重新加载到正确的站点)。


0
2017-10-10 06:52



Javascript在客户端上运行,可以轻松禁用。话虽如此,这个解决方案却没有 保护 完全是Web服务器。 - Josh Stodola
〜@Josh Stodola是对的。 (-1) - jcolebrand
不仅仅是禁用,它可以在整个过程中进行更改,因此如果有人用胭脂红色替换了列入白名单的主机名/域名,您可能会产生错误的安全感。 - bas


你可以做很少的事情来防止这种情况,而不会导致合法的代理(翻译,谷歌缓存等)失败。如果您不关心人们是否使用此类服务​​,那么只需将您的网络应用设置为在基本网址不正确时始终重定向。

如果您了解代理,可以采取一些步骤,并且可以找到他们的IP地址,但这可能会发生变化,您必须始终保持最佳状态。 @ jmz在这方面的答案相当不错。


0
2017-10-10 08:40



我想知道stackoverflow.com是如何做到的。更改浏览器地址栏中的正确网址,也不会导致谷歌翻译失败。 - Twisted Whisper


经过几天的搜索和实验,我想我已经找到了对我的问题的解释。在我的问题中,我用过 stackoverflow.com 作为一个例子,但现在我将使用 whatismyipaddress.com 作为我的例子,因为两者在url重写加上表现出相同的行为 whatismyipaddress.com 能够告诉我的IP地址。

首先,为了重现这种行为,我访问了 whatismyipaddress.com 并说,我的IP地址 111.111.111.111。然后我去了 www.whatismyipaddress.com (注意额外的 万维网。 作为它的前缀)和我浏览器的地址栏中的URL改回 whatismyipaddress.com 丢弃前缀。在阅读了Josh Stodola的评论之后,我突然想到了这一点。

接下来,我使用url设置反向代理 www.myreverseproxy.com 和IP地址 222.222.222.222 我有它执行以下两种情况:

  1. 我有反向代理点 whatismyipaddress.com(没有前缀** www。)。然后输入 www.myreverseproxy.com 在我的浏览器的地址栏中。反向代理然后转发给我 whatismyipaddress.com 我的地址栏中的网址没有改变(仍然显示 www.myreverseproxy.com)。我通过检查显示的网页上的IP地址进一步证实了这一点 222.222.222.222 (这是反向代理的IP地址)。这意味着我仍然通过反向代理查看网页而不是直接连接到 whatismyipaddress.com

  2. 然后我有反向代理指向 www.whatismyipaddress.com (带前缀 WWWW。 这次)。我去过了 www.myreverseproxy.com 这次我的地址栏中的网址发生了变化 www.myreverseproxy.com 至 whatismyipaddress.com。网页显示我的IP地址为 111.111.111.111 (这是我电脑的真实IP地址)。这意味着我不再通过反向代理查看网页并直接重定向到 whatismyipaddress.com

我认为这是Josh Stodola指出的某种网址重写技巧。我想我会在这方面阅读更多内容。至于如何保护服务器免受反向代理,最好的办法是使用SSL。通过代理的加密信息是没有用的,因为它无法在普通视野中读取,因此可以防止窃听和中间人攻击,而逆向代理究竟是什么。

使用javascript进行保护可以看作是微不足道的,因为javascript可以通过反向代理轻松剥离,并且还可以阻止谷歌翻译等其他在线服务访问您的网站。


0
2017-10-12 06:39



我失去了你:)你能在代码中给出一个例子吗? :) - Aristos
我没有这个代码。这是关于使用您的网络浏览器访问whatismyipaddress.com和www.whatismyipaddress.com有和没有反向代理。基本上,执行以下4个步骤:1)访问whatismyipaddress.com而不使用反向代理。 2)无需代理即可访问www.whatismyipaddress.com。 3)通过反向代理访问whatismyipaddress.com。 4)通过反向代理访问www.whatismyipaddress.com。在每个步骤之前和之后,密切关注Web浏览器地址栏中的URL以及您的IP地址。 - Twisted Whisper
我仍然无法想象如何在真实的页面中使所有这些工作。 - Aristos
Ssl不会保护你。 ssl是一种点对点安全功能。这意味着asl将在反向代理处解密。然后rp可以为欺骗域提供它自己的ssl,如果它需要或者它可以使用普通的http。 - Mike
@Mike非常好点。 - Aristos


我有一个想法,我认为是一个解决方案。

首先,您不需要覆盖所有页面,因为这样您可以阻止其他代理和其他服务(如谷歌自动翻译)。

所以说你赢了 绝对确定登录页面

那么你做什么,当用户登录login.aspx页面时,你进行重定向 与您的网站的完整路径 再次登录login.aspx。

if(Not all ready redirect on header / or on parametres from url)
  Responce.Redirect("https://www.mysite.com/login.aspx");

这样我认为透明代理不能更改get头并更改它。

您也可以记录任何代理,或来自某些ips的大请求并进行检查。当你找到了 钓鱼网站 就像你说的那样,你也可以举报。

http://www.antiphishing.org/report_phishing.html
https://submit.symantec.com/antifraud/phish.cgi
http://www.google.com/safebrowsing/report_phish/


0
2017-10-11 19:30



那我怎么知道页面是否已被重定向?这将如何工作“如果(不是所有准备重定向标题)”?使用会话,饼干? - Twisted Whisper
@Twisted嗯,我仍然认为。一种方法是有一个中间页面。我有许多操作的中间页面,然后重定向到结果页面。其他是阅读标题。 - Aristos


如果网站在该列表上,则可以创建URL的黑名单并将请求与Response.Referer进行比较,然后终止请求或重定向您自己的请求。

黑名单显然是你必须手动更新的东西。


0
2017-10-18 16:29



Referer是最容易覆盖和改变的。 - Aristos
我显然没有意识到这很容易实现,感谢你指出这一点。 - Mr. Mr.


好吧,我已经通过类似的情况,但我设法通过使用另一个指向我原来的转发域克服它,然后检查代码,如果客户端是反向服务器,如果它,我会将它们重定向到我的第二个域这将是原来的 从这里查看更多信息: http://alphablog.xyz/your-website-is-being-mirrored-by-someone-else-without-your-knowledge/


0
2017-09-04 14:04