渗透测试简单总结
web请求基本概念
- 请求行
- Request-Line = Method SP Request-URI SP HTTP-Version CRLF
- 请求头
- 常见请求头
- 不同请求头取值的特殊含义
- 请求体
- 二进制文件上传的编码方式
- (响应)状态行
- status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
- 响应头
- 响应体
常见漏洞
- 脆弱的访问控制
- 认证和会话管理缺陷
- 文件包含
- XXE注入
- 反序列化漏洞
- 第三方组件缺陷
特性被滥用或无用导致的【漏洞】
- 文件上传
- XXE
- 文件包含
- 反序列化
常见的输入篡改攻击
- 强制浏览
- 命令注入
- 跨站脚本攻击
- 缓冲区溢出攻击
- 格式化字符串攻击
- SQL注入
- Cookie毒化
- 隐藏域控制
输入篡改攻击的成因
- 只在客户端进行输入验证
- 过滤时未进行规范化
- 过滤后引入新的漏洞
安全加固方案
-
所有用户输入需要在服务器端进行集中的统一验证
- HTTP请求行
- HTTP请求头
- HTTP请求体
-
代码复查
-
不要“滥用”隐藏域
- 存储在Session中或从每次请求中获取参数值
-
请求参数需要严格的验证其类型
- 数据类型(string、integer,real,etc...)
- 最小和最大长度
- 是否运训null
- 参数是否是必须的
- 数字的取值范围
- 特定模式(正则表达式)
- 白名单机制
-
服务器返回给客户端的重要参数、赋值使用HMAC进行参数签名
- 千万不要使用MD5、SHA-xxx之类的摘要算法对参数进行摘要计算,也不要使用基于“秘密盐值”的MD5、SHA-xxx之类的摘要算法对参数进行摘要计算
- [HASH长度扩展攻击可以用来伪造消息和对应散列值][https://ciphersaw.me/2017/11/12/Hash Length Extension Attack(哈希长度扩展攻击)/]
- 对客户端提交的请求校验关键逻辑代码中的参数,一旦
消息完整性签名
校验失败,说明客户端尝试篡改请求参数攻击,代码逻辑直接跳过后续业务逻辑代码,给客户端返回统一的错误信息
- 千万不要使用MD5、SHA-xxx之类的摘要算法对参数进行摘要计算,也不要使用基于“秘密盐值”的MD5、SHA-xxx之类的摘要算法对参数进行摘要计算
-
对每个需要验证的请求进行检查,不仅是在用户第一次登录请求时进行检查
-
避免使用自己开发的访问控制,而是使用开发框架内置或第三方可靠安全访问控制框架
- 采用声明式而非硬编码的访问控制
- 集中化访问控制而非分散访问控制
-
防止客户端缓存重要内容:设置HTTP响应头和
HTML meta
标签 -
在服务器端使用操作系统提供的访问控制保护文件的未经授权的访问
-
业务模型的访问控制授权建模
- 访问控制权限划分的三角形基本法则
-
平行权限访问
- 属主权限检查
-
提升权限访问
- 使用ACL
会话攻击
-
会话预测(Session Prediction)指的是攻击者可以【预测】出服务端的合法【会话令牌】,从而达成身份冒用的效果。
-
会话劫持(Session Hijacking)可以通过中间人劫持攻击或跨站点脚本攻击方式拿到用于会话唯一标识的【会话令牌】
-
会话偷渡(Session Riding)是
跨站请求伪造(CSRF)
的另一种表述 -
攻击者不需要克隆受害用户的会话,攻击者一次会话头东攻击只是借用受害用户保存在客户端的【会话令牌】执行一次受害用户不知情的认证会话操作,攻击者对于受害用户使用的【会话令牌】具体是什么并不知情。
文件上传漏洞
- 对于某些类型文件
- 禁用上传目录的脚本执行权限
以Apache为例,可以使用.htaccess
,但是使用.htaccess
防御文件上传漏洞存在副作用,攻击者上传精心构造的.htaccess
来使得[上传目录]下对特定文件类型开启脚本解释执行功能。
- 即使
- 检查是否判断了上传文件类型及后缀
- 定义上传文件类型白名单
- 文件上传目录禁止脚本解析
- 仍然推荐
- 定义文件名白名单
- 上传后统一重命名
- 杜绝XSS漏洞、文件包含漏洞、字符编码漏洞...
文件包含漏洞
C语言头文件
python import的模块或包
......
- 插件功能需要【动态加载执行代码】
- 当攻击者可以控制【加载什么代码】的时候,就触发了
文件包含漏洞
- 几乎所有脚本语言都会提供文件包含功能,但PHP语言由于其过于灵活和自由的代码执行继指导致了大多数文件包含类漏洞都是出现在PHP编写的网站程序之中。
PHP文件包含漏洞
- include()
- require()
- include_once()
- require_once()
上述四个PHP函数都可以传入【变量】来动态加载PHP源代码文件。且既可以是【本地文件】,也可以是【远程文件】。
PHP本地文件包含执行代码不依赖于修改PHP的默认运行时配置即可完成认以PHP代码执行。
通过文件上传漏洞上传恶意脚本文件,通过文件包含漏洞去执行脚本。
将恶意脚本文件保存到某个网址下面,通过文件包含漏洞去执行该脚本。
防御PHP文件包含漏洞
- 修改PHP的运行时配置文件
php.ini
- 开启
open basedir
函数,将其设置为指定目录,则只有该目录的文件允许被访问 allow_url_include=Off
禁止远程文件包含- 从代码级别避免及修复文件包含漏洞
- 过滤文件包含路径变量的输入,采用白名单方式包含文件
- 建议禁止从外部输入读取包含文件的路径
- 开启
XXE漏洞
XML
代码中包含了加载外部资源的【恶意变量声明】- 服务端代码在解析
XML
代码时无限制解析【恶意变量】声明语句 - 【恶意变量】的值被回显
XXE漏洞危害
- 敏感数据泄露(任意文件读取)
- 拒绝服务攻击
- 服务端请求伪造
- 远程代码执行
- 执行应用程序托管服务器的网络端口扫描
python XML解析器其他漏洞类型

序列化
序列化是将应用程序对象状态转换为二进制数据或文本数据的过程。
反序列化则是其逆向过程,即从二进制数据或文本数据创建对象状态。
应用程序使用该功能来支持有效共享或存储对象状态
。
变化的是数据,类和方法存在于后端代码中。
反序列化应用场景
- 分布式系统的【远程过程调用】,传参:通过网络传输【对象】
- 游戏的进度存档(序列化)与读档(反序列化)
反序列化漏洞
- 攻击者通过创建恶意的反序列化对象,在应用程序执行序列化时,远程执行代码和篡改数据。
- 使用不可信来源的对象序列化的分布式应用程序和API特别容易受到反序列化攻击。
案例:[python编写的SQL注入自动化利用神奇Sqlmap存在的Pickle反序列化漏洞导致代码执行报告][https://blog.knownsec.com/2015/12/sqlmap-code-execution-vulnerability-analysis/]
PHP对象序列化基本概念
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
不要被不可打印字符欺骗了
- protected属性字段age左边的
*(2a)
字符的左右两边被不可打印字符