本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记
逻辑漏洞指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性。一般出现在密码修改,越权访问,密码找回,交易支付金额等功能处。本篇着重讲解越权访问漏洞和交易漏洞。
逻辑漏洞表现为开发者或设计者在开发过程中对逻辑的不正确判断,也就是写代码不够认真,从而产生的漏洞,是人为造成的。
分为水平越权和垂直越权。
水平越权: 相同级别(权限)的用户或者同一角色中不同的用户之间,可以越权访问、修改或者删除其他用户信息的非法操作。如果出现此漏洞,可能会造成大批量数据的泄露,严重的甚至会造成用户信息被恶意篡改。
垂直越权: 不同级别之间的用户或不同角色之间的越权,比如普通用户可以执行管理员才能执行的功能。
在我实际渗透中,某次遇到一个网站存在水平越权漏洞,当时网站某些部分需要邀请新用户或充值才能访问,但我作为0氪用户,是不可能搞这些的。但我抓包发现存在水平越权漏洞,可以查看,修改其它用户的密码。因此我就一直用别人的账号。那个网站至今还没有修复这个漏洞。
垂直越权最常见的就是普通用户执行了管理员的操作,例如在DedeCMS中,普通用户可以非法修改管理员(admin)的密码。以及前文的代码执行漏洞,使普通用户有操控服务器的权限。都属于垂直越权。
按照习惯,先来一个实例。
某网站可以查看用户密码,但是存在越权访问漏洞。
由于只是实例,这里就不连接数据库了。
index.php
$users=array(
"1"=>"123456",
"2"=>"HelloWorld",
"3"=>"manlu"
);
if (isset($_COOKIE['id'])){
$id=$_COOKIE['id'];
}else{
setcookie("id",'1');
header("Refresh:0");
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>查看用户信息</title>
</head>
<body>
<label for="id">用户id:</label>
<input type="text" id="id" value="=$id?>"><br>
<label for="pwd">用户密码:</label>
<input type="password" id="pwd" value="=$users[$id]?>"><button>查看</button>
<script>
document.getElementsByTagName('button')[0].onclick=function () {
document.getElementById("pwd").type="text";
}
</script>
</body>
</html>
访问该界面,可以看到id为1的用户的密码。
按下F12查看cookie,发现了参数id
假如将参数id改为其他的数字,就可以看到其它用户的密码。
假如某个存在水平越权漏洞的网站允许用户更改密码,攻击者可以修改其它用户的密码,同时配合脚本,可以获取所有用户的信息。
垂直越权
还是刚才的实例,假如用户表中还存储了admin的账号密码,就可以非法得到admin的账号密码。
$users=array(
"0"=>"admin",
"1"=>"123456",
"2"=>"HelloWorld",
"3"=>"manlu"
);
常见的支付漏洞有:
支付订单: 在支付订单时,可以篡改价格为任意金额;或者可以篡改运费或其他费用为负数,导致总金额降低。
竞争条件: 在前文的文件上传漏洞中有提到,利用于多种场景。假如用户A余额为10元,商品B价格为6元,C价格为5元,假如A想购买B和C,余额是不够的。但是如果A利用竞争条件,使用多线程同时发送购买商品的请求,可能会出现以下几种结果:
①有一件商品购买成功
②商品都购买成功,但只扣了6元
③商品都购买成功,余额变为-1
直接上实例
index.php
$balance=0;
if (isset($_COOKIE['balance'])){
$balance=(double)$_COOKIE['balance'];
}else{
setcookie("balance","10");
header("Refresh:0");
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>购买</title>
</head>
<body>
<div>
<h2>余额:<?=$balance?></h2>
</div>
<form id="form">
<label for="price">商品价格:</label><br>
<input type="text" disabled="disabled" value="6"><br>
<label for="number">购买数量:</label><br>
<input type="number" id="number" value="1" name="number"><br>
<input type="button" value="确认购买" id="btn">
</form>
<script>
document.getElementById("btn").onclick=function () {
var form=document.getElementById("form");
var formdata=new FormData(form);
formdata.append("price",'6');
var xhr=new XMLHttpRequest();
xhr.open("POST","buy.php",true);
xhr.send(formdata);
xhr.onreadystatechange=function()
{
if (xhr.readyState==4 && xhr.status==200)
{
var text=xhr.responseText;
alert(text);
location.reload();
}
}
};
</script>
</body>
</html>
buy.php
$price=(double)$_POST['price'];
$number=(int)$_POST['number'];
$balance=(double)$_COOKIE['balance'];
$money=$number*$price;
if ($balance>$money){
setcookie("balance",(string)($balance-$money));
echo "购买成功";
}else{
echo "余额不足";
}
?>
在这里存在两种漏洞利用的方式,修改数量和修改金额(修改余额是不行的,实际渗透中余额都存在数据库中,这里为了方便存在cookie中)。
打开bp,点击确认购买,抓包查看。
在这里将购买数量number改为 -1
发送,购买成功,发现余额变成了16
此外还可以修改商品金额,还是同样的抓包,把金额price改为 -10
发送,弹出购买成功
发现余额变为20
竞争条件在此不掩饰,可自行测试。
越权访问
严格检查用户的Cookie,做好身份确认
购买漏洞
严格处理用户的输入,不要相信前端规范,在后端进行防范。