逻辑处理漏洞

逻辑处理漏洞

大多数的漏洞都是由于程序的逻辑失误导致的,都可以叫做逻辑漏洞。目前逻辑漏洞是各大企业存在最多的漏洞之一,因为逻辑漏洞在挖掘和利用时都需要进行一些逻辑判断,机器代码很难模拟这块的逻辑处理。下面我们从代码层逻辑错误导致的漏洞开始分析,再到应用业务层常见漏洞分析,如支付、找回密码、程序安装等。

挖掘经验
由于业务逻辑漏洞大多都存在逻辑处理以及业务流程中,没有特别明显的关键可以用来快速定位,通常这类漏洞的挖掘技巧就是通读功能点代码,先熟悉这套程序的业务流程,后面挖掘起来就会比较顺利。

等于与存在判断绕过
在逻辑漏洞里,判断函数是一个非常典型的例子,函数如果存在漏洞,就可以逃逸这个判断函数,这个逻辑就可以绕过了,下面我们介绍几个常见的存在漏洞的逻辑函数。

(I)in_array函数
in_array()函数是用来判断一个值是否存在某一个数组列表里面,通常判断方式如下:
in_array(‘b’,array(‘a’,’b’,’c’))
这是没什么问题,但是我们看看下面的代码:

这段代码作用是过滤GET参数typeid在不在1,2,3,4这个数组里面,如果在就拼接到SQL语句里,看着好像没什么问题,但是in_array()函数比较之前会自动做类型转换,当我们在浏览器输入
http://localhost/c.php?typeid=1' union select…,结果如下:

可以看到我们提交的typeid参数并不全等于这个数组中的任何一个值,但是还是可以绕过这个检查并且成功注入。

(II)is_numeric函数
is_numeric函数作用是判断一个变量是否为数字,如果是则返回true,否则返回false。
测试代码如下:

代码看起来没什么问题,不过这个函数存在一个问题,当传入的参数为hex时则直接通过并返回true。

现在我们分别测试数字、字符和字符的hex编码三种情况的结果:
在浏览器输入http://localhost/i.php?var=1

在浏览器输入http://localhost/i.php?var=x

在浏览器输入
http://localhost/i.php?
var=0x3c7363726970743e616c6572742831293c2f73636970743e

如果应用程序有其他地方调用这个值,并且直接输出,则有可能执行这段代码,触发XSS漏洞。

(III)双等于和三等于
PHP的双等于和三等于的区别在于:双等于在判断等于之前会先做变量类型转换,而三等于不会。由于数据类型被改变,所以双等于在判断的时候可能存在安全风险。
测试代码如下:

在浏览器输入http://localhost/d.php?var=2a,结果如下:

输出结果为true,证明做了类型转换。
将双等于改为三等于,代码如下:

在浏览器输入http://localhost/dd.php?var=2a,结果如下:

输出结果为false,证明没有做类型转换。

未exit或return引发安全问题
某些情况下,在经过if条件判断之后,有两种操作,一种是继续执行if后面的代码,另一种是在if体内退出当前操作,但是退出行为程序忘了写return、die()或者exit(),程序会继续执行。
测试代码如下:

在浏览器输入http://localhost/h.php?var=aa,确定后会跳转,结果如下:

常见支付漏洞
1.客户端修改单价、总价和购买数量,服务器端未校验严格导致;
2.重复发包来利用时间差,以少量的前多次购买。
我们在做代码审计的挖掘这类漏洞的时候,可以注意寻找下面这种形式的代码:
if(check_money($price))
{
//do something(需要花费几秒)
$money=$money-$price;
}
?>
或者在”do something”代码段地方调用其他API或脚本,而扣费也是在API或脚本里面完成。

Ecshop逻辑错误注入分析
这个源代码我在网上没找到,就用主要的代码说明吧,代码如下:

$order_sn变量由str_replaces($_GET[‘subject’]),”,$_GET[‘out_trade_no’];控制,我们可以通过$_GET[‘subject’]参数来替换掉$_GET[‘out_trade_no’]参数里面的反斜杠。
最终$order_sn被带入check_money()函数,代码如下:

原来的$order_sn被带入了数据库导致注入漏洞存在,这个漏洞的逻辑问题在于本来一个已经过滤掉特殊
字符的参数,又再次被用户自定义提交上啦的参数替换,导致原来的过滤符合反斜杠被替换掉。

利用实践:我们首先要通过str_replace来达到我们想要的效果,%00是截断符,测试代码如下:

在浏览器输入http://localhost/s.php?a=0&b=%00’,结果如下图:

漏洞防范
通过分析我们之前列举的几种逻辑漏洞,可以看到所有的逻辑漏洞都是因为开发者对业务逻辑或者代码逻辑理解不清楚导致的,要解决这类逻辑问题需要注意一下两点:
1.要深入熟悉业务逻辑;
2.要注意多熟悉函数的功能和差异。

你可能感兴趣的:(代码审计)