首页 > 其他分享 >特殊字符:安全攻防中容易遗漏的细节

特殊字符:安全攻防中容易遗漏的细节

时间:2023-12-14 11:48:01浏览次数:36  
标签:攻防 字符 遗漏 校验 全角 过滤 特殊字符 输入

本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-特殊字符校验》,作者: MDKing。

特殊字符校验的背景

  • SQL注入、XSS等常见的安全攻击场景会涉及到一些特殊字符的利用。尤其是界面输入框、API接口可支持输入字符串的情况,如果对来历不明的用户输入如果不加防范,很容易产生安全问题。

  • 正确的做法是在根据业务流程在各个环节添加合适的安全防护、处理逻辑。例如:对于输入的字符串参数做一定的参数校验、对参与执行SQL操作的参数进行预编译、对于参与界面回显的参数针对回显的上下文领域做对应领域的编码等。

  • 由于根据不同的业务流程需要针对特殊字符做的安全防护各有不同,相应的设计、实现等成本较高,所以通常大家会倾向于尽量在第一道防线(参数校验)上解决大部分的问题,降低后续流程处理的工作量跟难度。所以本文旨在分析探讨如何在参数校验阶段,设计好针对不可信字符串的校验、过滤,尤其是特殊字符相关的校验。

特殊字符校验的原则

参考华为Web应用安全开发规范:确保输入数据只包含允许的字符集,不包含不合法和危险的字符,尽可能采取“白名单”的方式进行输入校验。

