大学里的最后一门考试?或许考试是人生中最简单的考验了吧

论述题:3*10

材料分析题:20

代码分析题:20+30

WEB安全

OWASP TOP 10
A1:注入

不受信任的数据作为命令或查询的一部分发送到解析器进行解析,通常发生在SQL、LDAP、Xpath、NoSQL查询语句

攻击可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据

  • 导致数据丢失、破坏或泄露,主机被完全接管

防御:使用安全的API,完全避免使用解释器,提供参数化界面的接口,迁移到ORM或实体框架

SQL注入:预编译,绑定参数

A2:失效的身份认证

通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌

暴力破解、弱密码、撞库攻击、明文 加密或弱散列密码、不正确地使回会话ID失效

防御:多因素身份验证、执行弱密码检查、设置合适的密码长度 复杂性和循环策略、限制或逐渐延迟失败的登陆尝试

A3:敏感数据泄露

许多Web应用程序和API都无法正确保护敏感数据,攻击者可以通过窃取或修改未加密的数据来实施诈骗身份盗窃

对敏感数据加密:

  • 传输过程中的数据(是否明文传输)
  • 存储的数据(是否被加密)
  • 浏览器的交互数据

防御:

  • 对系统处理、存储或传输的数据分类,根据分类进行访问控制
  • 尽快清除没必要存放的重要的敏感数据
  • 确保存储的敏感数据被加密
  • 确保使用了最新的、强大的标准算法或密码、参数、协议和密钥,密钥管理到位
  • 确保传输过程中的数据被加密,如TLS,确保数据加密被强制执行,如HTTP严格安全传输协议(HSTS)
  • 禁止缓存包含敏感数据的响应
A4:XXE

XXE:XML外部实体注入,一般发生在应用程序解析XML输入时,没有处理好外部实体的加载

危害:文件读取、任意命令执行、探测内网端口、攻击内网网站

