产品常见安全漏洞挖掘和分析以及解决方案

缓冲区溢出

原理
当函数内的一个数组缓冲区接受用户输入的时候,未对输入的长度进行合法性检查时,可以构造数据覆盖超过缓冲区的高地址上原本的其他栈帧数据,如果本身的数据内就保存了一系列的指令的二进制代码,一旦栈溢出修改了函数的返回地址,并将该地址指向这段二进制代码的起始位置,那么就形成成了基本的溢出攻击行为。
防护措施
1)只使用安全的内存操作函数。
2)在进行内存操作之前,对要操作的长度和被操作空间的长度进行比较,如果大于禁止继续进行操作。
–这里要注意整数溢出,长度对比时要注意,使用安全函数也要注意(安全函数有传入的长度限制,溢出后这个限制就无用了 ,例如strncpy第三参数是无符号,溢出后就变得很大)
挖掘方法
1)检查是否有使用strcpy、strcat、sprintf、vsprintf等危险函数,其数据是否有越界可能。(这个先记录后分析)
2)检查使用gets、fgets、getchar、fgetc、getc、read、scanf、sscanf、fscanf、getenv等函数时,其数据是否有越界可能。
3)检查使用strncpy、strncat、snprintf等函数时,n为是否为缓冲区可接收的最大长度减1 。(snprintf在linux上内部有减1)
4)检查使用memcpy、 memmove等函数时,n为要拷贝的长度,并且在拷贝之前要对n进行检查,是否小于等于缓冲区最大容量。

数组越界

原理与缓存冲区溢出类似
挖掘方法:通过工具静态扫描(codescan),分析扫描结果 (这个通过工具扫描,人工挖掘无较好方式–无关键字,得逐行查看)

格式化字符串漏洞

原理:使用用户输入的字符串作为格式字符串,通过构造格式化字符串(如%x,%s,%n), 攻击者将有机会对任意内存地址进行读写操作。
防护措施:禁止使用用户输入的字符串作为格式字符串
挖掘方法:搜索所有scanf, printf, sprintf, snprintf, vsprintf, vsnprintf, syslog,等检查是否有使用用户输入的字符串作为格式化字符串。

整数溢出

原理:有符号整数会在最高位用0表示正数,用1表示负数,无符号整数则没有这种限制,其之间的操作会存在上溢和下溢,从而导致安全漏洞。
挖掘方法:检视外部输入参数长度做校验的地方,是否存在整数溢出而绕过检查,导致超过缓存取大小的数据写入、程序崩溃或逻辑漏洞等。
检查点:
1)无符号整数的下溢和上溢(赋值)。
2)有符号整数之间的比较。
3)有符号整数的运算。
4)无符号整数和有符号整数的对比。
通过工具扫描,人工挖掘无较好方式–无关键字,得逐行查看,关键代码通过代码走读(模块待定)。

命令注入

原理:调用系统命令前未对外部用户输入数据进行合法性检查,导致直接执行非法用户构造的命令
挖掘方法:检视system、popen、exec系列函数,以及封装的函数,确认命令里面使用的参数是否有做限制(保证无特殊字符)或做转义(escapeshellarg或类似方法)

SQL注入

原理:构造特殊的SQL语句(参数)对数据库进行非法操作
挖掘方法:以使用sqlite数据库为例,检视是否有使用sqlite,搜索sqlite3,关键字包括sqlite3_exec,sqlite3_get_table等,查看sql语句是否通过sqlite3_snprintf/sqlite3_mprintf构造,不是则需要替换,若通过sqlite3_snprintf/sqlite3_mprintf构造的,则需要注意字符串参数是否都是使用的%q且是用单引号扩起来(%q会对单引号做处理,使用%s就存在注入可能)

文件上传

原理:服务端未检测文件类型,可能导致上传非法的文件到设备后台
挖掘方法:检查产品中上传文件的相关api函数,是否有对文件类型判断(后缀和内容限制),并确保文件名无特殊字符或00截断(后面这个可能导致命令注入)

目录穿越

原理:直接使用外部传入参数做路径,未对参数进行检测(如包含…/、范围非法等),导致其访问限制外的目录或文件
挖掘方法:检查产品中上传文件的api函数是否有对文件路径做检查

权限校验

挖掘方法:检查访问产品中的相关资源是否都通过了权限校验(checkuser,CheckCookie等)再进行的操作。

XSS

原理:以CGI为例,CGI输出是通过替换HTML模板内容输出的,替换内容为客户端上传(没有限制XSS特殊字符),且替换时也没有做处理就存在XSS注入漏洞
挖掘方法:替换时HTML模板内容时检测内容是否为外部传入,是否做过特殊字符限制,是否对字符进行转义处理。

CSRF

防护措施:通过检查http请求中的referer头部信息;服务端下发唯一并且具备时效性的token后,检查客户端请求中提交的token

SSRF

原理:服务程序接收客户端上传的URL,未做过滤和限制直接访问URL
挖掘方法:检视是否有使用curl、wget等的进行url访问,检查url是否是外部输入,是否做了过滤和限制。

CRLF (配置文件)

原理:在保存某个字段的配置时利用\r\n(linux服务器上\n就可以了)进行换行,输入其他字段的数据,以达到 越权修改 其他字段数据,或绕后其他字段 数据格式 校验的目的
挖掘方法:搜索保存配置的方法,检查是否为外部输入,是否做了格式校验或限制\r\n(或者\n)的输入

XXE

原理:即XML外部实体注入,当允许引用外部实体时,而XML数据又是来自外部输入,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等
挖掘方法 :搜索加载xml的代码,查看xml内容来源是否为外部输入,是否可以构造外部实体(DTD)进行加载

你可能感兴趣的:(网络安全,安全漏洞)