信息安全技术安全编程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

cnitsec
– 特殊字符()
一个非常著名的例子: 这个程序在以前和 服务器中是默认安装的。程序通过()
函数来传递数据到程序中剔除了一些已知的不良的字 符,但是,它遗漏了其中一个字符:换行符(\),当在远程 主机使用解程序解析的时候,换行符扮演了命令分隔符, 把分行符前字符串作为一个命令,而把换行符后面的字 符串作为一个新命令,通过请求下面的,就可能在主机上 执行" "的命令:
cnitsec
四、命令执行()
解决方法 程序员:
使用()函数过滤用户输入的命令。 管理员:
尽量建议程序员不要使用命令执行函数。 如果确实有应用,修改设置 ,只允许执行指定目录下的命令。
cnitsec
五、文件上传()

这是一个最简单的文件上传代码: < (($) $ "") {
($, "".$); "文件".$."上传成功!"; ; } ?>
原则:处理请求时,使响应时间和占用资源尽
可能少。
cnitsec
– 错误处理机制
如果没有好的错误处理机制,你的程序 会在出错时泄露一些有用的信息。
泄漏程序所在物理路径 泄漏数据库结构信息 泄漏一些其他的有用信息,例如用户有
效性
当输入错误用户名时,返回”该用户不 存在”信息
原则:尽量不要泄漏任何不必要的信息 只要用户名和口令有一样不正确,都cn显itsec
cnitsec
五、文件上传()
攻击者可以把文件拷贝成其它扩展名,泄漏脚 本源代码。
攻击者可以自定义里变量的值,上传覆盖任意 有写权限的文件。
攻击者还可以上传脚本执行主机的命令。
cnitsec
五、文件上传()
解决方法 程序员:
以后提供了和函数,可以检查操作的文件是否是用户上传的文 件,从而避免把系统文件拷贝到目录。
对于数字类型的字段,很多程序员会这样写: *$
由于变量没有用单引号扩起来,就会造成攻击。 幸亏功能简单,没有等数据库有执行命令的语 句,而且的()函数也只允许执行一条语句,所 以用分号隔开多条语句的攻击也不能奏效。但 是攻击者起码还可以让查询语句出错,泄漏系 统的一些信息,或者一些意想不到的情况。
cnitsec
二、文件打开()
由于攻击者可以指定任意的$,攻击者用如下的请求就 可以看到:
如下请求可以读文件本身: 正确目录 中文件打开函数还有(), ()等,如果对文件名变量检查
不严就会造成服务器重要文件被访问读取。
cnitsec
二、文件打开()
解决方法 程序员:
文件打开函数比较危险,慎用。如果一定要使 用就必需严格检查要打开的文件名,绝对不能 由用户任意指定。 管理员: 如非特殊需要,把的文件操作限制在目录里面。 修改配置文件: <>
远程包含文件问题 如果对于版的,攻击者可以在自己开了或服务的机器
上建立一个包含命令的文件,如,其内容是 <(“ ”)?>, 那么如下的请求就可以在目标主机执行命令 :
cnitsec
三、包含文件()
另外一种形式的易受攻击的代码片断: < ("$"); ?>
cnitsec
三、包含文件() 攻击者可以在自己的主机建立一个包含 执行命令代码的文件,然后用如下请求 也可以在目标主机执行命令:

现代软件开发周期短,工作量大,无暇顾及安

