Fortify漏洞修复总结
1.代码注入
1.1 命令注入
命令注入是指应用程序执行命令的字符串或字符串的一部分来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,导致程序执行恶意命令的一种攻击方式。
问题代码:
$dir = $_POST['dir']
exec("cmd.exe /c dir" + $dir);
修复方案:
(1)程序对非受信的用户输入数据进行净化,删除不安全的字符。
(2)限定输入类型, 创建一份安全字符串列表,限制用户只能输入该列表中的数据。 修复例子:
//方式1
if (!preg_match('/^[\w\.:\-]+$/', $dir) ){
// Handle error
} $cmd = filter_var($cmd, FILTER_VALIDATE_REGEXP,
array("options" => array("regexp" => getCommandFilterReg())));
...
$msg = escapeshellarg($msg);
//方式2
function cmd_arg($cmd, $filter='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.')
{
$filter_chars = str_split($filter);
$filter_chars = array_combine($filter_chars, $filter_chars);
$cmd_chars = str_split($cmd);
$ret = ''; foreach ($cmd_chars as $v)
{
$ret .= isset($filter_chars[$v]) ? $filter_chars[$v] : '';
} return $ret;
}
$cmd = cmd_arg($cmd);
1.2 js动态代码注入
(1)主要是前端使用了eval函数来解析服务端的响应
evalResponse: function() {
try {
return eval((this.transport.responseText ));
} catch (e) {
this.dispatchException(e);
}
修复方案: a.不要使用eval函数,使用自定义函数替换
function _dhtmlxEvalData( code )
{
var script; if ( code ) {
var data_key = '_process_json_data_'+parseInt( rand(0,1000000000000));
code = 'window["'+data_key+'"]=('+code+');'
// If the code includes a valid, prologue position
// strict mode pragma, execute code by injecting a
// script tag into the document.
script = document.createElement("script");
script.text = code;
document.head.appendChild( script ).parentNode.removeChild( script ); return window[data_key];
} return null;
}
return _dhtmlxEvalData(this.transport.responseText );
(2)document.write(html)中写入的html和document.location = url 中的url没有过滤处理
var html = '<span>'+rows[i]+'</span>';
document.write(html)
.... document.location = url
修复方案: a.避免使用document.write 参考地址
b.使用白名单
//document.write() 换成如下写法
_var sNew = document.createElement("script");
sNew.async = true;
sNew.src = "https://example.com/script.min.js";
var s0 = document.getElementsByTagName('script')[0];
s0.parentNode.insertBefore(sNew, s0); //document.location = url的处理 function safe_url (url, whiteChars)
{
whiteChars = ''+(whiteChars||'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_~+#,%&=*;:@[]');
var ret = ''; for(var i=0; i<url.length; i++)
{
ret += whiteChars[whiteChars.indexOf(url[i])] || '';
} do
{
var old = ret;
ret = ret.replace(/javascript:/gi,'');
}while(ret != old); return ret;
}
document.location = safe_url(url);
(3) 接收的全局变量和setTimeout函数相遇
问题代码:
this.timer = setTimeout(this.onTimerEvent.bind(this),
this.decay * this.frequency * 1000); ...
(u = setTimeout(function() {
x.abort("timeout")
},
c.timeout));
修复方案: 使用匿名函数,包裹setTimeout函数
(function(){
this.timer = setTimeout(this.onTimerEvent.bind(this),
this.decay * this.frequency * 1000);
})();
...
(u = (function()
{
var u = setTimeout(function() {
x.abort("timeout")
}, c.timeout);
return u;
})()
);
1.3 JSON 注入
问题代码:
$data = file_get_contents("php://input");
$data = json_decode($data, true);
修复方案: 使用filter_var函数进行过滤 修复例子:
$data = file_get_contents("php://input");
$data = filter_var($data, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
$data = json_decode($data, true);
1.4 SQL注入
SQL injection 发生原因:
1、数据从一个不可信赖的数据源进入程序。
2、数据用于动态地构造一个 SQL 查询。
问题代码:
$sql = "SELECT value FROM config WHERE ip=".$ip." AND owner=".$_SESSION["user"];
$stm->execute();
$stm->fetchAll(PDO::FETCH_ASSOC);
修复方案:
a、确保sql语句不通过拼接的方式构造;
b、然后采用一些对sql语句进行预编译的执行方法;
c、最后再以参数绑定的方式设置sql语句需要的条件的值。
修复例子:
$sql = "SELECT value FROM config WHERE ip=? AND owner=?";
$stm = $db->prepare($sql);
$stm->execute(array($ip, $_SESSION["user"]));
$rows = $stm->fetchAll(PDO::FETCH_ASSOC);
2.不安全随机数
标准的伪随机数值生成器不能抵挡各种加密攻击。伪随机数生成器 (PRNG) 近似于随机算法,是统计学的 PRNG,该PRNG是可移植和可重复的,攻击者很容易猜到其生成的字符串。 在对安全性要求较高的环境中,使用能够生成可预测值的函数作为随机数据源,会产生 Insecure Randomness 错误。
2.1 php例子
代码中使用了rand() 和mt_rand() 函数,相关了解
mt_srand(time());
$token = mt_rand();
...
$randnum = rand(1,10000);
$str = md5($token.$randnum.time());
...
修复方案: 1.php7 添加了更好的随机数random_int()用来代替php5的mt_rand()
2.使用openssl_random_pseudo_bytes函数重新自定义随机函数,注意运行环境需要支持该函数
修复例子:
f
unction dynamicNumber($min,$max) {
$range = $max - $min + 1;
if ($range == 0) return $min;
$length = (int) (log($range,2)/8) + 1;
$max = pow(2, 8 * $length);
$num = $max + 1;
while ($num > $max) {
$num = hexdec(bin2hex(openssl_random_pseudo_bytes($length,$s)));
}
return ($num % $range) + $min;
}
function getDynamicInt($min = 0, $max = null)
{
if ($max === null) {
$max = getrandmax();
}
return dynamicNumber($min,$max);
}
function getDynamicMtInt($min = 0, $max = null)
{
if ($max === null) {
$max = mt_getrandmax();
}
return dynamicNumber($min,$max);
}
$token = getDynamicMtInt();
...
$randnum = getDynamicInt(1,10000);
2.2 js例子
代码中使用了Math.random()
...
var rnd = Math.random();
...
修复方案: 不使用Math.random(),原理参考 自定义随机函数 修复例子:
var rand = (function(){
var seed = (new Date()).getTime()
function r(){
seed = (seed*9301+49297)%233280
return seed/(233280.0)
}
return function(number){
return Math.ceil(r()*number)
}
})()
console.log(rand(5));
function randnum() {
var seed = (new Date()).getTime();
seed = (seed*9301+49297)%233280;
return seed/(233280.0);
}
3.硬编码密码
程序中采用硬编码方式处理密码,一方面会降低系统安全性,另一方面不易于程序维护。
if (password == null) {
password = "123456";
}
fortify可能会误报,比如一些带关键词的变量:password、passwd、pass、password_xxx、xxx_passwd等
修复方式: 程序中所需密码应从配置文件中获取经过加密的密码值。对于误报的变量,只有修改变量名。
4.其他
1.空密码问题
其实只是变量设置为空,但是fortify要报错
$passwd = "";
//解决方式用函数转为空
$passwd = strval(null);
2.变量覆盖
extract($params)
//改为
extract($params,EXTR_SKIP);
3.base64_pri_decrypt() 方法执行不带 OAEP 填充模式的公钥 RSA 加密,因此加密机制比较脆弱。
openssl_public_encrypt($input, $output, $key, OPENSSL_NO_PADDING);
=》
openssl_private_decrypt($password_base64_decode, $password_decode, $pi_key,OPENSSL_PKCS1_OAEP_PADDING);//私钥解密
4.js中的setTimeout 报动态代码注入
this.timer = setTimeout(this.onTimerEvent.bind(this), this.decay * this.frequency * 1000);
用匿名函数将其包裹
(function(){ this.timer = setTimeout(this.onTimerEvent.bind(this), this.decay * this.frequency * 1000);
})();
例2:
(u = setTimeout(function() { x.abort("timeout") }, c.timeout)); 改为
(u = (function() { var u = setTimeout(function() { x.abort("timeout") }, c.timeout); return u; })() );
5.Cookie Security: Overly Broad Path path 不传“/”
6..xss,css Dom
safe_url: function (url, whiteChars) {
whiteChars = ''+(whiteChars||'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_~+#,%&=*;:@[]');
var ret = '';
for(var i=0; i<url.length; i++)
{
ret += whiteChars[whiteChars.indexOf(url[i])] || '';
}
do
{
var old = ret;
ret = ret.replace(/javascript:/gi,'');
}while(ret != old);
return ret;
},
7.jsonencode的输出 filter_var_array()
function stripHtml(value) {
// remove html tags and space chars
return value.replace(/<.[^<>]*?>/g, " ").replace(/ | /gi, " ")
// remove punctuation
.replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "");
}
Fortify漏洞修复总结的更多相关文章
- Fortify漏洞之Cross-Site Scripting(XSS 跨站脚本攻击)
书接上文,继续对Fortify漏洞进行总结,本篇主要针对XSS跨站脚步攻击漏洞进行总结,如下: 1.Cross-Site Scripting(XSS 跨站脚本攻击) 1.1.产生原因: 1. 数据通过 ...
- 织梦dedecms漏洞修复大全(5.7起)
很多人说dedecms不好,因为用的人多了,找漏洞的人也多了,那么如果我们能修复的话,这些都不是问题. 好,我们来一个一个修复.修复方法都是下载目录下该文件,然后替换或添加部分代码,保存后上传覆盖(记 ...
- Jsp万能密码漏洞修复例子
更多详细内容请查看:http://www.111cn.net/jsp/Java/58610.htm 如果网站出现这种“万能密码”漏洞该怎么办呢 'or'='or' 漏洞修复 方法有很多在这里介绍两种, ...
- appscan 安全漏洞修复办法
appscan 安全漏洞修复办法http://www.automationqa.com/forum.php?mod=viewthread&tid=3661&fromuid=21
- 腾讯云发布runC容器逃逸漏洞修复公告
尊敬的腾讯云客户,您好: 近日,腾讯云安全中心监测发现轻量级容器运行环境runc被爆存在容器逃逸漏洞,攻击者可以在利用该漏洞覆盖Host上的runc文件,从而在Host上以root权限执行代码. 为 ...
- Mysql漏洞修复方法思路及注意事项
[系统环境] 系统环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga) + 5.7.16 MySQL Community Server ...
- Web常见漏洞修复建议
一.SQL注入修复建议 1.过滤危险字符,例如:采用正则表达式匹配union.sleep.and.select.load_file等关键字,如果匹配到则终止运行. 2.使用预编译语句,使用PDO需要注 ...
- java中xxe漏洞修复方法
java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...
- 360软件的木马查杀、漏洞修复等组件不能使用,提示runtime error
一.故障现象:1.360软件的木马查杀.漏洞修复等组件不能使用,提示runtime error2.暴风影音等很多软件不能正常使用3.设备管理器不能打开,提示“MMC 不能打开文件”4.部分https安 ...
随机推荐
- 云片RocketMQ实战:Stargate的前世今生
RocketMQ消息队列,专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积.高吞吐.可靠重试等特性,是应对企业业务峰值时刻必备的技术. 云片由于 ...
- 从零写一个编译器(九):语义分析之构造抽象语法树(AST)
项目的完整代码在 C2j-Compiler 前言 在上一篇完成了符号表的构建,下一步就是输出抽象语法树(Abstract Syntax Tree,AST) 抽象语法树(abstract syntax ...
- spring-boot-plus快速快发脚手架简介
Everyone can develop projects independently, quickly and efficiently! Introduction spring-boot-plus是 ...
- LoRa硬件调试-前导码
前言 已知LoRa数据包在负载之前会有一段前导码,接收端是先检测前导码,收到前导码之后才认为有数据发送过来. 那么不同的前导码的长度会有什么影响呢? 前导码长短的优劣势 - 前导码实际上是占符号的,也 ...
- 剑指Offer(十九):顺时针打印矩阵
剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- redux 源码阅读
目录 [目录结构] [utils] actionTypes.js isPlainObject.js warning.js [逻辑代码] index.js createStore.js compose. ...
- Mybatis的一级缓存和二级缓存的理解以及用法
程序中为什么使用缓存? 先了解一下缓存的概念:原始意义是指访问速度比一般随机存取存储器快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术.对于我们编程来说,所谓的 ...
- 基于Taro与Typescript开发的网易云音乐小程序
基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...
- nginx有哪些作用
Nginx应该是现在最火的web和反向代理服务器,没有之一.她是一款诞生于俄罗斯的高性能web服务器,尤其在高并发情况下,相较Apache,有优异的表现. 那除了负载均衡,她还有什么其他的用途呢,下面 ...
- 迁移桌面程序到MS Store(10)——在Windows S Mode运行
首先简单介绍Windows 10 S Mode,Windows在该模式下,只能跑MS Store里的软件,不能通过其他方式安装.好处是安全有保障,杜绝一切国产流氓软件.就像iOS一样,APP进商店都需 ...