eoiioeWeb安全渗透测试之信息搜集篇

168 阅读7分钟

1.引言

俗话说,安全第一;

那么,我们软件中是否有安全,安全是否重要呢?

sure,软件开发中当然也有安全,安全显得尤为重要。

本节,我们将一起来看看webservice的安全问题。

之前在前几节中写了webservice开发相关的知识,接下来几节我会写webservice安全相关的问题。

闲扯一点,

本来这部分在上个月就准备写的,但是确实是太忙了,每天加班,晚上回到家都快十一点了,偶尔还要通宵去上线,周末还要去奋战一天,实在是没那个精力,乘着今天下班早点,就来写写了,写博客也是我喜欢的事情嘛。

2.webservice安全机制分类

首先声明,这里的分类不一定准确,只是我站在目前的高度,对能了解到的,能想到的做一个简单的分类;再者,这里的分类都是站在代码的角度来写的,至于你说的防火墙、DMZ....这些都不在我的考虑范围之内。

(1)对webservice发布的方法,方法名称和参数不要使用望文生义的描述;

(2)对webservice发布的方法,在入参中增加一个或多个字符串序列;

这里的字符串可以要求必须满足指定的格式,同时字符串可以在通过客户端传参数的时候加密,服务端解密;

(3)对webservice发布的方法,入参中加上用户名和密码,然后服务端通过数据库校验;

(4)对webservice发布的方法,通过handler/chain方式来实现验证(用户名&密码校验/IP地址校验等);

(5)对webservice发布的方法,采用webservice的users.lst来进行验证;

(6)对webservice发布的服务,通过servlet的Filter来实现验证;

(7)对webservice传输过程中的数据进行加密;

(8)自己写校验框架来实现webservice的安全;

(9)其它方式......

各位大虾,认为还有哪些比较好的方式,欢迎指出。

3.webservice安全实现

既然webservice的安全方式有那么多种,那么具体是怎么实现的呢?

接下来几节,我会介绍webservice采用users.lst、chain、Filter实现webservice的方式;本节,就来介绍一下最简单的,采用webservice自带的users.lst的方式。

3.1开发一个基本的webservice

项目结构图如下:

eoiioeWeb安全渗透测试之信息搜集篇

(1)服务端代码:

HelloServiceImpl.java

 1 package server.service;

 2 

 3 public class HelloServiceImpl {

 4 

 5     public String hello(String s) {

 6         System.out.println("我是服务端......");

 7         System.out.println("方法的入参为:"+s);

 8         return "hello," + s;

 9     }

10 }

(2)服务端wsdd文件的配置

server-config.wsdd

<deployment xmlns="xml.apache.org/axis/wsdd/"

    xmlns:java="xml.apache.org/axis/wsdd/p…

   

       

       

       

        <parameter name="attachments.Directory"

            value="D:\tomcat5\webapps\WebService\WEB-INF\attachments" />

       

        <parameter name="enableNamespacePrefixOptimization"

            value="false" />

       

       

        <parameter name="attachments.implementation"

            value="org.apache.axis.attachments.AttachmentsImpl" />

       

           

               

           

           

               

               

           

       

   

    <handler name="LocalResponder"

        type="java:org.apache.axis.transport.local.LocalResponder" />

    <handler name="URLMapper"

        type="java:org.apache.axis.handlers.http.URLMapper" />

    <handler name="Authenticate"

        type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />

   

       

       

       

        xml.apache.org/axis/wsdd/

   

   

       

       

   

   

       

           

            <handler

                type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />

       

        <parameter name="qs:list"

            value="org.apache.axis.transport.http.QSListHandler" />

        <parameter name="qs:wsdl"

            value="org.apache.axis.transport.http.QSWSDLHandler" />

        <parameter name="qs.list"

            value="org.apache.axis.transport.http.QSListHandler" />

        <parameter name="qs.method"

            value="org.apache.axis.transport.http.QSMethodHandler" />

        <parameter name="qs:method"

            value="org.apache.axis.transport.http.QSMethodHandler" />

        <parameter name="qs.wsdl"

            value="org.apache.axis.transport.http.QSWSDLHandler" />

   

   

       

           

       

   

    <!-- 配置自己的服务 -->

   

       

        <parameter name="className"

            value="server.service.HelloServiceImpl" />

   