<?xml version="1.0" ?> <!-- xml声明 -->
<!DOCTYPE note [ <!-- DTD文档类型定义 根元素note -->
<!ELEMENT note ANY > <!--note中的子元素-->
<!ELEMENT to (#PCDATA)> <!-- 接收者 -->
<!ENTITY x "CUMTCS"> <!-- 命名实体 -->
]>
<note> <!--文档元素-->
<to>Jerry</to>
<x>&X;</x>
</note>

<?xml verison="1.0"?> <!-- 外部实体 -->
<!DOCTYPE ANY[
<!ENTITY xxe SYSTEM "file://etc/passwd">
]>
<x>&xxe;</x>

防御:

  • 尽可能使用简单的数据格式(如JSON),避免对敏感数据进行序列化
  • 在XML解析器中禁用XML外部实体和DTD进程
  • 过滤用户提交的XML数据
  • 在服务器端实施积极的输入验证、过滤和清理
  • 使用API安全网关、WAF检测、监控和防止XXE攻击
A5:失效的访问控制

未对用户实施恰当的访问控制,攻击者可以访问未经授权的功能和数据

访问其他用户账户、查看敏感文件、修改其他用户的数据、更改访问权限

A6:安全配置错误
  • 不安全的默认配置
  • 不完整的临时配置
  • 错误的HTTP报头配置
  • 包含敏感信息的详细错误信息

服务器默认账户、密码未删除,目录列表功能未被禁用,服务器实例应用程序未删除

A7:XSS

网页中包含不受信任的、未经恰当验证或转义的数据,或使用可以创建HTML或Javascript的浏览器API更新现有的网页时,会出现XSS缺陷

三种类型:

  • 反射型XSS
  • 存储型XSS
  • 基于DOM的XSS

攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点

过滤script关键词可以使用JS事件来弹窗,如onclick oninput onmouseover

防御:

  • PHP htmlspecialchars() 把预定义的字符转换位HTML实体,& “ ‘ < >
  • 提前闭合
A8:不安全的反序列化

序列化(serialize)被用于远程和进程间通信,远程协议,Web服务,缓存/持久性,数据库,HTTP cookie

<?php
class AA {
private $flag = "serialize";
protected $test = "test";
public $test1 = "test1";

public function set($flag){
$this->flag = $flag;
}
public function get($flag){
return $this->flag;
}
}
$ob = new AA();
$ob->set('unserialzie');
$date = serialize($ob);
echo $date;
?>

O:2:"AA":3:{s:8:" AA flag";s:11:"unserialzie";s:7:" * test";s:4:"test";s:5:"test1";s:5:"test1";}

只序列化属性,不序列化方法

几个魔术方法

  • construct():对象创建时自动调用
  • wakeup():unserialize时自动调用
  • destruct():对象被销毁时自动调用
  • toString():反序列化后的对象被输出在模板中时自动调用

两种主要类型

  1. 对象和数据结构攻击:攻击者改变应用逻辑或实现远程代码执行攻击
  2. 数据篡改攻击:访问控制相关的攻击

防御:

  • (最安全)不接受不受信源的序列化对象,或只允许原始数据类型的序列化
  • 执行完整性检查;创建对象前强制执行严格的类型约束;记录反序列化的例外情况和失败信息;限制或监视来自于容器或服务器传入和传出的反序列化网络连接
A9:使用含有已知漏洞的组件

应用程序中含有已知漏洞的组件被攻击者利用,造成严重的数据丢失或服务器接管,破坏应用程序防御,产生严重影响

A10:不足的日志记录和监控

不足的日志监视和监控,以及事件响应缺失或无效,使攻击者能够进一步攻击系统,保持持续性或转向更多系统,以及篡改、提取或销毁数据

  • 未记录可审计事件;告警和错误事件未能产生或产生不足和不清晰的日志信息;日志信息仅在本地存储;没有利用日志信息来监控可疑活动
代码审计与渗透测试的区别和优缺点

代码审计(白盒):系统自身、软件等存在的问题

渗透测试(黑盒):来自外部的入侵

代码审计 渗透测试
描述 发现程序存在的不安全编码 模拟黑客攻击的方式,评估目标系统的安全性
测试目标 基于提供的系统代码,发现代码的安全漏洞 包括但不局限与Web系统
测试产出 代码审计报告并提出修复建议 渗透测试报告和修复建议
优点 全面审查,贴近系统和架构,修复成本低 贴近实际场景,远程渗透
缺点 现场审计 不全面,修复成本高
代码审计的流程
  1. 明确被审计代码使用的语言、技术栈
  2. 使用自动化工具整体扫描,对工具扫描结果进行人工确认
  3. 自动化工具可以帮我们找出部分漏洞,我们还需要人工对源代码进行审计分析,特别要关心源代码的组件(框架、库、模块)的已知漏洞和业务逻辑漏洞
  4. 将工具审计和人工审计的结果写成代码审计报告,并给出漏洞修复意见

1591775972176

Fretity SCA

  • 数据流分析器:跟踪、记录并分析程序中的数据传递过程所产生的安全问题
  • 控制流分析器:分析程序特定时间,状态下执行操作指令的安全问题
  • 语义分析器:分析过程中不安全的函数、方法的使用的安全问题
  • 结构分析器:分析程序上下文环境、结构中的安全问题
  • 配置分析器:分析项目配置中的敏感信息和配置存在的安全问题
代码审计的通用方法
  • 根据敏感关键字回溯参数传递过程,最常用,大多数漏洞由函数使用不当造成
  • 查找可控变量,正向追踪变量传递过程
  • 寻找敏感功能点,通读功能点代码,文件上传,文件管理,登陆认证,找回密码
  • 直接通读全文代码,注意函数集文件,配置文件,安全过滤文件
PHP代码审计:代码分析
XSS
<?php echo $_GET["aa"];?>  反射型xss <script>alert(1)</script>

防护:

HTML实体转换函数

htmlentities(String,flags,character-set,double_encode)

htmlsepcialchars

文件上传

前端校验、Content-type检查、黑名单过滤

防护:

  • 使用MD5对文件名进行重命名,防护00截断攻击

  • 白名单限制文件上传后缀

  • 限制文件上传大小

  • 通过Imagecreatefromjepg()Imagecreatefrompng()函数将上传的文件重新写入到新的图片文件中,抹除有害数据

  • Imagedestory()将上传的源文件删除

  • unlink($temp_file)删除过滤过程中产生的任何临时文件

文件包含

导致文件包含的函数

  • PHP:include、include_once 、require、require_once、fopen、readfile
<?php include($_GET['test']); ?>

PHP伪协议

php://filter   读取文件 
?filename=php://filter/read=convert.base64-encode/resource=xxx.php

file:// 读取本地文件
?f=file://D:/soft/phpStudy/WWW/phpcode.txt

php://input 命令执行 需要allow_url_include:on
post:<?php phpinfo()?>

防护:

  • 在配置中关闭allow_url_fopenallow_url_include选项
代码执行

易造成命令执行的函数和命令连接符

  • exec:不输出结果,返回最后一行shell结果
  • system:输出并返回最后一行shell结果
  • popen、passthru、proc_open、pcntl_exec、shell_exec
  • ; | & %0a `

防护:

  • escapeshellarg:给字符串增加一个单引号且能引用或转码任何已经存在的单引号,确保能将一个字符串传入shell函数,并确保安全

  • escapeshellcmd:对字符串中可能欺骗shell命令执行的字符进行转义,保证用户输入的数据在传送到exec或system函数前转义

  • 黑名单过滤特殊字符或替换字符

CSRF

跨站请求伪造

1591790883979

SSRF

服务器端请求伪造,攻击目标网站的内部系统

原因:服务端提供从其他内部服务器应用获得数据的功能,且没有对目标地址做过滤和限制

  • 内外网端口和服务扫描
  • 主机本地敏感数据读取
  • 内外网主机应用程序漏洞的利用
  • 内外网Web站点漏洞的利用

易造成SSRF的函数:

file_get_contents(将整个文件读入一个字符串)

fsockopen(打开一个网络连接)

curl_exec(执行一个curl会话)

防御:

  • 过滤返回的信息
  • 统一错误信息
  • 限制请求的端口为HTTP常见端口
  • 黑名单内网IP,避免被用来获取内网数据
  • 禁用不需要的协议(file:// gopher:// ftp://),仅使用HTTP和HTTPS
渗透测试的流程和每一步要做的工作
  1. 前期交互阶段:确定渗透测试返回、目标、限制条件
  2. 情报收集阶段:获取目标网络拓扑、系统配置、安全防御措施
  3. 威胁建模阶段:针对获取的信息进行威胁建模与攻击规划
  4. 漏洞分析阶段:综合情报,从扫描查点信息中找出可渗透的具体攻击点
  5. 渗透攻击阶段:利用找出的系统漏洞入侵系统,获取访问控制权限
  6. 后渗透攻击阶段:以特定业务为目标,识别出关键基础设施,并寻找客户最有价值的资产
  7. 报告阶段:确定目标最为重要的威胁,将渗透测试的数据生成表格或图表,对目标系统的改进建议,对问题的修复方案
信息收集的方法

工具:NMAP & Metasploit

  • 端口扫描
  • Banner获取
  • Ping扫描
  • 服务扫描 services
后渗透攻击阶段的目的和任务

扫描内网主机,发现是否存在其他内网主机并尝试渗透

提权

渗透的持久化:添加一个新用户,获取密码,使用MSF安装后门

清楚痕迹,清理日志

渗透测试报告
提权
为什么要提权?

对目标的访问受限,需要目标系统更高的权限

提权的方法和步骤
不同OS下的提权技术

Windows:SYSTEM(最佳),Administrator

  • 利用内核漏洞提权
  • 利用操作系统漏洞提权
    • DLL劫持,劫持某些以高权限启动的程序导入的动态链接库,达到以高权限执行恶意操作的目的
    • 窃取Token,窃取高权限用户的Token,获得高权限
    • 窃取管理员账户密码
    • 允许非特权用户以system权限运行MSI文件,可以使用msf生成包含恶意代码的MSI文件

Linux:root权限 $ –> #

  • SUID程序提权,查找存在SUID标志位的文件
  • 修改用户属组
  • 修改/etc/passwd,用户口令优先读取/etc/passwd,可将root用户密码修改
  • 修改root用户ssh密钥,将自己的ssh密钥写入/root/.ssh
  • 通配符提权
  • 应用程序提权

数据库DB提权,UDF提权

提权的防御
  • 及时打补丁
  • 启动Web、DB服务时以低权限启动(最小权限原则)
  • 服务只监听本地(不要开在公网)

RE(能分析汇编语言代码,能书写简单的汇编代码)

字节序

小端序:低字节低地址 0x100处存放0x01234567

地址 0x100 0x101 0x102 0x103
0x67 0x45 0x23 0x01

大端序:低字节高地址,网络协议采用大端序

地址 0x100 0x101 0x102 0x103
0x01 0x23 0x45 0x67

字符串的存储在大端序和小端序都是一样的

汇编基础(给定代码能说明其含义)

调用一个函数的操作步骤

  1. 调用方将被调用函数所需要的参数放入函数所采用的调用约定指定的位置
  2. 调用方将控制权转交给被调用函数(call),返回地址入栈
  3. 被调用函数为局部变量分配空间
  4. 被调用函数执行操作
  5. 被调用函数完成操作,释放局部变量的空间
  6. 被调用函数将控制权返还给调用方(ret)
调用约定 ** (相关的汇编代码分析和栈的变化情况)
调用约定 调用名称 参数传递顺序 堆栈清理 说明
__cdecl C调用约定 从右向左入栈 调用方 适合参数可变的函数,printf
__Stdcall (微软)标准调用约定 从右向左入栈 被调用方 适合参数固定的函数,dll文件
__fastcall x86 fastcall约定 前两个参数传入ECX和EDX,其余参数从右向左入栈 被调用方 参数可变的函数无法使用
__fastcall x64 fastcall约定 前四个参数传递到RCX,RDX,R8,R9 调用方
__thiscall C++中非静态成员函数 从右向左入栈 被调用方 C++成员函数,this指针存于ECX

系统调用:特殊的函数调用,用于请求一项操作系统服务,通常会造成状态转换,由用户模式进入内核模式,linux x86使用int 0x80指令或sysenter指令启动

64位Windows:寄存器快速调用,前四个参数传递到RCX RDX R8 R9,其余参数从右向左入栈,调用方平衡栈空间

64位gcc前六个参数传入RDI RSI RDX RCX R8 R9

简单的软件保护技术举例
  • 栈破环检测,栈帧中存储一个特殊的cannary值,程序每次运行时随机产生,恢复寄存器和从函数返回前,程序检查该值是否被改变 gcc -fno-stack-protector
  1. 序列化:序列化=F(用户名),修改比较指令绕过,对等函数保护:F2(序列号)=F1(用户名),如果可执行程序可以被修改,都可以通过修改比较指令绕过,要配合软件完整性检查
  2. 警告窗口(Nag):提醒用户购买正版软件的窗口,去除:将警告窗口透明或不可见;跳过创建窗口代码
  3. 时间限制:限制每次运行的时长,计时器机制;限制总运行时长 去除:跳过相关函数;将时间检测后的跳转语句NOP掉
  4. 菜单功能限制:试用版和正式版时完全不同(相同)的版本
  5. KeyFile保护方式:包含用户名,注册信息的小文件,软件每次启动时会读取该文件
  6. 网络验证:把关键数据放在服务器上,软件需要从服务器获取数据才能正确运行
  7. 只运行一个实例:查找窗口法,使用互斥对象,使用共享区块
Windows内核管理

UEFI:统一可扩展固件接口,微型OS,直接读取分区中的文件,不需要MBR(主引导记录)

GPT:全局唯一标识分区符,对分区数量没有限制

R0和R3通信:API被封装在应用层的DLL库中,DLL库中的函数的更底层函数包含在ntdll.dll中,API通过ntdll.dll执行时,完成参数检查,系统调用sysenter,从R3层进入R0层

应用层的命令和数据被系统的I/O管理器封装在IRP中,IRP将R3发送的数据和命令逐层下发到下层的驱动创建的设备对象进行处理,完成相应的功能

移动网络安全

移动网络的分类和安全风险

无线局域网WLAN、无线个域网WPAN、无线体域网WBAN、无线城域网WMAN、无线广域网WWAN

WLAN安全机制

WEP

WEP加密过程:

  1. 生成一个IV(24位),与共享密钥SK(40位)连接在一起作为种子密钥,使用RC4算法生成密钥流
  2. 使用数据冗余校验算法CRC32计算明文数据的ICV
  3. 明文和ICV连接起来,与密钥流异或得到密文

WEP解密过程:

加密:明文+ICV ⊕ 密钥流 —>密文

解密:密文⊕ 密钥流—>明文+ICV

通过CRC32算法计算收到的明文的ICV’,验证ICV是否与ICV’相同,验证数据的完整性

IV:创建一个新密钥流,避免重复使用密钥

存在的安全问题:

  • RC4存在大量的弱密钥,256个密钥中就有一个弱密钥
  • WEP没有抗重放机制,协议帧中没有序列号,无法确定协议帧的顺序
  • SK的产生和分发的问题,没有密钥交换/管理机制
  • IV空间太小,24bit的IV有2^24^种可能,结合生日攻击,发送的包超过2^12^=5000个时,IV就会开始重复,出现IV冲突
  • CRC32是线性的,在k未知的情况下,可任意篡改未知明文的密文,且能保证ICV的正确性
WEP的认证机制
  1. 开放系统认证:把密钥以明文的形式发送给认证方,认证方响应
  2. 共享密钥认证:基于挑战/响应机制
    • 客户端向AP发送认证请求
    • AP向客户端发送明文挑战帧
    • 客户端用WEP密钥加密挑战,发送给AP
    • AP发送认证响应

WEP的破解:Aircrack-ng

IEEE 802.11i
TKIP

暂时密钥完整性协议,使WEP设备通过软件升级来支持TKIP,包裹在WEP外面

改进:

  • IV:24bit—>48bit
  • WEP密钥SK:40bit—>104bit
  • 4个新的算法:
    1. 单包密钥生成算法:防止弱密钥生成
    2. MIC:防止数据被非法篡改
    3. 具有序列功能的IV:防止重放攻击
    4. Rekeying:防止IV重用
认证密钥交换

1591879457665

四步握手

APnonce:AP生成的随机数

Snonce:申请者生成的随机数

MIC:消息认证码

GTK:组瞬时密钥

PTK:对瞬时密钥

握手过程

  1. AP生成随机数APnonce发送给STA
  2. STA生成一个随机数Snonce,利用(APnonce,Snonce,PMK, APA, SA)生成对瞬时密钥PTK,将Snonce和MIC(由PTK中KCK生成)发送给AP,AP收到Snonce和MIC后,使用相同的方法生成PTK,利用PTK的KCK验证MIC,若验证失败,结束过程
  3. 验证成功后,AP将APnonce和MIC发送给STA
  4. SFTA收到后,执行相同的检查工作,确认AP和自己有相同的PMK,确认成功后向AP回发一个MIC

移动通信安全机制–GSM 3g ,4g
GSM

安全目标:

  1. 用户身份认证:保证网络不被未授权者使用
  2. 数据机密性
  3. 用户身份(IMSI)保密,IMSI:国际移动用户标识

GSM的鉴权机制

  1. 用户将自己的IMSI发送给基站(被访问网络),基站将其转发给运营商(宿主网络)
  2. 宿主网络及那根据IMSI查找用户的Ki,使用PRNG(伪随机数生成器)生成伪随机数RNAD。将伪随机数和Ki作为A3和A8两个算法的输入,生成SRES(预期响应)和Kc(会话密钥)
  3. 宿主网络将三元组{随机数RAND,预期响应SRES,会话密钥K~c~}发送给基站,被访问网络将RAND发送给用户
  4. 用户持有Ki和RAND,使用相同的算法生成SRES‘K~c~,并将SRES’发送给基站。基站比对SRESSRES',若相同,则通过验证
  5. 用户和网路使用Kc作为会话密钥进行通信

GSM的不足:

  1. 认证:单向认证,且三元组可无限期使用
  2. 加密:没有实现端到端的加密