写点什么

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

作者:喀拉峻
  • 2021 年 12 月 29 日
  • 本文字数:4926 字

    阅读完需:约 16 分钟

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;23 public class HelloServiceImpl {45 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


<?xml version="1.0" encoding="UTF-8"?><deployment xmlns="http://xml.apache.org/axis/wsdd/"xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"><globalConfiguration><parameter name="sendMultiRefs" value="true" /><parameter name="disablePrettyXML" value="true" /><parameter name="adminPassword" value="admin" /><parameter name="attachments.Directory"value="D:\tomcat5\webapps\WebService\WEB-INF\attachments" /><parameter name="dotNetSoapEncFix" value="true" /><parameter name="enableNamespacePrefixOptimization"value="false" /><parameter name="sendXMLDeclaration" value="true" /><parameter name="sendXsiTypes" value="true" /><parameter name="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl" /><requestFlow><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="session" /></handler><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="request" /><parameter name="extension" value=".jwr" /></handler></requestFlow></globalConfiguration><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" /><service name="AdminService" provider="java:MSG"><parameter name="allowedMethods" value="AdminService" /><parameter name="enableRemoteAdmin" value="false" /><parameter name="className" value="org.apache.axis.utils.Admin" /><namespace>http://xml.apache.org/axis/wsdd/</namespace></service><service name="Version" provider="java:RPC"><parameter name="allowedMethods" value="getVersion" /><parameter name="className" value="org.apache.axis.Version" /></service>


<transport name="http">    <requestFlow>        <handler type="URLMapper" />        <handler            type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />    </requestFlow>    <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" /></transport><transport name="local">    <responseFlow>        <handler type="LocalResponder" />    </responseFlow></transport>
<!-- 配置自己的服务 --><service name="HelloService" provider="java:RPC"> <parameter name="allowedMethods" value="*" /> <parameter name="className" value="server.service.HelloServiceImpl" /></service>
复制代码


</deployment>(3)客户端代码


Test.java


1 package client;23 import java.net.URL;45 import javax.xml.rpc.ParameterMode;67 import org.apache.axis.client.Call;8 import org.apache.axis.encoding.XMLType;910 public class Test {1112 public static void main(String args[]) throws Exception {13 webservice_user();14 }1516 public static void webservice_user() throws Exception {1718 // 1.创建 service 对象,通过 axis 自带的类创建 19 org.apache.axis.client.Service service = new org.apache.axis.client.Service();2021 // 2.创建 url 对象 22 String wsdlUrl = "http://localhost:8080/WebService06_Security/services/HelloService?wsdl";// 请求服务的 URL23 URL url = new URL(wsdlUrl);// 通过 URL 类的构造方法传入 wsdlUrl 地址创建 URL 对象 2425 // 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));//设置超时限制 3334 // 4.通过 invoke 方法调用 webservice35 String str = new String("pantp");36 String dept = (String) call.invoke(new Object[] { str });// 调用服务方法 3738 // 5.打印返回结果 39 System.out.println("我是客户端.......");40 System.out.println(dept);41 }4243 }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 文件中增加验证的配置


修改后完整的文件如下:


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


1 package client;23 import java.net.URL;45 import javax.xml.rpc.ParameterMode;67 import org.apache.axis.client.Call;8 import org.apache.axis.encoding.XMLType;910 public class Test {1112 public static void main(String args[]) throws Exception {13 webservice_user();14 }1516 public static void webservice_user() throws Exception {1718 // 1.创建 service 对象,通过 axis 自带的类创建 19 org.apache.axis.client.Service service = new org.apache.axis.client.Service();2021 // 2.创建 url 对象 22 String wsdlUrl = "http://localhost:8080/WebService06_Security/services/HelloService?wsdl";// 请求服务的 URL23 URL url = new URL(wsdlUrl);// 通过 URL 类的构造方法传入 wsdlUrl 地址创建 URL 对象 2425 // 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));//设置超时限制 3334 //-----------------------------采用 webservice 的 users.lst 的安全机制增加的-------------------------------------35 //此处的用户名和密码对应 WEB-INF 目录下 users.lst 文件中的用户名和密码 36 call.getMessageContext().setUsername("pantp");37 call.getMessageContext().setPassword("123456");38 //-----------------------------采用 webservice 的 users.lst 的安全机制增加的-------------------------------------3940 // 4.通过 invoke 方法调用 webservice41 String str = new String("pantp");42 String dept = (String) call.invoke(new Object[] { str });// 调用服务方法 4344 // 5.打印返回结果 45 System.out.println("我是客户端.......");46 System.out.println(dept);47 }4849 }3.4 测试 webservice 通过 users.lst 实现的安全机制(1)输入正确的用户名和密码


客户端日志:


eoiioeWeb 安全渗透测试之信息搜集篇服务端日志:


eoiioeWeb 安全渗透测试之信息搜集篇(2)输入错误的用户名或密码


客户端日志:


eoiioeWeb 安全渗透测试之信息搜集篇服务端日志:


后台没有任何日志输出;


总结:


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


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


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


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


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

发布于: 刚刚
用户头像

喀拉峻

关注

左手Java右手Python,中间纹个C++ 2021.06.26 加入

还未添加个人简介

评论

发布
暂无评论
eoiioeWeb安全渗透测试之信息搜集篇