午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

SQL注入常規(guī)Fuzz全記錄

 Remind 2021-10-04

前言

本篇文章是在做ctf bugku的一道sql 盲注的題(題目地址:注入題目)中運(yùn)用了fuzz的思路,完整記錄整個(gè)fuzz的過(guò)程,給師傅們當(dāng)點(diǎn)心,方便大家加深對(duì)web sql注入 fuzz的理解。

進(jìn)入主題

1.訪問(wèn)題目,是個(gè)典型的登錄框

2.嘗試輸入admin/123456,提示密碼錯(cuò)誤,因此可以確定存在用戶admin,這里可能會(huì)有師傅要爆破了,但這里題目要求sql注入,我們就按照預(yù)期解來(lái)吧。

3.我自己寫(xiě)了個(gè)簡(jiǎn)單的fuzz burp插件,先將登陸請(qǐng)求包發(fā)送到插件掃描,可以看到是存在盲注的,payload的形式為:

4.fuzz

(1)從payload的形式可以猜測(cè)題目應(yīng)該是過(guò)濾了注釋符(–+和#)

(2)fuzz一遍特殊字符,看看過(guò)濾了什么

當(dāng)存在過(guò)濾的字符時(shí),響應(yīng)包是這樣的

因此可以作為fuzz的判斷(當(dāng)然有些waf是靜默waf,就是照樣接收你的數(shù)據(jù)但自己做了處理,返回正常頁(yè)面,這種fuzz的判斷有時(shí)候就需要設(shè)計(jì)下你的payload,這種在以后的文章繼續(xù)討論)

fuzz特殊字符,結(jié)果如下,可以看到長(zhǎng)度為370的是被wa了的,過(guò)濾了相當(dāng)多的字符,特別是內(nèi)聯(lián)注釋 注釋符 空格 %0a %0b %0d %a0這些比較常用的繞過(guò)關(guān)鍵組件,尤其注意過(guò)濾了逗號(hào)

(3)fuzz一遍關(guān)鍵字,過(guò)濾了and or order union for 等等,因此取數(shù)據(jù)常用的mid( xx from xx for xx)就不能用了,之前逗號(hào)也被過(guò)濾了也就不能用mid(xx,1,1)。

(4)fuzz函數(shù)名和操作符(由于插件的掃描結(jié)果沒(méi)有過(guò)濾sleep,直覺(jué)上是沒(méi)有對(duì)函數(shù)做過(guò)濾)

不出意外,確實(shí)是只有包含關(guān)鍵字or and等的函數(shù)被wa了,其他基本沒(méi)有,其實(shí)這里我們也可以聯(lián)想到跑表經(jīng)常要用的information_schema表是存在or關(guān)鍵字的,因此后面構(gòu)造語(yǔ)句的時(shí)候也就不能直接用information_schema

(5)嘗試用時(shí)間盲注跑數(shù)據(jù)

if(1=1,sleep(5),0)

由于不能用逗號(hào)需要變?yōu)?/p>

CASE WHEN (1=1) THEN (sleep(5)) ELSE (2) END

但空格也被過(guò)濾了,需要用括號(hào)代替空格(/*!*/ 空格 tab %a0 %0d%0a均被過(guò)濾了)

(CASE WHEN(1=1)THEN(sleep(1))ELSE(1)END);

最后本地測(cè)試的時(shí)候發(fā)現(xiàn)case when之間不能用括號(hào),做一下字符fuzz,從%00到%ff

可以看到結(jié)果是確實(shí)不行,并不能產(chǎn)生延時(shí)(有的直接被wa,有的沒(méi)被wa但sql語(yǔ)句無(wú)法生效),因此基本可以確認(rèn)不能用時(shí)間盲注跑數(shù)據(jù),于是我們只能考慮布爾盲注

(6)嘗試布爾盲注

由于無(wú)法使用if或者case/when,只能使用題目自帶的bool盲注做邏輯判斷(=) 比如我們一開(kāi)始就注意到存在admin用戶,改造插件的payload: '+sleep(5)+’ (注意把+換為%2b)

  1. admin'+1+' (false,注意把+換為%2b)
  2. admin'+0+' (true,注意把+換為%2b)
  1. select * from user where name='admin'+1+'' and passwd='123456';(為false) ==>提示用戶名錯(cuò)誤
  2. select * from user where name='admin'+0+'' and passwd='123456';(為true) ==>提示密碼錯(cuò)誤

這里是mysql的一個(gè)特性,可能有不明白的師傅,可以做下實(shí)驗(yàn)

select 'admin'='admin'+0 union select 'admin'='admin'+1;

前者為1后者為0,先對(duì)右邊的等式做運(yùn)算,發(fā)生強(qiáng)制轉(zhuǎn)換,結(jié)果為數(shù)字,然后再和左邊的admin字符做比較,又發(fā)生了強(qiáng)制轉(zhuǎn)換,因此出現(xiàn)1和0的區(qū)別。

這樣子我們就解決了布爾盲注的判斷了

(7)解決下跑數(shù)據(jù)的問(wèn)題

這里不能用mid(xxx,1,1)也不能用mid(xxx from 1 for 1),但查手冊(cè)發(fā)現(xiàn)可以使用mid(xxx from 1),表示從第一位開(kāi)始取剩下的所有字符,取ascii函數(shù)的時(shí)候會(huì)發(fā)生截?cái)啵虼死胊scii(mid(xxx from 1))可以取第一位的ascii碼,ascii(mid(xxx from 2))可以取第二位的ascii,依次類(lèi)推

(8)burp跑數(shù)據(jù)

a.判斷passwd字段的長(zhǎng)度: 跑出長(zhǎng)度為32

(這里可以猜字段,根據(jù)post請(qǐng)求包中的passwd猜測(cè)數(shù)據(jù)庫(kù)的字段應(yīng)該也是passwd,這樣就可以不用去跑information_schema,直接在登陸查詢語(yǔ)句中獲取passwd)

admin'-(length(passwd)=48)-'

b.跑第一位

這里的payload我用的不是上面的,從最后面開(kāi)始倒著取數(shù)據(jù)然后再reverse一下,那時(shí)候做題沒(méi)轉(zhuǎn)過(guò)彎,其實(shí)都一樣的,用下面的payload的好處是假如ascii不支持截?cái)嗟那闆r下是不會(huì)報(bào)錯(cuò)的(用于其他數(shù)據(jù)庫(kù)的時(shí)候)

=admin'-(ascii(mid(REVERSE(MID((passwd)from(-1)))from(-1)))=48)-'

用這一個(gè)也可以的

=admin'-(ascii(mid(passwd)from(1))=48)-'

重復(fù)上述操作修改偏移,即可獲取32位密碼005b81fd960f61505237dbb7a3202910解碼得到admin123,登陸即可獲取flag,到這里解題過(guò)程結(jié)束。

總結(jié)

1.上述用到的fuzz字典均可在sqlmap的字典以及mysql官方手冊(cè)中收集

2.這里僅僅是常規(guī)的fuzz,但大多數(shù)fuzz其實(shí)都是相通的,主要是fuzz的判斷,fuzz的位置,fuzz payload的構(gòu)造技巧等等

3.歡迎各位大師傅一起交流討論!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多