总体思路是分两种情况:

  1. 输入范围较为明确的字段,如XXid、XXname、邮箱、手机号等。可以明确列出允许输入范围的,要使用白名单的校验方式。例如如果对于用户名只允许包含字母、数字和下划线,则可以使用正则表达式对输入做白名单校验:^[0-9A-Za-z_]+$

  2. 输入范围较大、较不明确的字段,如备注、富文本内容等,由于全量的特殊字符(包括键盘可直接输入、键盘不可直接输入)集数量还是非常大的,当业务上也没法通过简单的白名单枚举的方式枚举出合法字符的范围时,就需要根据业务流程,选择相关的危险字符,进行黑名单的过滤校验。例如,存在一个remark字段用户保存后会展示在界面上被其他用户看到,此时我们要对XSS做重点关注,我们可以通过如下正则校验字符串是否不包含指定的危险字符^[^"'()<>/&=]+$。

延伸:注意,参数校验只是为了低成本的一次性解决大部分的问题,不能完全强依赖这个环节的校验,也不能强求这个校验把所有的有可能出现风险的字符都包含全。比如,上例的remark如果业务上就是需要输入(、)、=等符号怎么办?难道就是不允许输入吗?也是不合理的。所以对于XSS注入防护的终极方案依然是在渲染前做字符编码,这样既能支持多数字符的输入,又不会有安全问题。所以还是建议特殊字符校验只选择最通用危险的少量特殊字符,配合其它的安全防护(比如字符编码、SQL预编译等)。

常见安全场景对应的危险特殊字符表

使用指导:在做安全评估时,可将字母、数字、中文以及无安全攻击场景的字符作为安全最小集,如果不涉及自定义拼接SQL,可以忽略第一列。

 
特殊字符 SQL注入攻击 XSS 命令注入 文件包含攻击 XXE URL编码攻击 CSV注入
, 需过滤            
.       需过滤      
?              
! 需过滤   需过滤        
:              
; 需过滤   需过滤 需过滤      
" 需过滤 需过滤     需过滤    
' 需过滤 需过滤     需过滤    
( 需过滤 需过滤 需过滤        
) 需过滤 需过滤 需过滤        
[ 需过滤            
]              
{              
}              
< 需过滤 需过滤 需过滤   需过滤    
> 需过滤 需过滤 需过滤   需过滤    
- 需过滤           需过滤
_ 需过滤            
/ 需过滤 需过滤 需过滤 需过滤 需过滤 需过滤  
\ 需过滤   需过滤 需过滤      
| 需过滤   需过滤        
@ 需过滤           需过滤
#              
$     需过滤        
% 需过滤         需过滤  
^ 需过滤            
& 需过滤 需过滤 需过滤        
* 需过滤            
+ 需过滤         需过滤 需过滤
= 需过滤 需过滤         需过滤
~ 需过滤            
`     需过滤        
空格     需过滤 需过滤      
换行     需过滤        

特殊字符实战

半角/全角之别

除了汉字是默认全角之外,其它很多字符,比如字母、数字、标点符号都是有半角/全角之分的,大家最常用的是半角,全角不常用。但是如果是涉及到写黑白名单的正则的时,如果不知道其中的差别,会导致写错。

在UE中可以显示字节长度,我们分别输入字母、数字、标点符号的半角(占一个字节宽度)、全角(占两个字节宽度)形式,对比如下:

1.png

通过如下验证,可以发现,^[a-zA-Z0-9,.]+$ 只能只能匹配半角的字符,全角的是没法匹配的。

2.png

想要匹配全角的字母,数字,可以使用^[\uFF21-\uFF3A\uFF41-\uFF5A\uFF10-\uFF19]+$,实际验证如下:

3.png

回车/换行符之别

回车(\r):CR(Carriage Return的缩写,ASCII码是13,16进制对应0D),告诉打字机需要“把打印头定位在行首”

换行(\n):LF(Line Feed的缩写,Ascii码是10,16进制对应0A),告诉打字机“把打印纸向下移动一行”

源自于二战中美国使用的打字机,电子计算机问世后,这两个概念也同时被引入。因为存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就够了。从此,计算机界就出现了分歧:

  • 微软Windows系统:每行结尾有“<回车><换行>”,即“\r\n”

  • Unix/Linux系统: 每行结尾只有“<换行>”,即"\n"

  • 苹果Mac系统: 每行结尾只有“<回车>”,即"\r"

如果不清楚这些概念,很容易导致写错正则表达式。我们分别在window、linux系统上创建文件,内容为AB{换行}AB。如下,通过肉眼是看不出区别的:

4.png 5.png

在UE中按下Ctrl+H可查看二进制,如下可以看到window文件的换行符实际上为0D 0A,即\r\n。

6.png

linux文件的换行符只有一个0A,即\n

7.png

通过代码将文件内容读取后,使用正则表达式做判断,发现^[AB\nAB]+$只能成功匹配linux下的文件。

8.png

通过debug也能看到两个文件读取出来的具体内容

9.png

点击关注,第一时间了解华为云新鲜技术~

 

标签:攻防,字符,遗漏,校验,全角,过滤,特殊字符,输入
From: https://www.cnblogs.com/huaweiyun/p/17900867.html

相关文章

  • 【Web攻防之业务安全实战指南】第5章 业务办理模块测试
    5.1订单ID篡改测试5.1.1测试原理和方法在有电子交易业务的网站中,用户登录后可以下订单购买相应产品,购买成功后,用户可以查看订单的详情。当开发人员没有考虑登录后用户间权限隔离的问题时,就会导致平行权限绕过漏洞。攻击者只需注册一个普通账户,就可以通过篡改、遍历订单id,获得其......
  • “古剑山”第一届全国大学生网络攻防大赛-Crypto WP
    CryptobabyRSA题目信息p=10557060480607393156040418736281630895040877491596075167695884580033587151860045514604024031420460694464109891485815938658886878598710052458169904360535195234858613255345870229839390747695594699084944203444188274827818114850332930966......
  • 湖南省网络攻防邀请赛 RE 题解
    ez_apkk解题过程:将apk拖入jadx,查看MainActivity,发现是简单RC4加密,密钥是“55667788”,最后再将加密结果+1publicStringEncrypt(StringplainText,Stringkey){int[]S=newint[256];byte[]K=newbyte[256];char[]cArr={'\n','+',18......
  • CTfpwn攻防世界int_overflow对于strlen的利用以及汇编是神
    分析这题题目已经在暗示用int数据的overflow了,不过不急,先分析一下。保护基本没啥保护,也挺好,适合不用搞太多花里胡哨的泄露,只需理解这题想告诉你的知识。后门函数看到有一个whatisthis函数,正是我们要的catflag函数。main函数login函数main函数里需要的操作很简单,只需输入一个1就......
  • 攻防世界 supersqli
    打开页面,发现有GET请求传递的SQL,依次尝试"1'--","1'#",从报错可知,#成功注释。构造payload:1';showdatabases;#,成功,判断存在堆叠注入。尝试SELECT,发现查询语句都被过滤了,思考绕过。对select*from`1919810114514`;进行16进制编码,获得0x73656C656374202A206......
  • js中get请求参数含有特殊字符的处理
    在拼接参数的时候,使用 encodeURIComponent() 进行手动转义。varurl="xxxx?name="+encodeURIComponent("aaa&bbb")特殊特殊字符的含义:字符特殊字符的含义URL编码+URL中+号表示空格%2B空格URL中的空格可以用+号或者编码%20/分隔目录和子目录%2F?分隔......
  • url特殊字符传递参数解决方法(特指超链接)
    需要进行转码:十六进制值1.+URL中+号表示空格%2B2.空格URL中的空格可以用+号或者编码%203./分隔目录和子目录%2F4.?分隔实际的URL和参数%3F5.%指定特殊字符%256.#表示书签%237.&URL中指定的参数间的分隔符%268.=URL中指定参数的值%3D//带有特殊字符的......
  • 无涯教程-Sed - 特殊字符
    SED提供了两个特殊字符,它们被视为命令。本章说明了这两个特殊字符的用法。=命令"="命令显示行号。以下是"="命令的语法:[/pattern/]=[address1[,address2]]==命令将行号及其内容写入标准输出流。以下示例说明了这一点。[jerry]$sed'='books.txt执行上述代码后,您将......
  • [转]SSH框架 Struts2 过滤特殊字符,防止xss攻击
    原文地址:基于Struts2修复XSS漏洞(博主验证有效)_struts2xss-CSDN博客1.编写XssFilterimportjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servl......
  • mysql中删除数据中的特殊字符
    --此字符只影响终端的查询,如crt,xshell等,在navicat中不受影响selectstr,replace(str,char(13),'')asstr_fixfrom(selectconcat('1',char(13),'2')asstr)t1;......