应用软件安全编程
奔跑的老人吴
这个作者很懒,什么都没留下…
展开
-
应用软件安全编程--28SSL 连接时要进行服务器身份验证
当尝试连接到 smtp.testemail.com:25 时,此应用程序将随时接受颁发给"hackedserver.com" 的证 书。此时,当服务器被黑客攻击发生 SSL 连接中断时,应用程序可能会泄露用户敏感信息。对 SSL 连接时要进行服务器身份验证的情况,示例1给出了不规范用法(Java 语言)示例。在某些使用SSL 连接的库中,默认情况下不 验证服务器证书。这相当于信任所有证书。当进行 SSL 连接时,需要注意进行服务器验证检查。根据所使用的库,验证服务器身份并建立安 全的 SSL 连接。原创 2023-11-23 10:27:29 · 1085 阅读 · 0 评论 -
应用软件安全编程--27避免使用 DNS 名称作为安全性的依据
对避免使用DNS 名称作为安全性的依据的情况,示例给出了不规范用法(Java 语言)示例。程序中采用DNS 名称进行安全认证,但 DNS 名称是容易被攻击者进行欺骗的。以上代码片段中,如果发生 DNS 欺骗,会绕过安全验证。不要依赖 DNS 名称进行安全认证。原创 2023-11-23 10:26:12 · 299 阅读 · 0 评论 -
应用软件安全编程--26不要硬编码敏感信息
硬编码如密码、服务器 IP 地址、加密密匙这样的敏感信息,会将信息暴露给攻击者。任何一个可以访问类文件的人都可以对其进行反编译,然后得到敏感信息。例如,在一个已部署的程序中,改变其硬编码密码需 要发布补丁。代码在一个 String常量中对服务器 IP 地址进行了硬编码。使用java 反编译工具(例如:javap -c IPaddress) 进行反汇编,从而可以得到硬编码的服务器 IP 地址。对于不要硬编码敏感信息的情况,示例1给出了不规范用法(Java 语 言 )示例。原创 2023-11-22 11:29:32 · 341 阅读 · 0 评论 -
应用软件安全编程--25考虑对函数指针进行加密
但是,与给攻击者提供执行任意代码的能力相比,这种情况的安全风险更低。为了减少这类攻击的影 响,函数指针应该在运行时进行加密,并在执行程序时才进行解密。对于考虑对函数指针进行加密的情况,示例1给出了不规范用法(C/C++ 语言)示例。Windows提供了EncodePointer()和DecodePointer()函数对指针进行加密和解密,确保只对给定的程序调用。这个不规范的代码示例将 printf()函 数 赋 给 log fn 函数指针,并且它能够分配在栈的数据段里。原创 2023-11-22 11:28:21 · 233 阅读 · 0 评论 -
应用软件安全编程--24不要使用硬编码密匙
当程序中使用硬编码加密密匙时,所有项目开发人员都可以查看该密匙,甚至如果攻击者能够获取 程序 class文件,可通过反编译得到密匙,硬编码加密密匙会大大降低系统安全性。对于避免使用硬编码密匙的情况,示例1给出了不规范用法(Java 语言)示例。示例2给出了规范 用法(Java 语言)示例。程序应采用不小于8个字节的随机生成的字符串作为密匙。上述代码使用 KeyGenerator 来生成密匙。上述代码使用硬编码加密密钥执行 AES 加密。原创 2023-11-21 09:04:09 · 379 阅读 · 0 评论 -
应用软件安全编程--23避免使用不安全的操作模式
块密码又称为分组加密, 一次加密明文中的一个块。将明文按一定的位长分组,明文组经过加密运 算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。这种加密算法共有四种操作 模式用于描述如何重复地应用密码的单块操作来安全的转换大于块的数据量,分别是电子代码(ECB)、密码块链(CBC)、 密码反馈(CFB) 以及输出反馈(OFB)。可以改用CCM(Counter with CBC-MAC)模式,如果更注重性能,在可用的情况下则使用GCM(Galois/Counter)模式。原创 2023-11-21 09:03:00 · 232 阅读 · 0 评论 -
应用软件安全编程--21密钥长度应该足够长
对于对称加密算法,建议使用长度大于或等于128位的密钥。对于非对称加密算法(如 RSA), 建 议使用长度大于或等于2048位的密钥。以上代码片段中,KeyPairGenerator 使 用RSA 加密算法,长度为1024位。对于密钥长度应足够长的情况,示例给出了不规范用法(Java 语言)示例。加密算法中使用的密钥长度较短,会降低系统安全。原创 2023-11-20 13:37:27 · 271 阅读 · 0 评论 -
应用软件安全编程--21避免使用不安全的哈希算法
在安全性要求较高的系统中,应采用散列值>=224 比特的 SHA 系列算法(如 SHA-224、SHA-256、SHA-384 和 SHA-512) 来保证敏感数据的完整性。以上代码片段中,使用 SHA-256 算法取代 MD5 算法保证数据完整性。对于避免使用不安全的哈希算法的情况,示例1给出了不规范用法(Java 语言)示例。在安全性要求较高的系统中,不可使用被业界公认不安全的哈希算法(如 MD2、MD4、MD5、SHA、以上代码片段中,采用MD5 算法来保证数据的完整性。原创 2023-11-20 13:36:06 · 288 阅读 · 0 评论 -
应用软件安全编程-20生成强随机数
果 两 个java.util.Random 类的实例使用了相同的种子,会在所有的 Java 实 现 中 生 成 相 同 的 数 值 序 列。因 此 ,java.util.Random 不能在安全应用或者在需对敏感数据进行保护的场合使用(如:密码学), 应该使用更安全的随机数生成器,比如java.security.SecureRandom、java.util.concurrent.ThreadLocal-在如上示例中,使用了java.security.SecureRandom 生成随机数。原创 2023-11-16 14:26:17 · 519 阅读 · 0 评论 -
应用软件安全编程-19向外部系统传输数据前应该转换为网络字节序
在操作系统中,有大端存储和小端存储两种主要的存储方式。在不同的系统间进行数据传输时,需 要注意进行本机字节序和网络字节序之间的相互转换。在调用 send 和 write 函数时,如果不调用 htons或 htonl函数将本机字节序转换为网络字节序,会造成数据错误,进而导致预料之外的行为。对于向外部系统传输数据前应该转换为网络字节序的情况,示例1给出了不规范用法(C/C++ 语言)示例。在调用 send 函数之前,没有调用htons 或 htonl函数将 u 转换为网络字节序。原创 2023-11-16 14:25:03 · 53 阅读 · 0 评论 -
应用软件安全编程--18预防存储型 XSS
b) 与预防反射型 XSS 相同,根据数据将要置于 HTML上下文中的不同位置(HTML 标签、HTML属性、JavaScript脚本、CSS、URL),对所有不可信数据进行恰当的输出编码。a) 与预防反射型 XSS 相同,对用户的输入进行合理验证(如年龄只能是数字),对特殊字符(如 〈、〉、"以及<script〉、javascript等)进行过滤。如果 name 的值是由用户提供的,且存入数据库时没有进行合理的校验,那么攻击者就可以利用上 面的代码进行存储型 XSS 攻击。原创 2023-11-15 13:16:59 · 287 阅读 · 0 评论 -
应用软件安全编程--17预防基于 DOM 的 XSS
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object 文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过 JS 脚本对文档对象进行编辑从而修改页面的元素。在这里,'write'按钮的onclick 事件调用了 test()方法,而该函数直接引用用户输入的值修改页面 的 DOM 节点,当用户输入onclick=alert(/xss/)//,应用程序将受到基于DOM 的 XSS 攻击。原创 2023-11-15 13:16:05 · 539 阅读 · 0 评论 -
应用软件安全编程--16预防反射型 XSS
b)根据数据将要置于 HTML上下文中的不同位置(HTML标签、HTML 属性、JavaScript 脚本、CSS、URL), 对所有不可信数据进行恰当的输出编码。应用程序通过 Web 请求获取不可信赖的数据,在未检验数据是否存在恶意代码的情况下,便将其传 送 给 了Web用户,应用程序将易于受到反射型XSS攻击。a)对用户的输入进行合理验证(如年龄只能是数字),对特殊字符(如〈、〉、、"以及<script〉、javas- cript 等)进行过滤。原创 2023-11-14 08:55:16 · 315 阅读 · 0 评论 -
应用软件安全编程--15禁止使用被污染的数据作为缓冲区
在如上示例中,函数 stprintf()通过字符串打印的方式,将 str 复 制 到 目 的 缓 冲 区 buffer 中。由 于 源字符串 str 是污点数据,其长度可能会超过目的缓冲区 buffer 的长度,该复制动作,可能会导致缓冲 区溢出。对于禁止使用被污染的数据作为缓冲区的情况,示例1给出了不规范用法(C/C++ 语 言 ) 示 例。如上示例中,str 没有被污染。但在调用该函数前,仍需要对其长度进行验证,以确保该长度值不会超过目的缓冲区的长度。原创 2023-11-14 08:53:36 · 73 阅读 · 0 评论 -
应用软件安全编程--14禁止使用被污染的数据作为缓冲区长度
很多库函数、API 在对缓冲区进行操作的时候,需要通过一个整型参数来指定这个缓冲区的长度限 制。直接将污点数据作为长度限制参数,可能会造成缓冲区溢出。对于禁止使用被污染的数据作为缓冲区长度的情况,示例1给出了不规范用法(C/C++ 语言)示 例。示例2给出了规范用法(C/C++ 语言)示例。如上示例中,复制内存的长度参数 count 没有被污染。但在调用该函数前,仍需要对其长度进行验证,以确保该长度值不会超过目的缓冲区的长度。在如上示例中,函数memcpy() 指定复制内存长度的参数为污点数据。原创 2023-11-13 10:14:50 · 61 阅读 · 0 评论 -
应用软件安全编程--13禁止使用被污染的数据进行进程控制
直接将污点数据作为动态库加载路径,会为攻击者提供加载恶意库的机会:攻击者可以将篡改后 的,带有恶意功能的库进行加载,使程序在运行过程中执行危险动作,甚至被攻击者控制。对于禁止使用被污染的数据进行进程控制的情况,示例1给出了不规范用法(C/C++ 语言)示例。用明确的固定的数据来进行动态库加载,如果加载动态库的参数,确实需要从外界获取,在这种情 况下,需要注意设计并实现完备的验证机制。在如上示例中,函数LoadLibrary()加载库的参数经过了校验函数CheckArgStr() 的验证。原创 2023-11-13 10:13:36 · 144 阅读 · 0 评论 -
应用软件安全编程--12禁止使用被污染的数据进行路径遍历
对于禁止使用被污染的数据进行路径遍历的情况,示例1给出了不规范用法(C/C++ 语言)示例。示例2、示例3给出了规范用法(C/C++ 语言)示例。用明确的固定的数据来进行路径操作,如果路径操作的参数,确实需要从外界获取,在这种情况下, 需要注意设计并实现完备的验证机制。直接将污点数据作为参数传递给进行路径操作的库函数、API, 会为攻击者提供篡改系统路径的 机会。在规范的代码示例3中,调用相应接口验证了用户输入的路径是否合法。在规范的代码示例2中,直接使用了绝对路径来替代用户输入的路径。原创 2023-11-09 10:30:56 · 61 阅读 · 0 评论 -
应用软件安全编程--11禁止使用被污染的数据进行操纵设置
在如上示例中,通过 if语句,对 CASE 情况进行判断,进而对文件属性值进行具体的设置,即用预 先获知的可能的固定情况,代替了污点数据,保证了文件属性的安全性。示例2给出了规范用法(C/C++ 语言)示例。在调用某些对系统进行配置的库函数、API 时,直接使用污点数据作为相关的配置参数,会为恶意 攻击者提供篡改操作系统的可能性,进而对操作系统造成破坏。在如上示例中,函数 SetFileAttributes()对文件进行属性设置,其属性值是污点数据,该行为会导 致文件的属性可被攻击者任意设置。原创 2023-11-09 10:27:53 · 67 阅读 · 0 评论 -
应用软件安全编程--10注意被污染的内存分配
直接将用户输入的整数作为内存分配的长度可能会导致极端的资源分配:如果用户传入了一个极 大的整数值,程序就会相应的分配一块极大的内存。在如上函数中,变量 size 的值通过函数 scanf() 由用户直接输入,该值未经过任何验证便直接传入 函数 malloc()用于分配内存长度。对于注意被污染的内存分配的情况,示例1给出了不规范用法(C/C++ 语言)示例。在如上示例中,使用变量 size前,对其进行了有效的长度验证,确保其大小不会超过512,从而避免了过大长度的内存分配。原创 2023-11-08 08:52:54 · 52 阅读 · 0 评论 -
应用软件安全编程--09从外部系统接收的数据应该转换为本地字节序
在操作系统中,有大端存储和小端存储两种主要的存储方式。在不同的系统间进行数据传输时,需 要注意进行本机字节序和网络字节序之间的相互转换。在调用 recv或 read 函数从外部系统接收数据 后,如果不调用ntohs 或 ntohl 函数将网络字节序转换为本地字节序,会造成数据错误,进而导致预料之 外的行为。对于从外部系统接收的数据应该转换为本地字节序的情况,示例1给出了不规范用法(C/ 语言)示 例。在调用 recv 函数之前,没有调用ntohs 或 ntohl 函数将 u 转换为网络字节序。原创 2023-11-08 08:51:44 · 60 阅读 · 0 评论 -
应用软件安全编程--08污点数据作为循环边界
将污点数据作为循环边界可能导致程序无限循环,进而导致消耗过多的系统资源,造成拒绝服务攻 击(denial-of-service(DoS)attack)。对于污点数据作为循环边界的情况,示例1给出了不规范用法(C/C++语言)示例。示例2给出 了规范用法(C/C++语言)示例。在如上函数中,循环次数由用户直接输入,而未进行验证。该行为可被攻击者控制。在如上代码中,添加了对污点数据的前置判断,避免了过多次数的循环。原创 2023-11-07 11:18:29 · 83 阅读 · 0 评论 -
应用软件安全编程--07当比较 local相关的数据时,指定恰当的 local
当locale没有明确指定的时候,使用 locale相关的方法处理与 local相关的数据会产生意想不到的 结果。由于这些原因,在比较数据时,如果可能与locale方法相关,则应指定相应的 locale。然而,大多数语言使用的拉丁字母i的大写形式是I,但土耳其语言环境是个例外:有一个点的i的大写形式也有一个点(1),没有点I大写形式没有点(I)。许多程序只使用依赖于locale方法来输出信息,如果 locale相关的数据,程序没有显示设置 locale, 则可以安全地依赖于默认的 locale 设置。原创 2023-11-07 11:17:20 · 139 阅读 · 0 评论 -
应用软件安全编程--06预防 XML 外部实体攻击
针对不规范的代码示例的解决方案是,定义一个 CustomResolver 类,这个类实现了org.xml.sax. EntityResolver接口。这个定制的处理器使用的是一个 为外部实体定义的简单的白名单。实体可以是内部的、外部的或者基于参数的。攻击者可以通过操作实例的 URI, 使其指向特定的在当前文件系统中保存的文件,从而造成拒绝服务或程序崩溃,比如:指定/dev/random 或者/ dev/tty作为输入的 URI, 这可能造成永久阻塞程序或者程序崩溃。然而,SAX 或者 DOM 解析器。原创 2023-11-06 09:01:10 · 1307 阅读 · 0 评论 -
应用软件安全编程--05预防 XML 注入
如果用户有能力使用结构化XML 文档作为输入,那么他能够通过在数据字段中插入 XML 标签来 重写这个 XML 文档的内容。通过使用简单的API 解析器(org.xml.sax and javax.xml.parsers.SAXParser)可以解析该 XML 文 件,如果解析XML 的代码获取的是最后一个元素<price)的值,那么商品价格就被设置为1.0。上面的代码样例中,一个方法简单的使用了字符串拼接来创建一个 XML 查询,然后将其发送到服务器。原创 2023-11-06 08:59:01 · 285 阅读 · 0 评论 -
应用软件安全编程--04不要信任隐藏字段的内容
上面代码演示了一个 servlet,它接受一个可见的字段和一个隐藏的字段,并将其返回给用户。在传递给浏览器之前,可见的参数是经过验证处理的,但是隐藏的字段没有验证。HTML 允许 web 表单中的字段可见或隐藏。隐藏字段向 web 服务器提供值,但不能被用户修改 其内容。但是,攻击者仍然可以通过特殊方式来修改隐藏字段。对于不信任隐藏字段的内容的情况,示例1给出了不规范用法(Java 语言)示例。示例2给出了规 范用法(Java 语言)示例。原创 2023-11-02 08:57:55 · 474 阅读 · 0 评论 -
应用软件安全编程--03净化传递给 Runtime.exec() 方法的非受信数据
每个 Java 应用都有一个 Runtime 类的实例, 一般需要使用 shell 时调用它,从而可以在 POSIX 中 使用/bin/sh 或者在Windows 平台中使用cmd.exe。因为Runtime.exec() 方法接受源于运行环境的未经净化的数据,所以这些代码会引起命令 注入攻击。示例2给出了规范用法(Java 语言)示例。这个符合规范的代码实例会对非受信的用户输入进行净化,只允许白名单中的字符出现在参数中,并传给 Runtime.exec()方法,其他所有的字符都会被排除掉。原创 2023-11-02 08:56:02 · 102 阅读 · 0 评论 -
应用软件安全编程--02从 ZipInputStream 安全解压文件
在这个规范的代码示例中,代码在提取条目之前验证每个条目的名称。代码不要使用ZipEntry.getSize()方法,因为攻击者 可以伪造 ZIP 文档中未压缩的文件的大小。最后,代码还计算压缩包中文件条目的数量,如果超过 1024个条目,则抛出异常。解压一个文件,比如 zip、gif或者 gzip编码的 HTTP 内容,可能会消耗过多的资源,并且在压缩率极高的情况下,可能会导 致 zip炸弹的出现。对于从 ZipInputStream 安全解压文件的情况,示例1给出了不规范用法(Java 语言)示例。原创 2023-11-01 09:11:06 · 618 阅读 · 0 评论 -
应用软件安全编程--01预防SQL注入
在这个不规范的代码示例中,使用JDBC来认证用户,提交 stmt.executeQuery(sqlString) 查询的 SQL 为 sqlString,它是通过一个拼接字符串组合而来,并且 sqlString 未经过净化或验证,当 pwd 为OR1=1 时,sqlString 就会变成:SELECT FROM db user WHERE username ="AND password=" OR'1'='1。对于预防 SQL 注入的情况,示例1给出了不规范用法(Java 语言)示例。原创 2023-11-01 09:08:46 · 139 阅读 · 0 评论