本节课视频讲解链接:
https://www.bilibili.com/video/BV1r24y177mQ/?spm_id_from=333.999.0.0&vd_source=16d23ba7b6eb72e7c4367ba62ab5e2a5
1、漏洞说明
漏洞原理:
业务逻辑漏洞是指由于程序逻辑不严谨或逻辑太复杂,导致一些逻辑分支不能正常处理或处理错误。通俗地讲:一个系统的功能太多后,程序开发人员就难以思考全面,对某些地方可能有遗漏,或者未能正常处理,从而导致逻辑漏洞。逻辑漏洞也可以说是程序开发人员的思路错误、程序开发人员的逻辑存在漏洞。
攻击流程:
-
正常操作并记录数据包
-
分析数据包
-
分析程序验证机制
-
修改源数据包
常见漏洞出现处及危害:
2、漏洞复现
1.水平越权
进入靶场使用lucy/123456,lili/123456,kobe/123456其中一个用户登录,查看信息,并进行抓包观察。
这里可以看到用户名是可以修改的,随便改一个用户的名称,观察是否可以进行数据读取。
可以看到,改变username就能查看其他用户的信息。(这里要会找哪个参数是用户名,比如相同账号名不能创建、在网页中浏览用户、在url中进行uid遍历)
2.垂直越权
首先登录超级管理员用户admin/123456,使用burpsuite抓取添加用户的数据包并发送至Repeater模块
登录普通用户pikachu/000000, burpsuite抓包查看当前用户Cookie值为7sphr1lspfo17505eqv1ajvc14
返回burpsuite的Repeater模块, 打开上述抓到的数据包, 将Cookie值修改为pikachu普通用户用户的Cookie, 然后点击发送
之后返回页面查看用户列表可发现多了一个用户Hacker,说明普通用户窃取了管理员创建用户的权限
3、漏洞代码审计
1.水平越权
漏洞成因:没有进行session验证。
$link=connect();
//判断是否登录,没有登录不能访问
if(!check_op_login($link)){
header("location:op1_login.php");
}
$html='';
if(isset($_GET['submit']) && $_GET['username']!=null){
//没有使用session来校验,而是使用的传进来的值,权限校验出现问题,这里应该跟登录态关系进行绑定
$username=escape($link, $_GET['username']);//escape()函数转码防止中文乱码
$query="select * from member where username='$username'";
$result=execute($link, $query);
if(mysqli_num_rows($result)==1){
$data=mysqli_fetch_assoc($result);
$uname=$data['username'];
$sex=$data['sex'];
$phonenum=$data['phonenum'];
$add=$data['address'];
$email=$data['email'];
$html.=<<<A
<div id="per_info">
<h1 class="per_title">hello,{$uname},你的具体信息如下:</h1>
<p class="per_name">姓名:{$uname}</p>
<p class="per_sex">性别:{$sex}</p>
<p class="per_phone">手机:{$phonenum}</p>
<p class="per_add">住址:{$add}</p>
<p class="per_email">邮箱:{$email}</p>
</div>
A;
}
}
2.垂直越权
漏洞成因:只验证了登录状态,没有对权限进行验证。
$link=connect();
//判断是否登录,没有登录不能访问
//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
if(!check_op2_login($link)){
header("location:op2_login.php");
exit();
}
if(isset($_POST['submit'])){
if($_POST['username']!=null && $_POST['password']!=null){//用户名密码必填
$getdata=escape($link, $_POST);//escape()函数转码防止中文乱码
$query="insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['address']}')";
$result=execute($link, $query);
if(mysqli_affected_rows($link)==1){//判断是否插入
header("location:op2_admin.php");
}else {
$html.="<p>修改失败,请检查下数据库是不是还是活着的</p>";
}
}
}
原文始发于微信公众号(ZackSecurity):【Web渗透入门】8.业务逻辑漏洞讲解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论