MENU

安全漏洞修复建议汇总[持续更新]

November 12, 2018 • 安全技术阅读设置

写在前面

  每次进行渗透测试报告编写的时候,都会涉及到每个漏洞的修复建议,在实际中的代码修复要根据业务场景、缺陷产生的原因等多个因素进行修复,即所谓“见招拆招”。

  但其实每一种类型的漏洞修复建议其实都是大同小异的。因此在这里进行一个汇总,针对那些相同类型的漏洞每次直接使用即可。

具体漏洞修复建议

空指针解引用

  1. 程序对非受信的用户输入数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,过滤非法字符。
  2. 对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。
  3. 合理配置 web 服务器的目录权限。

SQL注入

  1. 使用预编译处理输入参数:要防御 SQL 注入,用户的输入就不能直接嵌套在 SQL 语句当中。使用参数化的语句,用户的输入就被限制于一个参数当中。
  2. 输入验证:检查用户输入的合法性,以确保输入的内容为正常的数据。
    数据检查应当在客户端和服务器端都执行,之所以要执行服务器端验证,是因为客户端的校验往往只是减轻服务器的压力和提高对用户的友好度,攻击者完全有可能通过抓包修改参数或者是获得网页的源代码后,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器等等手段绕过客户端的校验。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。但是这些方法很容易出现由于过滤不严导致恶意攻击者可能绕过这些过滤的现象,需要慎重使用。
  3. 加密处理:将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入 SQL 命令。
  4. 错误消息处理:防范 SQL 注入,还要避免出现一些详细的错误消息,恶意攻击者往往会利用这些报错信息来判断后台 SQL 的拼接形式,甚至是直接利用这些报错注入将数据库中的数据通过报错信息显示出来。

路径遍历

  1. 程序对非受信的用户输入数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,过滤非法字符。
  2. 对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。
  3. 合理配置 web 服务器的目录权限。

内存泄漏

  1. 在允许的情况下,尽量避免手动管理内存,如在 C++ 开发中,使用智能指针可以减少内存泄漏的发生。
  2. 在代码编写过程中养成良好的编程习惯,保证malloc/new 和 free/delete 匹配使用。
  3. 在同一个模块、同一个抽象层中分配内存和释放内存。
  4. 使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的内存泄漏问题。

XML外部实体注入

  1. 尽可能使用简单的数据格式(如:JSON),避免对敏感数据进行序列化;
  2. 及时修复或更新应用程序或底层操作系统使用的所有XML处理器和库。同时,通过依赖项检测,将SOAP更新到1.2版本或更高版本;
  3. 在应用程序的所有XML解析器中禁用XML外部实体和DTD进程,具体实现可以参考《OWASP Cheat Sheet ‘XXE Prevention’》(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet)
    如下代码是java应用程序中使用DocumentBuilderFactory解析xml时防范XXE漏洞的示例:1538986431_5bbb11bf80614.jpg
  4. 输入校验:在服务器端使用白名单进行输入验证和过滤,以防在XML文档、标题或节点中出现恶意数据。
  5. 验证XML和XSL文件上传功能是否使用XSD验证或其他类似验证的方法来验证上传的XML文件
  6. DAST工具需要额外的手动步骤来检查和利用XXE漏洞,而使用ASAT工具可以通过检测依赖项和安全配置来发现XXE漏洞。

越界访问

  1. 进行有效的边界检查,确保操作在合法的范围之内。尤其当使用外部输入数据作为数据源进行内存相关操作时,应格外注意进行边界检查,污染数据是造成越界访问的重要原因之一。
  2. 显式的指定数组边界,不仅可以使程序的可读性提高,同时,大多数的编译器在数组长度小于初始化值列表的长度时会给出警告,这些警告信息可以帮助开发人员尽早发现越界问题。
  3. 在使用循环遍历数组元素时,注意防范 off-by-one(一个字节越界)的错误。
    程序对非受信的用户输入数据进行净化,删除不安全的字符。

命令注入

  1. 创建一份安全字符串列表,限制用户只能输入该列表的数据。
  2. 不要让用户直接控制eval()、 esec()、 readObject() 等函数的参数。
  3. 使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的命令注入问题。

缓冲区上溢

(1)尽量避免使用不安全的内存操作函数。如:

函数举例
有关字符串拷贝的APIstrcpy、 wcscpy、 _tcscpy、 _mbscpy、StrCpy、StrCpyA、StrCpyW、lstrcpy、lstrcpyA、lstrcpyW、strcpyA、strcpyW、 _tccpy、 _mbccpy
有关字符串合并的APIstrcat、wcscat、 _tcscat、_mbscat、StrCat、StrCatA、StrCatW、lstrcat、lstrcatA、lstrcatW、StrCatBuffW、StrCatBuff、StrCatBuffA、StrCatChainW、strcatA、strcatW、 _tccat、 _mbccat
有关 sprintf 的APIwnsprintf、 wnsprintfA、wnsprintfW、sprintfW、sprintfA、wsprintf、wsprintfW、wsprintfA、sprintf、swprintf、 _stprintf

(2)在向缓冲区中填充数据时必须进行边界检查。尤其当使用外部输入数据作为数据源进行内存相关操作时,应格外注意进行边界检查,污染数据是造成缓冲区上溢的重要原因之一。

参考链接

  1. 《缺陷周话》第1期:空指针解引用
  2. 《缺陷周话》第2期:SQL注入
  3. 《缺陷周话》第3期:内存泄漏
  4. 《缺陷周话》第4期:XML外部实体注入
  5. 《缺陷周话》第5期:越界访问
  6. 《缺陷周话》第6期:命令注入
  7. 《缺陷周话》第7期:缓冲区上溢
Archives QR Code
QR Code for this page
Tipping QR Code