cnitsec
课程内容
• 通用安全编程原则 • 常见编程语言的安全编程 • 、、、、 • 其他应用程序的安全编程 • 缓冲区溢出 • 函数返回值检查 • 临时文件安全 • 竞争条件 • 软件开发过程中的一些安全考虑
cnitsec
通用安全编程原则
什么是一个安全的程序?
简单的说,无论使用何种破坏手段,都可以正确执行 自己的既定任务,这样的程序就是安全的程序。
安全程序不应当损害它运行系统的本地安全策略。
程序员职责就是保证程序可以正常执行任务。
锁匠与锁, 屋主与关门
ห้องสมุดไป่ตู้
‘’的安全问题
什么是安全漏洞?
程序中存在的危害本地安全策略的问题或弱点
大多数是指那些会导致程序强制执行一些不同于作者 本来意图的行为
信息安全技术
中国信息安全产品测评认证中心()
前言
课程目的: 了解如何安全编程 帮助用户在实际编程中应用上述技术
为什么要安全编程 黑客可利用软件中的安全问题进行攻击,造成
经济或者名誉损失 可能造成产品性能不稳定 软件的安全性不好影响客户信心,销售受挫
存在诸多安全问题的原因
cnitsec
安全编程
编程的常见问题 信息泄漏 泄漏路径信息 泄漏系统文件内容 泄漏数据库内容 覆盖、重写系统或者数据库数据 执行系统命令 拒绝服务攻击
cnitsec
如何写一个安全的程序
防止缓冲区溢出 小心调用外部命令 特殊字符的过滤 正确使用隐藏变量 使用应注意的问题 提防拒绝服务攻击 使用正确的错误处理机制
常见安全漏洞类型
缓冲区溢出
竞争条件 输入检查错误
cnitsec
通用安全编程原则
程序只实现你指定的功能 永远不要信任用户输入,对用户输入数
据做有效性检查 必须考虑意外情况并进行处理 不要试图在发现错误之后继续执行 尽可能使用安全函数进行编程 小心、认真、细致地编程
cnitsec
– 外部命令
原则
尽可能不调用外部命令
如果不得不调用,必须检查传递给外部 命令的参数是否合法。只允许那些完全 下符表合列要出了求一的些参常见数调通用过外部。命令的函数
表. 和中可以调用的函数.
函数
函数
('...')
()
(' ...')
()
('...')
('...')
cnitsec
使用$数组来读取用户上传的文件变量。 严格检查上传变量。比如不允许是脚本文件。 管理员: 对于上传目录去掉解释功能,可以通过修改实现:
<>

如果是换成
cnitsec
六、()
六、
有良好的数据库编程接口,支持众多的数据库, 与的组合应用更是广泛。 如下的语句如果未对变量进行处理就会存在问 题: * '$' '$' 攻击者可以用户名和口令都输入' '绕过验证。
四、命令执行()
下面的代码片断是从 摘出,详细的描述见:
< (" $",$); ?>
由于程序没有过滤$变量,所以攻击者可以用 分号来追加执行命令。
cnitsec
四、命令执行()
攻击者输入如下请求可以执行 命令:

