逻辑处理漏洞

0x00 逻辑处理漏洞

很多漏洞出现的原因是在代码编写的环节没有考虑到一些安全问题,由程序逻辑失误导致的,这里记录一下一些常见的逻辑处理漏洞。

0x01 in_array函数

in_array()函数是用来判断一个值是否在一个列表里面,一般用法如下:

1
in_array('b',array('a','b','c'))

当我们php代码中这样写时:

1
2
3
4
5
6
7
<?php
if(in_array($_GET['id'],array(1,2,3,4)))
{
$sql="select where id='".$_GET['id']."'";
echo $sql;
}
?>

这段代码判断得到的参数id的值是否在array这个数组中,但是这里如果输入id=1’ union select * from user,in_array()函数会自动进行类型转换,就会认为这个输入参数类型转换之后是1,属于array数组中,就会执行select where id =’1’ union select * from user。

0x02 双等于和三等于

php中,双等于与三等于之间有一些区别,其中双等于在判断等于之前会先进行数据类型转换,而三等于则不会,所以在一些情况下,双等于会造成一些安全问题。

1
2
3
<?php
var_dump($_GET['var']==2);
?>

var_dump()函数用于输出变量结构、内容和类型,一般用于精确调试。

这里我们如果给出var=2abcd,就会返回bool(true),发现类型强制转换之后判断为true。

0x03 is_numeric函数

in_numeric()用来判断一个变量是否为数字,如果检查通过返回true,否则返回false

1
2
3
4
5
6
7
<?php
if(is_numeric($_GET['var']))
{
$sql="insert into user values('user',{$_GET['var']})";
echo $sql;
}
?>

这个函数存在一个问题,那就是当传入hex时直接通过并返回true,但是mysql中是可以通过hex编码代替明文的,如我们提交一个xss测试代码

1
<script>alert(1)</script>

对应的hex编码

1
0x3c7363726970743e616c6572742831293c2f7363726970743e

就会成功的将代码传入数据库。

0x04 订单支付漏洞

在一些电商网站会出现的一些逻辑漏洞,主要是客户可以更改单价、总价、数量等,然后提交之后后台未作严格的校验导致的。

比如价格可以在客户端提交,那么原本几千元的商品,我们抓包修改提交订单的商品单价为1,如果后台未作校验直接跳转支付界面,那么就可以用一元钱购买物品。总价也是同理。

再比如将要购买的商品数量或单价改为负数,如果后台未作检验,那么计算总价时就会计算出负数,反而会让我们越买钱越多。

0x05 利用时间差

这种类型在早期刷钻的时候出现过,先发给腾讯一条开通某钻的订单,然后再发送一个取消业务的短信给运营商,这样腾讯那边成功开通但是无法扣费,就实现了刷钻。

还有就是在购买商品时,判断余额这条语句和扣费语句之间有某几条语句浪费了一些时间。比如我们有10元钱,然后商品也是10元,我们就可以以极快的速度发很多个请求,这个时候还没用扣费所以判断余额10元足够开通,然后请求都发送之后,获得了很多个10元钱请求的商品,然后才开始扣费,使余额成为负数,但是商品已经全部成功买到。

0x06 水平权限漏洞

水平越权,即是相同级别的用户或者同一角色的不同用户之间,可以越权访问修改或者删除等重要功能。

如果我们自己的页面最后的id是12300,如果设计者没有考虑到水平权限的问题再次验证用户访问的空间是否属于这个用户自身的话,那么就可以通过遍历来得到所有用户的信息,甚至进行修改等。

0x07 垂直权限漏洞

垂直越权就是低权限用户(普通用户)可以访问更高权限(如管理员)才能访问到的资源。

如之前淘宝举报号任意访问的问题,我们通过普通用户的身份,可以访问只有管理员才能访问的举报信息,就是这里的权限检查出现问题。

0x08 未授权访问

这个漏洞广泛存在于目前的网络中,很多公司都没有对自己公司的某些敏感目录做访问限制,使得外网可以直接通过浏览器访问。

如正方教务系统的后台敏感日志查看漏洞

我们在正方教务系统的登陆页面后面加上/log/2018-04-17-log.txt,就可以直接访问后台敏感日志。

有的公司的files信息和phpinfo信息,也直接暴露给用户,会被获得很多敏感信息。

0x08 总结

逻辑处理漏洞还有很多类型,比如验证码爆破、密码找回等等,这些漏洞虽然原理不难理解,但是由于程序员编写代码时的考虑不周,导致逻辑处理漏洞广泛存在,并且危害极高,解决逻辑处理漏洞,更需要的是安全工作人员和开发人员的沟通配合。