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安 ...
随机推荐
- 帝国CMS(EmpireCMS) v7.5后台任意代码执行
帝国CMS(EmpireCMS) v7.5后台任意代码执行 一.漏洞描述 EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行. 二 ...
- DRF (Django REST framework) 中的视图扩展类
2. 五个扩展类 1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法 ...
- Eclipse导入spring-boot-plus(三)
Eclipse导入spring-boot-plus 安装lombok插件 !!!请先确保Eclipse已安装lombok插件!!!
- nginx单机1w并发优化
目录 ab工具 整体优化思路 具体的优化思路 编写脚本完成并发优化配置 性能统计工具 tips 总结 ab工具 ab -c 10000 -n 200000 http://localhost/index ...
- FastStone Capture(FSCapture) 注册码
FastStone Capture 是一款极好用的图像浏览.编辑和截屏工具,支持 BMP.JPG.JPEG.GIF.PNG.TIFF.WMF.ICO 和 TGA 在内的主流图片格式,其独有的光滑和毛刺 ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)
定场诗 伤情最是晚凉天,憔悴厮人不堪言: 邀酒摧肠三杯醉.寻香惊梦五更寒. 钗头凤斜卿有泪,荼蘼花了我无缘: 小楼寂寞新雨月.也难如钩也难圆. 前言 本章为重读<学习JavaScript数据结构 ...
- 【转】Python实现智能五子棋
前言 棋需要一步一步下,人生需要一步一步走.千里之行,始于足下,九层之台,起于累土. 用Python五子棋小游戏. 基本环境配置 版本:Python3 相关模块: 本文所做工作如下: (1) 五子棋界 ...
- INSERT: 批量插入结果集方式
INSERT: 批量插入结果集 insert into table select x,y from A UNION select z,k from B ; insert into table sele ...
- python 14 装饰器
目录 装饰器 1. 开放封闭原则 装饰器 1. 开放封闭原则 扩展是开放的,增加新的功能:修改源码(修改已经实现的功能)是封闭的. 在不改变源码及调用方式的前提下额外增加新的功能. # 版一: imp ...
- Leetcode之深度优先搜索(DFS)专题-513. 找树左下角的值(Find Bottom Left Tree Value)
Leetcode之深度优先搜索(DFS)专题-513. 找树左下角的值(Find Bottom Left Tree Value) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,在树的最后一行找到最 ...