的命令执行函数还有(), (), ()和``等。命令 执行函数非常危险,应当慎用。如果要 使用一定要严格检查用户输入。
– 特殊字符()
原则
只让我们需要的字符通过检测
不是剔除非法字符而是检查是否在合法 字符集内
不止是在调用外部命令时,在任何时候 你都应该检查你页面的输入是否合法, 当然这种检测没有一定的规律,要视你 的功能而定。要特别注意以下这些字符:
; < > * ` $ ! ( ) [ ] : { } ' “ ..\
cnitsec
– 拒绝服务攻击
拒绝服务攻击是使应用程序或操作系统停止为 合法访问提供服务的一种攻击。
对于程序的拒绝服务来说,通常是指利用程序 实现上的弱点来大量占用系统资源(或内存)
例如,在数据库搜索时,使用简单的语句对整 个数据库进行搜索。当数据库比较庞大时,会 占用较多的系统资源。攻击者如果发送大量搜 索查询请求,系统可能瘫痪
cnitsec
三、包含文件()
解决方法 程序员:
包含文件里的参数尽量不要使用变量,如果使用变量, 就一定要严格检查要包含的文件名,绝对不能由用户 任意指定。 管理员: 如前面文件打开中限制操作路径是一个必要的选项。 另外,如非特殊需要,关闭版的远程文件打开功能。 修改文件:
重启。
cnitsec
安全编程
是一种非常容易上手的脚本语言,在上 应用十分广泛。
的开发者已经考虑到了很多安全问题, 但是在默认安装下,由于程序员的不小 心,还是会给服务器造成很大的危险。
我们将以攻击者、脚本程序员、网站管 理员三种角度讨论的安全。
cnitsec
一、变量滥用()
一、变量滥用 默认 ,对于, , , , 的变量可以直接注册 成全局变量。它们的注册顺序是 “”, 同名变量右边的覆盖左边,所以变量的 滥用极易造成程序的混乱。而且脚本程 序员往往没有对变量初始化的习惯,像 如下的程序片断就极易受到攻击:
cnitsec
隐藏变量
原则 尽量不要使用隐藏变量传递数据 如果必须使用,应当在每个中对所有的隐藏变
量都进行检查。 在很多程序中,人们喜欢用隐藏变量来传递信
息,这容易给一些不怀好意的人以可乘之机, 因为隐藏变量可以通过查看原码看到。因此, 在用隐藏变量来传递信息时,一定要小心,审 核你的程序流程,看看是否会带来问题。
cnitsec
六、()
解决方法 程序员:
对所有用户提交的要放到语句的变量用() 进行过滤 。 即使是数字类型的字段,变量也要用单 引号扩起来,自己会把字串处理成数字。 管理员: 不要给程序高级别权限的用户,只允许 对自己的库进行操作。
cnitsec
七、安全模式()
前面我们也已经提到过的,默认是关闭 的。启用,会对许多函数进行限制,特 别是和系统相关的文件打开、命令执行 等函数。
cnitsec
五、文件上传()
<> <> <>文件上传<> < "" "; "> <> < ""> < "" ""> 上传文件: < "" "" ""> < "" "" "上传"> <> <> <>
cnitsec
五、文件上传()
这样的上传代码存在读取任意文件和执行命令 的重大问题。
下面的请求可以把文档拷贝到目录下的文件里: 然后可以用如下请求读取口令文件:
cnitsec
隐藏变量
隐藏变量 <> 隐藏变量的值是用户可修改的 程序员可能忽视对隐藏变量的检查 在多个连续页面中传递隐藏变量时,中
间页面可能忽略了对隐藏变量的检查 一个隐藏变量 >> 可能会忘记对其进行检查
cnitsec
– 的使用
很多人喜欢使用在客户端存储信息。 的特点 明文保存 用户可控制 原则 尽量不要使用保存敏感信息 设置的有效时间
<>
cnitsec
三、包含文件()
的包含函数有(), (), (), 。如果对包含文件名变 量检查不严就会对系统造成严重危险,可以远 程执行命令。
极易受攻击的代码片断: < (($)) ("$"); ?>
cnitsec
三、包含文件()
这种代码会造成系统文件泄漏,攻击者用如下请求可 以得到文件:
cnitsec
– 缓冲区溢出
什么是缓冲区溢出?
当向一个固定大小的缓冲区()中储存 超量数据时,就会发生缓冲区溢出( )
缓冲区溢出的后果
如果使用随机数据,可能导致程序崩溃
如果精心构造溢出数据,可能改变程序 执行流程,允许攻击者执行任意指令
影响语言:
典型案例:缓冲区溢出漏洞
cnitsec
一、变量滥用()
解决方法 程序员:
对作为判断的变量在程序最开始初始化一 个值。永远不要相信客户提交的数据。 管理员: 在配置文件设置 。
cnitsec
二、文件打开()
极易受攻击的代码片断: < (!($ (“$"))) { (" : $<>\"); ; } { $; } ?>
cnitsec
六、()
不过有一个默认的选项 ,该选项使得从, , 来的变量 自动加了()操作。上面语句变成了: * ‘\’ \‘’ ‘\’ \‘’ 从而避免了攻击。
虽然默认该选项打开,可是为了安全起见我们还是 应该对语句中的变量进行处理。添加了一个()来处理 这种情况。
cnitsec
六、()
cnitsec
一、变量滥用()
< ($ "") $; ... ($ ) " "; ?>
cnitsec
一、变量滥用() 攻击者只需用如下的请求就能绕过检查:
cnitsec
一、变量滥用()
这虽然是一个很低级的错误,但一些著名的程 序也有犯过这种错误,比如的远程文件拷贝漏 洞:
发布的时候建议关闭 ,并提供了个特殊的数组变量来使用各种变量。 对于从, , 等来的变量并不会直接注册成变量, 必需通过数组变量来存取。这使得程序使用自 身初始化的默认值,一般为,避免了攻击者控 制判断变量。
相关文档
最新文档