信息安全技术安全编程
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
– 错误处理机制
如果没有好的错误处理机制,你的程序 会在出错时泄露一些有用的信息。
泄漏程序所在物理路径 泄漏数据库结构信息 泄漏一些其他的有用信息,例如用户有
效性
当输入错误用户名时,返回”该用户不 存在”信息
原则:尽量不要泄漏任何不必要的信息 只要用户名和口令有一样不正确,都cn显itsec
– 特殊字符()
原则
只让我们需要的字符通过检测