攻破WebService,WCF的改进
一、WebService的调用
WebService的调用可以分为两种,一种是客户端调用,比如在浏览器中用Javascript或者应用程序调用;一种是服务端调用,这种用得比较多,很常见。这里要说的是明文调用,相信很多服务都没用WSE加密。
二、客户端调用
调用方式就不多说了,网上很多,但是傻子也知道这种调用有很大的缺陷。因为WebService是明文的,除非是很不重要的数据,这样调用纯粹就是找死。是个人就有办法攻破。要么是修改掉重要数据,要么就是数据无阻碍地被复制。加密对这种方式也不太好使。
三、服务端调用
首先建立一个WebService。
/// <summary>
///TestService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TestService : System.Web.Services.WebService {
public TestService () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public int Add(int x, int y) {
return x + y;
}
}
///TestService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TestService : System.Web.Services.WebService {
public TestService () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public int Add(int x, int y) {
return x + y;
}
}
这里写个asp脚本调用,C#的调用方式太麻烦了。
<%
dim url
url = "http://××××××××××/TestService.asmx/Add"
dim postdata
postdata = "x=1&y=3"
dim xmlhttp
Set xmlhttp = server.CreateObject("Msxml2.XMLHTTP")
xmlhttp.Open "POST",url,false
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.setRequestHeader "Content-Length",LEN(postdata)
xmlhttp.send(postdata)
Response.Write xmlhttp.Status & " "
Response.Write xmlhttp.StatusText
Set xmlhttp = Nothing
%>
dim url
url = "http://××××××××××/TestService.asmx/Add"
dim postdata
postdata = "x=1&y=3"
dim xmlhttp
Set xmlhttp = server.CreateObject("Msxml2.XMLHTTP")
xmlhttp.Open "POST",url,false
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.setRequestHeader "Content-Length",LEN(postdata)
xmlhttp.send(postdata)
Response.Write xmlhttp.Status & " "
Response.Write xmlhttp.StatusText
Set xmlhttp = Nothing
%>
这样就完成服务端的调用了。
如何攻破服务端调用呢?要是你攻破对方的服务器,那就没什么好说的了。只是本机调用,也没太大的问题。跨机器,分布式调用,就有办法了。假设,现在有A,B两台服务器,A服务器提供了WebService,B服务器调用。
1、A,B不在一个局域网
A,B不在一个局域网,嘿嘿,机会来了吧?我的机器在局域网中,无法监听外网的数据。但是如果你是拨号上网的话,那还犹豫什么?监听就行了,当然,垃圾数据比有用的数据多多了啊。
2、A,B在同一局域网
A,B在一个局域网,那有什么办法?先看看,假如我有一台服务器C也在这个局域网中。那么,我就可以监听到数据了。来看看一次WebService调用监听到的数据。
先是一次TCP通信,三次握手,没什么好说的。三次握手完后就是POST。
下来是POST的数据。
收到数据。
数据全出来了!!中间的确认什么的就跳过了。明文的WebService传输是不是有很大的问题啊?不要想黑客和你的服务器不在一个局域网里。攻不破你的服务器,但是在这个局域网中的服务器,攻陷的机会要大很多。另外实在不行,托管个服务器进去,嘿嘿。那本来和你是一个局域网的用户,要攻破你的话,太esay了啊!
四、解决方案
加密,什么也不用说了。
五、WCF
我对WCF不是很熟啊。简单地看了一下,WCF的调用需要身份验证,如果去掉身份验证的话,传输的数据也是密文的。对这个不是很熟,就不讨论这个了。密文传输应该是一个改进。网上都说WCF的效率也提高了,不过从截包情况看,网络传输方面肯定没有提高。WCF不但使用了加密,而且确认的次数也比WebService的多。通信效率连WebService都不如。