作者:尚艺李波_387 | 来源:互联网 | 2018-05-20 16:32
本篇文章是对PHP代码审核进行了详细的分析介绍,需要的朋友参考下
概述 代码审核,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险 代码审核不是简单的检查代码,审核代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。 审核人员可以使用类似下面的问题对开发者进行访谈,来收集应用程序信息。
应用程序中包含什么类型的敏感信息,应用程序怎么保护这些信息的? 应用程序是对内提供服务,还是对外?哪些人会使用,他们都是可信用户么? 应用程序部署在哪里? 应用程序对于企业的重要性?
最好的方式是做一个 checklist,让开发人员填写。Checklist 能比较直观的反映应用程序的信息和开发人员所做的编码安全,它应该涵盖可能存在严重漏洞的模块,例如:数据验证、身份认证、会话管理、授权、加密、错误处理、日志、安全配置、网络架构。
输入验证和输出显示 大多数漏洞的形成原因主要都是未对输入数据进行安全验证或对输出数据未经过安全处理,比较严格的数据验证方式为:对数据进行精确匹配 接受白名单的数据 拒绝黑名单的数据 对匹配黑名单的数据进行编码
在 PHP 中可由用户输入的变量列表如下: $_SERVER $_GET $_POST $_COOKIE $_REQUEST $_FILES $_ENV $_HTTP_COOKIE_VARS $_HTTP_ENV_VARS $_HTTP_GET_VARS $_HTTP_POST_FILES $_HTTP_POST_VARS $_HTTP_SERVER_VARS 我们应该对这些输入变量进行检查
命令注入 安全威胁 命令注入攻击是通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域)来改变网页的动态生成的内容,而这样就可能会导致恶意命令掌控用户的电脑和他们的网络。PHP执行系统命令可以使用以下几个函数:system、exec、passthru、``、shell_exec、popen、proc_open、pcntl_exec,我们通过在全部程序文件中搜索这些函数,确定函数的参数是否会因为外部提交而改变,检查这些参数是否有经过安全处理。 代码示例 例1:
代码如下:
//ex1.php $dir = $_GET["dir"]; if (isset($dir)) { echo "
"; system("ls -al".$dir); echo " ";
}
?>
我们提交
代码如下:
localhost/ex1.php?dir=| cat /etc/passwd
提交以后,命令变成了
代码如下:
system("ls -al | cat /etc/passwd");
防范方法 1、尽量不要执行外部命令 2、使用自定义函数或函数库来替代外部命令的功能 3、使用escapeshellarg函数来处理命令参数 4、使用safe_mode_exec_dir指定可执行文件的路径 esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“'”,替换成“\'”,双引号“"”,替换成“\"”,分号“;”替换成“\;”, 用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内。
代码如下:
safe_mode = On safe_mode_exec_di r= /usr/local/php/bin/
跨站脚本威胁(Cross Site Scripting)
安全威胁
Cross Site Script(XSS),跨站脚本威胁。攻击者利用应用程序的动态展示数据功能,在 html 页面里嵌入恶意代码。当用户浏览该页之时,这些嵌入在 html 中的恶意代码会被
执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的。输出函数经常使用:echo、print、printf、vprintf、<%=$test%>
跨站脚本攻击有以下三种攻击形式: (1) 反射型跨站脚本攻击 攻击者会通过社会工程学手段,发送一个 URL 连接给用户打开,在用户打开页面的同时,浏览器会执行页面中嵌入的恶意脚本。 (2) 存储型跨站脚本攻击 攻击者利用 web 应用程序提供的录入或修改数据功能,将数据存储到服务器或用户COOKIE 中,当其他用户浏览展示该数据的页面时,浏览器会执行页面中嵌入的恶意脚本。所有浏览者都会受到攻击。 (3) DOM 跨站攻击 由于 html 页面中,定义了一段 JS,根据用户的输入,显示一段 html 代码,攻击者可以在输入时,插入一段恶意脚本,最终展示时,会执行恶意脚本。DOM 跨站和以上两个跨站攻击的差别是,DOM 跨站是纯页面脚本的输出,只有规范使用 Javascript,才可以防御。
恶意攻击者可以利用跨站脚本攻击做到: (1) 盗取用户 COOKIE,伪造用户身份登录。 (2) 让浏览者被迫执行某页面操作,以用户身份向服务器发起请求,达到攻击目的。 (3) 结合浏览器漏洞,下载病毒木马到浏览者的计算机上执行。 (4) 衍生 URL 跳转漏洞。 (5) 让官方网站出现钓鱼页面。 (6) 蠕虫攻击 代码示例 直接在 html 页面展示“用户可控数据”,将直接导致跨站脚本威胁。
代码如下:
echo “$newsname ”; echo “$gifname ”; echo “ ”; echo “”. htmlentities($context).” ”; ?>
这几种显示方式,都可能导致用户浏览器把“用户可控数据”当成 JS/VBS 脚本执行,或页面元素被“用户可控数据”插入的页面 HTML 代码控制,从而造成攻击。
解决方案
a) 在 HTML 中显示“用户可控数据”前,应该进行 htmlescape 转义。
代码如下:
htmlspecialchars($outputString,ENT_QUOTES);
进行 html 转义应该按照以下列表进行转义:
代码如下:
& --> & <--> < > --> > " --> " ' --> &#39;
b) 在 Javascript 中输出的“用户可控数据”,需要做 Javascript escape 转义。
需要转义的字符包括:
代码如下: