源代码里的逻辑漏洞该如何修补?


广义上来说,大多数漏洞是由程序的逻辑错误引起的,可以称为逻辑漏洞,但我们这里所说的逻辑漏洞没有那么大的范围,这里指的是程序在业务逻辑上的漏洞,业务逻辑漏洞也是很大的范围,不同的业务场景有不同的漏洞,现在逻辑漏洞是各大企业最多的漏洞一,逻辑漏洞在挖掘和利用时需要进行逻辑判断,机器代码很难模拟这个逻辑处理接下来,从代码层逻辑错误引起的漏洞进行分析,再到应用业务层常见的漏洞分析,如支付、密码回收、程序安装等。


由于业务逻辑漏洞大多存在逻辑处理和业务流程,没有特别明显的关键词可以快速定位,通常这种漏洞的挖掘技术是通读功能点源代码,首先熟悉这个程序的业务流程,然后挖掘比较顺畅,值得关注的是程序是否可以重复安装,密码是否可以修改其他用户的密码

等于绕过存在的判断。在逻辑脆弱性中,判断函数是非常典型的例子,某函数在某种情况下返回true,另一种情况下返回false,但是如果这些函数有脆弱性的话,就可以逃避这个判断函数,这个逻辑可以绕过去。接下来,让我们的脆弱性判断函数。


in_array函数。in_arrray()函数用于判断值是否在某个数组列表中,通常的判断方法如下in_array(b、array(b、b、c)

这没问题。让我们看看下面的代码

if(in_array($_get[typeid],array(1,2,3,4){

$sql="select...wheretypeid="。$_get[peid]。

echo$sql;


这个代码的作用是过滤GET参数typeid在1、2、3、4这个组中,如果在这个组中连接到SQL语言,似乎没有问题,但是这个in_array()函数有问题,比较之前会自动转换类型typeid=1unionselect……让我们看看最终输出的SQL语句是什么,如图所示。

我们提交的typeid参数不等于1、2、3、4组中的任何值,但可以绕过这个检查注入成功。

is_numeric函数。is_numeric()函数用于判断变量是否为数字,检查合格后返回true,否则返回false,请看以下代码<?php。

if(is_numeric($_GET[var])$sql="insertintoxxvalues(。{$_get[var]})"

echo$sql;


代码似乎没有问题,但该函数存在问题,输入的参数为hex时直接通过返回true,MySQL可以直接使用hex代码代替文字串,因此不能直接注入SQL文字,但存在二次注入和XSS等脆弱性。


通过分析我们之前列举的几种逻辑漏洞,可以看到所有的逻辑漏洞都是因为开发者对业务逻辑或者代码逻辑理解不清楚导致。每一种业务功能都有可能导致逻辑漏洞的产生,而业务功能里面的实现逻辑是人思考出来的,所以要解决这类逻辑问题需要注意以下两点:

要深入熟悉业务逻辑,只有我们熟悉了业务的逻辑,才能根据业务需要编写满足需求而又不画蛇添足的代码。要注意多熟悉函数的功能和差异,因为很多写代码写得很熟悉的人出现bug通常不是因为多一个字母或者少一个分号,而是代码执行逻辑上面考虑不周全导致。

分享: