一、越权
1.越权:
分为水平越权、垂直越权与未授权访问。
水平越权:通过更换某个ID之类的身份标识,从而使A账号获取修改B账号数据;
垂直越权:使用低权限身份的账号,发送高权限账号才能有的请求,获取其更高权限的操作;
未授权访问:通过删除请求中的认证信息后重放该请求,依旧可以访问或者完成操作(比如随意登录后台);
2.pikachu靶场:
1)水平越权:我们修改username即可更改为其他用户。
源码:
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "op1_login.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../../";
include_once $PIKA_ROOT_DIR . 'header.php';
include_once $PIKA_ROOT_DIR.'inc/mysql.inc.php';
include_once $PIKA_ROOT_DIR.'inc/function.php';
include_once $PIKA_ROOT_DIR.'inc/config.inc.php';
$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']);
$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;
}
}
if(isset($_GET['logout']) && $_GET['logout'] == 1){
session_unset();
session_destroy();
setcookie(session_name(),'',time()-3600,'/');
header("location:op1_login.php");
}
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="../op.php">Over Permission</a>
</li>
<li class="active">op1 member</li>
</ul><!-- /.breadcrumb -->
<a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
data-content="这里可以查别人的信息吗?">
点一下提示~
</a>
</div>
<div class="page-content">
<div id="mem_main">
<p class="mem_title">欢迎来到个人信息中心 | <a style="color:bule;" href="op1_mem.php?logout=1">退出登录</a></p>
<form class="msg1" method="get">
<input type="hidden" name="username" value="<?php echo $_SESSION['op']['username']; ?>" />
<input type="submit" name="submit" value="点击查看个人信息" />
</form>
<?php echo $html;?>
</div>
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR . 'footer.php';
?>
2)垂直越权:
我们在登陆admin的情况下抓取admin添加用户的数据包,之后在登陆只有查看权限的pikachu用户,会发现再将数据包发出去可以成功添加用户(有session验证,需要修改数据包的session),这就是一种垂直越权:
添加用户代码的注释里说的很清楚:
但是我们正常情况下普通用户是抓取不到admin的数据包的,因此想要越权添加用户可以有以下方法参考:
- 知道网站源码来本地模拟搭建;
- 普通用户根据前端信息抓取数据包(数据包的uid、数据库里的usertype/level/groupid等);
- 根据经验盲猜(相当于没说);
但是加入我们可以利用弱口令或注入进入到管理员登录界面,就可以直接进去了,也就不需要越权了(后面细说)。
3.实战:墨者靶场
4.工具:privilegechecker、burp的插件authz、secscan-authcheck-master(中通开源越权检测工具)
绿色代表可以越权访问。
5.修复:
二、登录
登录处安全问题:
1.http与https:
ssl加密过程:
2.账号密码处暴力破解:
burp可以对我们要爆破的密码进行加密处理
3.Cookie 脆弱点验证修改测试:
熊海cms(白盒代码审计):
我们在登陆界面可以知道会包含checklogin.php来验证登陆:
在代码中我们可以看到验证登陆处存在cookie验证漏洞,我们抓包修改cookie为user=1就可以不输入账号密码直接登陆后台界面!
而且我们要跳转到的是?r=index界面,是此处有验证!不是?r=login处!只有在?r=index处cookie验证失败我们才会跳转到登录界面让我们登录,因此我们可以利用这里边的逻辑错误,修改在验证cookie处的cookie值,可以避开跳转,直接登录后台。
这是在白盒审计下可以发现的漏洞,而在黑盒下就得考验信息收集能力如何了,能找到源码最好,找不到就需要综合分析,比如看看服务器版本的历史漏洞等等。
同时这里有两点cookie常识:
- burp抓的包里边会掺杂许多浏览器保存的其他网站的cookie。
- 浏览器清除痕迹包括cookie后就会将我们的登录状态清掉。
三、业务
1.数据篡改安全问题:
1)常见地方比如商品支付,订单,付款处。
参考:https://www.secpulse.com/archives/67080.html
2.某商城cms:
抓包修改订单数量、订单编号,此处没有加密和验证,很不安全:
3.大米手机cms:
抓包修改价格、改id购买其他商品:
其实还有替换支付的漏洞,不过环境没办法搭建…
类似漏洞很多,可以参考上边那个链接,不过目前网络环境大网站很少遇到这种漏洞了,而且遇见了也不敢轻易测试。
4.修复/防御:
比如:将价格定义在数据库中,直接调用,即使修改数据包也没用,数据库的数据不会变,仍以数据库数据为准。
四、找回、验证、接口
1.墨者靶场:登录密码重置漏洞分析溯源
原理:就是我们先在重置界面发验证码给要改的目标手机号(自然得不到验证码),然后再重置自己的手机号,发验证码,得到验证码,就将自己的手机号改为目标手机号,因此可以达到修改对方密码的目的。这就是此处的逻辑漏洞,没有将验证码与手机号绑定!并且正常界面都是两个重置界面,先验证验证码在进入重置界面,此处只有这一个界面,因此可以篡改手机号。
2.客户端回显:就是抓前端包中会包含验证码。(实例:某绑定手机验证码逻辑漏洞)
我们都不用手机接收验证码,在数据包中就能看到;而且测试后发现验证码正确时回显为1,错误是回显为3:
测试发现同时此处还存在修改回显状态值漏洞,即将错误回显的3改为1也可将绑定手机修改成功。这种漏洞只有在只前端验证时才会出现,我们可以修改,若是后端验证就无法利用该漏洞了。
PS:
burp如何抓取response回显包:
3.验证安全:
前边我们学习csrf时知道token是用来验证客户端唯一性的,可以有效防止伪造请求。验证码就随处可见了,有简单可以用插件绕过的,也有那种复杂的拖动题就较难绕过了,需要利用收费平台的接口。
#验证码安全:
分类:图片,手机或邮箱,语音,视频,操作等
原理:验证生成或验证过程中的逻辑问题
危害:账户权限泄漏,短信轰炸,遍历,任意用户操作等
漏洞:客户端回显(已讲),验证码复用,验证码爆破(已讲),绕过等
#token 安全:
基本上述同理,主要是验证中可存在绕过可继续后续测试
token 爆破,token 客户端回显等
#验证码识别插件工具使用:
captcha-killer,Pkav_Http_Fuzz,reCAPTCHA 等
1)Pkav_Http_Fuzz工具:(需要复制图片地址带上请求数据包才能识别;能识别一些简单的,但无法与第三方应用连接不如burp,也无法调用其他库,具体使用看操作手册。)
2)burp插件captcha-killer与reCAPTCHA:
这个插件需要寻找一个好点的接口,而且爆破时也可以使用这个插件来识别,批量跑,不够得看接口好不好,而且好的需要收费,但也仅能识别图片,至于滑动/点击的验证码,比较复杂,难绕过。
参考:https://www.cnblogs.com/nul1/p/12071115.html
3)pikachu靶场:
服务端(on server)绕过:
此处漏洞就是没有在验证一个表单后随即消除验证码的session,导致我们之后仍然可以输入利用该验证码来爆破账号密码达到登录效果:
我们先随便输入账号密码和验证码:
之后将验证码修改正确,提交后发现提示不是验证码失效而是账号密码错误,因此可以判断此处验证码session并没有被销毁,可以使用同一验证码爆破账号密码绕过验证码检测:
源码:
if (empty($_POST['vcode'])) {
$html .= "<p class='notice'>验证码不能为空哦!</p>";
} else {
// 验证验证码是否正确
if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {
$html .= "<p class='notice'>验证码输入错误哦!</p>";
//应该在验证完成后,销毁该$_SESSION['vcode']
}else{
$username = $_POST['username'];
$password = $_POST['password'];
$vcode = $_POST['vcode'];
$sql = "select * from users where username=? and password=md5(?)";
$line_pre = $link->prepare($sql);
$line_pre->bind_param('ss',$username,$password);
if($line_pre->execute()){
$line_pre->store_result();
//虽然前面做了为空判断,但最后,却没有验证验证码!!!
if($line_pre->num_rows()==1){
$html.='<p> login success</p>';
}else{
$html.= '<p> username or password is not exists~</p>';
}
}else{
$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';
}
<?php
session_start();
include_once 'function.php';
//$_SESSION['vcode']=vcode(100,40,30,4);
$_SESSION['vcode']=vcodex();
//验证码绕过 on server 这里其实还是有一个问题,就是服务端将验证码字符串以明文COOKIE的方式给了前端,那验证码还有什么鸟意义。。。
setcookie('bf[vcode]',$_SESSION['vcode']);
?>
客户端(on client)绕过:
就是简单的前端js生成代码,这个就好绕过了,禁用js就行,能抓到包说明就已经过拦截了:
token防爆破绕过:
token简而言之就是确保提交一次数据包附带一个唯一的token吗,可以防止爆破,同样可以防止跨站伪造,想要绕过有几个方法:
- 看客户端回显,分析数据包(最靠谱),然后爆破token
- 了解或猜到token的生成规则或加密方式
看客户端回显,其实就是分析回显数据包可能存在的token,其有时可能是下一个数据包的token,我们可以尝试抓取该token用于下一次发送请求:
然后利用bp的intruder模块爆破成功(提取上一个数据包token用于下一个发送请求操作):
burp还是有很多功能是没接触到的,burp yyds!
4.接口:
#接口安全问题:
调用,遍历,未授权,篡改等
调用案例:短信轰炸
遍历案列:UID 等遍历
callback 回调 JSONP
参数篡改:墨者靶场
寻找关键字,id/uid/callback等等,需要用到接口的时候才可能存在漏洞,有点类似爬虫,可以利用bp的spider模块,爬取后在target模块查看网站的结构: