常见安全测试
目录
客户端脚本安全测试
跨站脚本攻击
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语句的执行,使用参数化的方式来完成,也不使用拼接
测试点:
- UI界面: 文本输入框
- 接口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>
数据库安全性测试
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/16218491.html