(3)客户端代码

Test.java

 1 package client;

 2 

 3 import java.net.URL;

 4 

 5 import javax.xml.rpc.ParameterMode;

 6 

 7 import org.apache.axis.client.Call;

 8 import org.apache.axis.encoding.XMLType;

 9 

10 public class Test {

11 

12     public static void main(String args[]) throws Exception {

13         webservice_user();

14     }

15 

16     public static void webservice_user() throws Exception {

17 

18         // 1.创建service对象,通过axis自带的类创建

19         org.apache.axis.client.Service service = new org.apache.axis.client.Service();

20 

21         // 2.创建url对象

22         String wsdlUrl = "http://localhost:8080/WebService06_Security/services/HelloService?wsdl";// 请求服务的URL

23         URL url = new URL(wsdlUrl);// 通过URL类的构造方法传入wsdlUrl地址创建URL对象

24 

25         // 2.创建服务方法的调用者对象call,设置call对象的属性

26         Call call = (Call) service.createCall();

27         call.setTargetEndpointAddress(url);// 给call对象设置请求的URL属性

28         String serviceName = "hello";// webservice的方法名

29         call.setOperationName(serviceName);// 给call对象设置调用方法名属性

30         call.addParameter("s", XMLType.XSD_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式

31         call.setReturnType(XMLType.SOAP_STRING);// 设置调用方法的返回值类型

32         //         call.setTimeout(new Integer(200));//设置超时限制

33 

34         // 4.通过invoke方法调用webservice

35         String str = new String("pantp");

36         String dept = (String) call.invoke(new Object[] { str });// 调用服务方法

37 

38         // 5.打印返回结果

39         System.out.println("我是客户端.......");

40         System.out.println(dept);

41     }

42 

43 }

3.2测试开发的webservice

启动tomcat,发布工程。

在浏览器中输入wsdl地址,运行结果图如下:

eoiioeWeb安全渗透测试之信息搜集篇

Web安全渗透测试之信息搜集

① 200多本网络安全系列电子书

② 网络安全标准题库资料

③ 项目源码

④ 网络安全基础入门、Linux、web安全、攻防方面的视频

⑤ 网络安全学习路线

⑥ 私♥“安全”即可获取

运行Test.java类:

(1)客户端日志

eoiioeWeb安全渗透测试之信息搜集篇

(2)服务端日志

eoiioeWeb安全渗透测试之信息搜集篇

3.3加上users.lst的验证

(1)增加users.lst文件

在工程的WEB-INF目录下新建文件users.lst,文件内容如下:

eoiioeWeb安全渗透测试之信息搜集篇

说明: 每一行表示一组用户名和密码,用户名和密码之前用空格隔开,第一个为用户名,第二个为密码;

(2)在 server-config.wsdd文件中增加验证的配置

修改后完整的文件如下:

eoiioeWeb安全渗透测试之信息搜集篇

eoiioeWeb安全渗透测试之信息搜集篇

 1

 2 <deployment xmlns="xml.apache.org/axis/wsdd/"

 3     xmlns:java="xml.apache.org/axis/wsdd/p…

 4     

 5         

 6         

 7         

 8         <parameter name="attachments.Directory"

 9             value="D:\tomcat5\webapps\WebService\WEB-INF\attachments" />

10         

11         <parameter name="enableNamespacePrefixOptimization"

12             value="false" />

13         

14         

15         <parameter name="attachments.implementation"

16             value="org.apache.axis.attachments.AttachmentsImpl" />

17         

18             

19                 

20             

21             

22                 

23                 

24             

25         

26     

27     <handler name="LocalResponder"

28         type="java:org.apache.axis.transport.local.LocalResponder" />

29     <handler name="URLMapper"

30         type="java:org.apache.axis.handlers.http.URLMapper" />

31     <handler name="Authenticate"

32         type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />

33     

34         

35         

36         

37         xml.apache.org/axis/wsdd/

38     

39     

40         

41         

42     

43 

44     

45         

46             

47             <handler

48                 type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />

49         

50         <parameter name="qs:list"

51             value="org.apache.axis.transport.http.QSListHandler" />

52         <parameter name="qs:wsdl"

53             value="org.apache.axis.transport.http.QSWSDLHandler" />

54         <parameter name="qs.list"

55             value="org.apache.axis.transport.http.QSListHandler" />

56         <parameter name="qs.method"

57             value="org.apache.axis.transport.http.QSMethodHandler" />

58         <parameter name="qs:method"

59             value="org.apache.axis.transport.http.QSMethodHandler" />

60         <parameter name="qs.wsdl"

61             value="org.apache.axis.transport.http.QSWSDLHandler" />

62     

63     

64         

65             

66         

67     

68 

69     

70     

71         

72         <parameter name="className"

73             value="server.service.HelloServiceImpl" />

74 

75         

76         

77         

78             <handler name="SimpleAuthenticationHandler"

79                 type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />

80         

81         

82 

83     

84 

85

(3)在客户端请求代码中加入用户名和密码

添加用户名和密码后完整的文件如下:

 1 package client;

 2 

 3 import java.net.URL;

 4 

 5 import javax.xml.rpc.ParameterMode;

 6 

 7 import org.apache.axis.client.Call;

 8 import org.apache.axis.encoding.XMLType;

 9 

10 public class Test {

11 

12     public static void main(String args[]) throws Exception {

13         webservice_user();

14     }

15 

16     public static void webservice_user() throws Exception {

17 

18         // 1.创建service对象,通过axis自带的类创建

19         org.apache.axis.client.Service service = new org.apache.axis.client.Service();

20 

21         // 2.创建url对象

22         String wsdlUrl = "http://localhost:8080/WebService06_Security/services/HelloService?wsdl";// 请求服务的URL

23         URL url = new URL(wsdlUrl);// 通过URL类的构造方法传入wsdlUrl地址创建URL对象

24 

25         // 2.创建服务方法的调用者对象call,设置call对象的属性

26         Call call = (Call) service.createCall();

27         call.setTargetEndpointAddress(url);// 给call对象设置请求的URL属性

28         String serviceName = "hello";// webservice的方法名

29         call.setOperationName(serviceName);// 给call对象设置调用方法名属性

30         call.addParameter("s", XMLType.XSD_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式

31         call.setReturnType(XMLType.SOAP_STRING);// 设置调用方法的返回值类型

32         //         call.setTimeout(new Integer(200));//设置超时限制

33 

34         //-----------------------------采用webservice的users.lst的安全机制增加的-------------------------------------

35         //此处的用户名和密码对应WEB-INF目录下users.lst文件中的用户名和密码

36         call.getMessageContext().setUsername("pantp");

37         call.getMessageContext().setPassword("123456");

38         //-----------------------------采用webservice的users.lst的安全机制增加的-------------------------------------

39 

40         // 4.通过invoke方法调用webservice

41         String str = new String("pantp");

42         String dept = (String) call.invoke(new Object[] { str });// 调用服务方法

43 

44         // 5.打印返回结果

45         System.out.println("我是客户端.......");

46         System.out.println(dept);

47     }

48 

49 }

3.4测试webservice通过users.lst实现的安全机制

(1)输入正确的用户名和密码

客户端日志:

eoiioeWeb安全渗透测试之信息搜集篇

服务端日志:

eoiioeWeb安全渗透测试之信息搜集篇

(2)输入错误的用户名或密码

客户端日志:

eoiioeWeb安全渗透测试之信息搜集篇

服务端日志:

后台没有任何日志输出;

总结:

开发通过webservice自带的验证机制实现步骤如下:

1.先不考虑安全机制的问题,开发一个需要的webservice服务和客户端,并测试通过;

2.在WEB-INF目录下新建一个文件users.lst,文件名必须一模一样,然后在文件中加入允许的用户名和密码;

3.在wsdd配置文件中对应的服务中加入

SimpleAuthenticationHandler的配置;

4.在客户端访问时增加用户名和密码的设置;