安全测试理论

打印 上一主题 下一主题

主题 821|帖子 821|积分 2463

安全测试理论



  • 什么是安全测试?
    1. 安全测试:发现系统安全隐患的过程
    复制代码
  • 安全测试与传统测试区别
    1. 传统测试:发现bug为目的
    2. 安全测试:发现系统安全隐患
    复制代码
  • 什么是渗透测试
    1. 渗透测试:已成功入侵系统为目标的的攻击过程
    复制代码
  • 渗透测试与安全测测似区别
    1. 渗透测试:攻击
    2. 安全测试:防护
    复制代码
  • 怎样进行安全测试(安全测试常用方法)
    1. 1、代码走读:检查代码是否有安全隐患
    2. 2、动态渗透
    3. 3、扫描程序缓存问题
    复制代码
  • 安全测试方面(维度)

客户端安全



  • 常见分类
    1. XSS:跨站脚本攻击
    2. CSRF:跨站请求伪造
    复制代码
XSS



  • 什么是XSS
           跨站脚本(cross site script)为了避免与前端css混淆,改名为xss
       
    1. 攻击者通过改变前端页面元素请求地址或注入JS,来获取非法数据(cookie)。
    复制代码
  • XSS攻击原理



  • XSS可用攻击页面标签

  • 攻击方式分类

    • 存储型:将攻击代码存储到数据库,每次打开指定的页面自动加载执行。
      1. 场景:留言板、注册
      复制代码
    • 反射性:临时修改页面代码,用户打开页面中招。
      1. 场景:图片、连接
      复制代码

  • XSS攻击步骤


  • 核心:查找是否有XSS漏洞
    1. 执行:<script>alert(123)</script>,证明可以执行JS或没有对<进行过滤。
    复制代码
  • 目的:盗取敏感数据,如cookie


  • XSS防护策略

    • 将cookie设置只读(HttpOnly)
    • 输入控制:禁止输入特殊符号(</>'等)
    • 输出控制:过滤或转义特殊符号的输出

  • 总结

    • XSS安全测试办理什么题目?
      1. 避免客户端被注入恶意JS程序或修改标签链接地址,导致数据丢失或访问黑客网站
      复制代码
    • XSS测试职员利用的步骤
      1. 1、验证码页面是否屏蔽了JS的注入
      2. 2、如果存在JS注入,提醒开发防护策略
      复制代码

CSRF(跨站攻击)



  • 什么是CSRF
  1. CSRF(Cross-site request forgery)是指跨站请求伪造攻击
复制代码


  • 目的



  • 原理



  • 攻击操作步骤
  1. 1、获取删除或修改网站数据的接口
  2. 2、在黑客网站上生成一个删除或修改链接(领取优惠券)
  3. 3、黑客在要攻击的网站上生成一个跳转到黑客网站的链接(优惠活动)
  4. 4、用户在黑客网站上领取优惠券
复制代码


  • 测试CSRF步骤
  1. 检查项目是否对请求头->HTTP Referer做校验。后台判断是操作请求来源只能是自己的网站。
复制代码


  • 防御

  1. HTTP Referer:请求头来源的显示,从哪个点击链接访问,会记录链接访问的地址。
复制代码
网络安全

  1. 协议加密
  2. 数据加密
  3. 数据签名
  4. DOS攻击
复制代码


  • 协议加密:常用HTTPS协议(基于HTTP协议之上进行加密传输和证书策略)
  1. 1、数据完整性
  2. 2、数据保密性
  3. 3、安全校验
复制代码


  • 数据加密
  1. 数据加密:md5/AES/DES/自定义
复制代码


  • 数据署名
  1. 特点:对请求数据生成一个无法伪造的字符串,发送给服务器。
复制代码



  • Dos攻击

目的:让目标盘算机或网络无法提供正常的服务或资源访问,使目标体系停止响应乃至瓦解。

  1. 防御:
  2. 1、请求添加访问时间戳,服务器进行判断是否在有效期内,如果在处理,否则不处理。
  3. 2、指定时间内控制请求参数(百度->1秒之内3次)
  4. 3、流量限制(验证码->越模糊越好)
复制代码
用户安全策略

  1. 密码登录:
  2.         ①:session
  3.         ②:token
  4. 其他登录
复制代码


  • 密码

  1. 提示:
  2. 1、密码纯6位数字,有10**6
  3. 2、密码纯8位数字,有10**8
复制代码


  • session

    • 说明:密码登录成功后,服务器可以生成session|token|cookie等认证方式来进行后续认证处理。
    • 特点:session:一次会话(会话竣事session关闭)
    • 危害:如果在session会话有效期内,session被盗取,那么后果是很可怕的(相称于账号密码泄漏)
       

    • 防护策略:

      • 在肯定时间后后台关闭session
      • 雷同用户只能生成1个对象
      • 当用户客户端发生变化(浏览器、ip发生改变)时,要求用户重新登录
      • 养成好的习惯,用户退出后,及时扫除session信息


其他登录策略



  • 多因素策略

  1. 提示:多因素策略一般根据项目类型来定
复制代码
暴力破解



  • 说明:理论来说,是密码就肯定可以通过多次尝试来进行破译,这种称为暴力破解。
  • 提示:暴力破解一般利用密码字典联合自动化步伐来实行。
  • 防护:

权限安全漏洞



  • 危害:容易出现越权操作(检察别人信息、删除他人的信息、检察核心数据)
  • 分类


  1. 提示:权限漏洞主要验证垂直权限(基于用户角色设置权限),水平权限暂时无法验证
复制代码


  • 越权示例:
  1. 张三删除李四的留言信息
复制代码


  • 防护
  1. 服务端在执行操作之前,需要验证权限。
复制代码
应用服务器安全



  • 安全漏洞分类
  1. 1、SQL注入(项目数据库)
  2. 2、文件上传(针对应用服务器代码)
复制代码
SQL注入



  • 说明:sql注入,顾名思义就是通过页面输入sql语句,到达特定的目的
  • 危害:数据库丢失,意味攻击者可以用任何人的账号进行违规操作
  • 原理:



  • 攻击步骤
  1. 1、在页面输入框中查找注入点
  2. 2、注入sql语句
  3. 3、通过sql语句获取项目库名、表名、字段名
  4. 4、通过Mysql数据库自己的库,获取项目库中所有的表、字段、数据
复制代码


  • 安全测试(sql注入),查找注入点
  1. 1、方式1:手动,在输入框中输入',看提示信息。如果提示相关sql报错信息且是语句拼接方式,说明可以sql注入
  2. 2、方式2:使用专业的工具进行扫描
复制代码


  • sql注入防护
  1. 1、对用户的输入数据进行校验
  2. 2、不要动态拼接SQL,使用参数化语句
  3. 3、不要使用管理员权限的数据库连接,为每个应用使用单独的权限进行数据库连接
  4. 4、不要把敏感数据直接保存到数据库中
  5. 5、应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
复制代码
应用服务器(文件上传漏洞)



  • 危害: 获取正向web项目的目录和文件(源代码暴露)
  • 原理:

    • 1、利用上传功能,上传恶意文件
    • 2、执行恶意文件
    • 3、获取项目源代码

  • 防护:

数据库安全



  • 安全防护策略
  1. 数据库备份和恢复
  2. 敏感数据加密
  3. 审计追踪机制
  4. 认证和权限控制
复制代码


  • 数据备份和恢复
  1. 数据库必须有备份,正常1天1个备份
复制代码


  • 敏感数据加密
  1. 用户数据在传输和存储过程都需要进行加密
复制代码


  • 审计追踪机制
  1. 对数据库操作,尤其是(删除、修改、新增)操作,必须有日志记录
复制代码


  • 认证和权限控制
  1. 不能给root权限
  2. 文件操作必须有权限控制
复制代码
接口加解密



  • 加解密说明



  • 思考?如果要对加解密怎么做?
  1. 1、找开发拷贝加密和解密工作
  2. 2、确定工具如何使用(如何加密、如何解密)
  3. 3、明确请求示例(请求参数格式及使用)
复制代码
接口-案例



  • 案例
  1. 接口说明:登录接口
  2. 请求方法:POST
  3. 请求参数类型:form
  4. url:"http://mobile-p2p-test.itheima.net/phone/member/login"
  5. 请求参数
  6. data={
  7. "member_name":"13012345678",
  8. "password":"test123"
  9. }
复制代码


  • 未加密解密
  1. import requests
  2. url="http://mobile-p2p-test.itheima.net/phone/member/login"
  3. data={
  4.     "member_name":"13012345678",
  5.     "password":"test123"
  6. }
  7. result=requests.post(url,data=data)
  8. print(result.json())
复制代码

加解密应用示例



  • 步骤
  1. 1、找开发拷贝加密和解密工作
  2. 2、确定工具如何使用(如何加密、如何解密)
  3. 3、明确请求示例(请求参数格式及使用)
复制代码


  • 1、加解密工具



  • 2、确定工具怎样利用



  • 3、明确请求示例



  • 加解密应用示例:
  1. import requests
  2. from EncryptUtil import EncryptUtil
  3. url="http://mobile-p2p-test.itheima.net/phone/member/login"
  4. data={
  5.     "member_name":"13012345678",
  6.     "password":"test123"
  7. }
  8. # 1、对请求参数进行加密
  9. diyou =EncryptUtil.get_diyou(data)
  10. # 2、对加密后的数据进行签名
  11. xmdy = EncryptUtil.get_xmdy(diyou)
  12. # 3、调用请求 参数格式("xmdy":"签名","diyou":"加密后的数据")
  13. result=requests.post(url,data={"xmdy":xmdy,"diyou":diyou})
  14. # 4、响应数据解密
  15. diyou =result.json().get("diyou")
  16. print("--" * 50)
  17. print("解密后的数据",EncryptUtil.aes_decrypt(diyou))
复制代码


  • EncryptUtil.py
  1. import base64
  2. import hashlib
  3. import json
  4. import re
  5. from Crypto.Cipher import AES
  6. # 加解密工具类
  7. class EncryptUtil:
  8.     # 发送请求时,加密密码
  9.     SEND_AES_KEY = ";3jm$>/p-ED^cVz_j~.KV&V)k9jn,UAH"
  10.     # 发送请求时,签名密钥
  11.     SEND_SIGN_KEY = "DY34fdgsWET@#$%wg#@4fgd345sg"
  12.     # 接收数据时,解密密钥
  13.     RECEIVE_AES_KEY = "54Ms5bkE6UEdyrRviJ0![OR]g+i79x]k"
  14.     @staticmethod
  15.     def padding_pkcs5(value):
  16.         BS = AES.block_size
  17.         return str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS))
  18.     # 替换空字符
  19.     @staticmethod
  20.     def replace_blank(str_data):
  21.         str_data = re.compile("\t|\r|\n").sub("", str_data)
  22.         print("replace_blank str_data=", str_data)
  23.         return str_data
  24.     @staticmethod
  25.     def aes_encrypt(key, data):
  26.         """
  27.         AES加密
  28.         :param key: 密钥
  29.         :param data: 待加密数据
  30.         :return: 加密后数据
  31.         """
  32.         data = base64.encodebytes(data.encode()).decode()
  33.         # 替换特殊字符
  34.         data = EncryptUtil.replace_blank(data)
  35.         print("data=", data)
  36.         # 初始化加密器
  37.         aes = AES.new(key.encode(), AES.MODE_ECB)
  38.         # 加密
  39.         padding_value = EncryptUtil.padding_pkcs5(data)
  40.         encrypt_aes = aes.encrypt(padding_value)
  41.         # 用base64转成字符串形式
  42.         encrypted_text = base64.encodebytes(encrypt_aes).decode()
  43.         return encrypted_text
  44.     @staticmethod
  45.     def aes_decrypt(key, data):
  46.         """
  47.         AES解密
  48.         :param key: 密钥
  49.         :param data: 待解密数据
  50.         :return: 解密后数据
  51.         """
  52.         # 初始化加密器
  53.         aes = AES.new(key.encode(), AES.MODE_ECB)
  54.         # 优先逆向解密base64成bytes
  55.         base64_decrypted = base64.decodebytes(data.encode())
  56.         # 执行解密
  57.         decrypted_bytes = base64.decodebytes(aes.decrypt(base64_decrypted))
  58.         # 转换为字符串
  59.         decrypted_text = str(decrypted_bytes, encoding="utf-8")
  60.         # 把Unicode转成中文
  61.         result = decrypted_text.encode().decode("unicode_escape")
  62.         return result
  63.     @staticmethod
  64.     def md5value(data):
  65.         print("md5value data=", data)
  66.         md5 = hashlib.md5()
  67.         md5.update(data.encode())
  68.         return md5.hexdigest()
  69.     # 加密调用
  70.     @staticmethod
  71.     def get_diyou(data):
  72.         # 把字典转换为JSON字符串
  73.         if isinstance(data, dict):
  74.             data = json.dumps(data)
  75.         aes_encrypt_data = EncryptUtil.aes_encrypt(EncryptUtil.SEND_AES_KEY, data)
  76.         return EncryptUtil.replace_blank(aes_encrypt_data)
  77.     # 签名调用
  78.     @staticmethod
  79.     def get_xmdy(data):
  80.         return EncryptUtil.md5value(
  81.             EncryptUtil.SEND_SIGN_KEY + EncryptUtil.replace_blank(data) + EncryptUtil.SEND_SIGN_KEY)
  82.     # 解密调用
  83.     @staticmethod
  84.     def decrypt_data(data):
  85.         return EncryptUtil.aes_decrypt(EncryptUtil.RECEIVE_AES_KEY, data)
  86. if __name__ == '__main__':
  87.     # 加密
  88.     send_data = {}
  89.     content = json.dumps(send_data)
  90.     diyou = EncryptUtil.get_diyou(content)
  91.     print("diyou=", diyou)
  92.     xmdy = EncryptUtil.get_xmdy(diyou)
  93.     print("xmdy=", xmdy)
复制代码
加密解密标准



  • 说明:加密标准常用美国联邦政府高级密码标准(AES)
  • 安装:
  1. pip install pycryptodome==3.9.6 -i https://pypi.douban.com/simple
复制代码


  • 提示:拿到工具如果报错提示缺少库,须要跟开辟确定安装的依赖库。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表