1.1.3 网站扫描

前文介绍过的资产扫描和漏洞扫描主要面向的是硬件和软件资产,而网站扫描针对的对象则是以网站应用为主,它相当于对企业的网站业务进行黑盒扫描。当然,如果需要的话,代码扫描可以对网站应用进行代码级的白盒扫描。与资产扫描、漏洞扫描不同的是,网站扫描虽然也属于漏洞扫描的一种,但它关心的是由企业开发人员在编程过程中引发的漏洞,或者是由于业务逻辑设计不合理而产生的漏洞。

1.网站爬虫

由于是针对网站应用进行的扫描,所以利用爬虫遍历网站中的所有页面就变得必不可少了。在网站扫描领域,利用爬虫主要是希望对网站的资产能够进行全面了解和梳理,因为在多数情况下,我们并不需要把网站的页面内容抓取下来,只要能够遍历所有的页面即可。

在网页遍历过程的某些场景下,还需要进行登录扫描,主要是因为在企业网站中,有些页面只有在成功登录后才能访问到。常见的网站登录扫描方式有两种,一种是把在登录页面中需要填写提交的内容记录下来,然后模拟登录过程,另一种是把登录后的Cookie提取出来,用作登录凭证。

有关爬虫技术的相关文档及自动化的工具大家可以自行了解,此处不再赘述。下面提供一个简单的爬虫。


import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.ArrayList;

import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
import org.jsoup.UnsupportedMimeTypeException;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Crawler {
    static String initial_uri_string = "http://news.sina.com.cn";
    static String domain = "sina.com.cn";

    public static void main(String[] args) {
        URI newURI;
        URI baseURI = null;
        int index = 0;
        String uriString;

        ArrayList<String> uriStringAL = new ArrayList<String>();
        uriStringAL.add(initial_uri_string);

        do {
            uriString = uriStringAL.get(index++);
            System.out.println("(" + index + "/" + uriStringAL.size() + ") Crawling " + uriString + " ... ");
            try {
                baseURI = new URI(uriString);
                Document doc =  Jsoup.connect(uriString).userAgent("Mozilla/5.0").get();

                Elements es = doc.getElementsByTag("a");
                for (Element e:es) {
                    newURI = baseURI.resolve(e.attr("href"));
                    if (newURI.getHost().endsWith(domain)) {
                        if (!uriStringAL.contains(newURI.toString()) && !newURI.toString().isEmpty()) {
                            uriStringAL.add(newURI.toString());
                        }
                    }
                }
            } catch (SocketTimeoutException e) {
                System.out.println("SocketTimeoutException");
            } catch (UnknownHostException e) {
                System.out.println("UnknownHostException");
            } catch (IllegalArgumentException e) {
                System.out.println("IllegalArgumentException");
            } catch (HttpStatusException e) {
                System.out.println("HttpStatusException");
            } catch (UnsupportedMimeTypeException e) {
                System.out.println("UnsupportedMimeTypeException");
            } catch (IOException e) {
                System.out.println("IOException");
            } catch (URISyntaxException e) {
                System.out.println("URISyntaxException");
            } catch (NullPointerException e) {
                System.out.println("NullPointerException");
            }
        } while (uriStringAL.size() > index);
    }
}

2.Web应用常见威胁

2017年的OWASP Top 10报告(https://owasp.org/www-project-top-ten)中,列举了针对Web应用的十大安全风险,如下所示。有关OWASP的具体内容会在后面的章节中进行详细介绍。

·A1:Injection。

·A2:Broken Authentication。

·A3:Sensitive Data Exposure。

·A4:XML External Entities(XXE)。

·A5:Broken Access Control。

·A6:Security Misconfiguration。

·A7:Cross-Site Scripting(XSS)。

·A8:Insecure Deserialization。

·A9:Using Components with Known Vulnerabilities。

·A10:Insufficient Logging and Monitoring。

3.网站漏洞扫描

如图1-4所示,在网站扫描过程中,首先要利用爬虫技术对企业的Web应用进行一个全面的了解,相当于对网站应用做了一次全面的资产扫描。其次,再对网站的所有页面进行有针对性的漏洞扫描,这里所说的漏洞包括了Web应用中常见的各种漏洞类型,例如SQL Injection、Cross-Site Scripting(XSS)、XML External Entities(XXE)等。网站应用中是否存在漏洞?漏洞在哪里?漏洞能不能被利用?这些问题都是网站扫描需要回答的,也是网站扫描需要解决的问题。

图1-4 网站漏洞扫描过程