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漏洞修复总结的更多相关文章

  1. Fortify漏洞之Cross-Site Scripting(XSS 跨站脚本攻击)

    书接上文,继续对Fortify漏洞进行总结,本篇主要针对XSS跨站脚步攻击漏洞进行总结,如下: 1.Cross-Site Scripting(XSS 跨站脚本攻击) 1.1.产生原因: 1. 数据通过 ...

  2. 织梦dedecms漏洞修复大全(5.7起)

    很多人说dedecms不好,因为用的人多了,找漏洞的人也多了,那么如果我们能修复的话,这些都不是问题. 好,我们来一个一个修复.修复方法都是下载目录下该文件,然后替换或添加部分代码,保存后上传覆盖(记 ...

  3. Jsp万能密码漏洞修复例子

    更多详细内容请查看:http://www.111cn.net/jsp/Java/58610.htm 如果网站出现这种“万能密码”漏洞该怎么办呢 'or'='or' 漏洞修复 方法有很多在这里介绍两种, ...

  4. appscan 安全漏洞修复办法

    appscan 安全漏洞修复办法http://www.automationqa.com/forum.php?mod=viewthread&tid=3661&fromuid=21

  5. 腾讯云发布runC容器逃逸漏洞修复公告

    尊敬的腾讯云客户,您好:  近日,腾讯云安全中心监测发现轻量级容器运行环境runc被爆存在容器逃逸漏洞,攻击者可以在利用该漏洞覆盖Host上的runc文件,从而在Host上以root权限执行代码. 为 ...

  6. Mysql漏洞修复方法思路及注意事项

    [系统环境] 系统环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga)  +  5.7.16 MySQL Community Server  ...

  7. Web常见漏洞修复建议

    一.SQL注入修复建议 1.过滤危险字符,例如:采用正则表达式匹配union.sleep.and.select.load_file等关键字,如果匹配到则终止运行. 2.使用预编译语句,使用PDO需要注 ...

  8. java中xxe漏洞修复方法

    java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...

  9. 360软件的木马查杀、漏洞修复等组件不能使用,提示runtime error

    一.故障现象:1.360软件的木马查杀.漏洞修复等组件不能使用,提示runtime error2.暴风影音等很多软件不能正常使用3.设备管理器不能打开,提示“MMC 不能打开文件”4.部分https安 ...

随机推荐

  1. 配置Oracle透明网关用以连接 SQLServer经验总结

    一.情景介绍   业务中设计两个不同的系统,系统1和系统2,两个系统分别使用的是Oracle和SQLServer数据库.现需要在系统1的数据库中直接查询系统2数据库的数据.即在Oracle中执行SQL ...

  2. OSI七层网络模型与TCP/IP四层模型

    1.OSI七层结构图: 2.TCP/IP四层结构图: 3.各层对应的协议 4.OSI七层和TCP/IP四层的区别 OSI网络模型和TCP/IP网络模型对应关系: 5.交换机工作在OSI的哪一层 如果有 ...

  3. js 分享一个 时钟效果

    <style>        *{            margin: 0;            padding: 0;        }        #outLine{       ...

  4. js中更改this指向 以及回顾bind、call和apply

    1.更改this指向 方法1:对this进行保存            var _this = this; 例: var _this = this;     document.onclick = fu ...

  5. 夜空中最靓的二狗子是如何让 HTTPS 快上加快的?

    二狗子是某不知名网站的站长,他热衷于通过博客分享日常的一些工作.生活.技术等,立志要成为夜空中最靓的仔. 但是前段时间有几个用户反馈,网站总是莫名会跳转到一个 xx 网站,除此之外访问速度也有点慢.作 ...

  6. python 18 re模块

    目录 re 模块 1. 正则表达式 2. 匹配模式 3. 常用方法 re 模块 1. 正则表达式 \w 匹配字母(包含中文)或数字或下划线 \W 匹配非字母(包含中文)或数字或下划线 \s 匹配任意的 ...

  7. HTML连载33-背景定位

    一.背景定位 同一个标签可以同时设置背景颜色和背景图片,如果颜色和图片同时存在,那么图片会覆盖颜色 1.在CSS中有一个叫做background-position:属性,就是专门用来控制背景图片的位置 ...

  8. MSIL实用指南-位运算

    C#支持的位运算是与.或.异或.取反.左移.右移,它们对应的指令是And.Or.Xor.Not.Shl.Shr. 取反运算只需要一个操作数,生成步骤是1.生成加载变量2.生成取反指令实例代码: ilG ...

  9. log4j配置相对路径

    整理自网上: 一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便, 1.log4j的FileAppender本身就有这样的机制, ...

  10. c#搭建jenkins自动构建环境

    这边我使用的是参数化构建过程,文笔比较差劲,就直接上干货了 1.定义构造参数 2.设置jenkins工作空间目录,在此定义了版本号和工作目录构建参数 3.配置svn 4.构建触发器,用于轮询查看svn ...