
周报08
JSON
1.JSON两种核心结构
• 对象(Object):用 {} 包裹,由键值对(key: value)组成,键必须是双引号包裹的字符串,键值对用逗号分隔;表示“实体”(如用户、商品),键对应属性,值对应属性值 {"name": "Alice", "age": 25}
• 数组(Array):用 [] 包裹,元素用逗号分隔,元素类型可不同(对象、数组、基本类型均可) ;表示“列表”(如用户列表、商品列表) [{"name": "Bob"}, {"name": "Charlie"}]
2. 支持的 6 种数据类型(Value 类型):字符串、数字、布尔值、null、对象、数组
3. 语法禁忌(常见错误)
键必须用双引号("key": value 合法,key: value 或 'key': value 非法);
末尾不能有多余逗号(如 {"a": 1, "b": 2,} 非法);
不支持注释(// 或 /* */ 都会导致解析失败,如需注释需借助工具或额外字段);
不支持函数、日期对象(日期需转为字符串,如 "date": "2024-05-01")。
漏洞
访问控制崩溃
通过身份验证的用户,可以访问其他用户的相关信息,没有实施恰当的访问权限。攻击者可以利用这个漏洞去查看未授权的功能和数据,
eg:访问用户的账户、敏感文件、获取和正常用户相同的权限等.
• 通过修改URL、内部应用程序状态或 HTML 页面绕过访问控制检查,或简单地使用自定义的 API 攻击工具。
• 允许将主键更改为其他用户的记录,例如查看或编辑他人的帐户。
• 特权提升。在不登录的情况下假扮用户,或以用户身份登录时充当管理员。
• 以未通过身份验证的用户身份强制浏览的通过身份验证时才能看到的页面、或作标准用户访问具有相关权限的页面、或API没有对POST、PUT和DELETE强制执行访问控制。
防范:
访问控制只有在受信服务器端代码或没有服务器的 API 中有效,这样这样攻击者才无法修改访问控制检查或元数据。
•除公有资源外,默认情况下拒绝访问。
•严格判断权限,用户只能操作属于自己的内容。
•记录失败的访问控制,并在适当时向管理员告
警(如:重复故障)。
对API和控制器的访问进行速率限制,以最大限度地降低自动化攻击工具的危害。
•当用户注销后,服务器上的JWT令牌应失效。
sql注入
注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的执行语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令目的的入侵行为。如利用SQL命令可以进行查询查询、插入、删除等操作,直接将这些命令拼接起来。
例如:
SELECT * From Table WHERE Name=' XX' and Password=' YY'
如果这条语句为真的话就登录成功
有人在user ID 那里输入了这么一行代码:
Admin’or 1=1#
整个语句就变成了:
Select * from Table where Name= 'Admin' or 1=1 # 'and Password=' YY'
sql注入分类:
基于数据类型的分类
• 字符串类型注入
• 整型注入
基于程度和顺序的注入
• 一阶注射
• 二阶注射
• 1='1'false
基于从服务器接收到的响应
基于错误的SQL注入
联合查询的类型
堆查询注射
SQL盲注
• 基于布尔SQL盲注
• 基于时间的SQL盲注
• 基于报错的SQL盲注
SQL注入的常见检测字符:
•‘(单引号)
•“(双引号)
•--+(注释)
•#(注释)
•and(与)
•or(或)
•xor(非)
SQL注入的思路:
•1.判断是否存在注入,注入是字符型还是数字型
•2.猜解SQL查询语句中的字段数
•3.确定显示的字段顺序
•4.获取当前数据库
•5.获取数据库中的表
防范:
1.关闭SQL错误回显
2.使用成熟的waf
3.前端输入字符白名单验证(长度、类型等)
4.SQL服务运行于专门的账号,并且使用最小权限
5.对输入的特殊字符使用转义处理
xss漏洞
分类:
反射型--前端->后端->前端(输入内容能影响页面展示js危害较大)
存储型--前端->后端->数据库->前端
DOM型-前端
反射xss例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>XSS-</title>
//初始缩放比为1,使网页根据设备宽度自适应显示
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>
function setCookie(name,value) {
//cookie有效期30天
var Days = 30;
//创建日期对象
var exp = new Date();
//计算30天后的时间
exp.setTime(exp.getTime() + Days*24*60*60*1000);
//把cookie存到浏览器中
document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
}
setCookie("xssCookie","xssValue");
</script>
</head>
<body>
<h1>反射型XSS:</h1>
//创建表单,提交后内容发送到/xss处
<form action="/xss" method="get">
//文本输入框,初始显示xss1
<input type="text" name="xss1"/>
//提交按钮,按钮上显示test
<input type="submit" value="test"/>
</form>
</body>
</html>
<?php
//关闭错误提示
error_reporting(0);
//将输入框中得到的xss1赋给$xss
$xss = $_GET['xss1'];
//如果不为空则输出
if($xss!==null){
echo $xss;
}
?>