CTF從入門到提升(二)約束條件的安全測試報錯注入

關(guān)于基于約束的SQL攻擊

在創(chuàng)建數(shù)據(jù)庫的時候,一般會先定義整個表的結(jié)構(gòu),假設(shè)我要做的是登錄入口,先簡單地創(chuàng)建一個用戶表。(用戶表中,我這里是定義了三個字段,第一個是ID,然后第二個是用戶名)

表已經(jīng)建完之后,看起來也沒什么問題,那么如果說我開發(fā)完了之后,應(yīng)該有個登錄入口。

對沒有賬號的人來說,需要有一個注冊入口。注冊的本質(zhì)是一個insert的過程,就是往里插入一條數(shù)據(jù)。假如里面數(shù)據(jù)庫沒有數(shù)據(jù),我就要往里加一個管理員賬戶。這個管理員我就會對它設(shè)置成admin,密碼是12346789。

(在這里我做一個演示,如果大家想看可以到安全牛課堂的視頻里看動手操作? ?CTF從入門到提升? ?課時2:3分0秒)

先去創(chuàng)建這張數(shù)據(jù)表,看一下,然后去創(chuàng)建一張,對吧?只有兩張表,然后我就去對uc。里面是空的,對吧?我接下來就往里插條數(shù)據(jù)insert。

剛才我們提到了去注冊的時候,它的本質(zhì)其實是我們一起插入一條數(shù)據(jù),它的長度是有限制的,它限制了30位,如果說我們插入31位會這樣,它會自動的把31位就是說大于30的東西給吃掉,就是相當于抹掉了,它只會插入前30位。

那么查出去插入的時候,它肯定會先去查一下,你去操作數(shù)據(jù)在表中原來存不存在。假設(shè)我去插了一個31位的數(shù)據(jù),它自然表中是永遠不會存在的,那么它就會把這31位的數(shù)據(jù)往表里去插。

比如說用戶名是這個密碼是大于六位,且包含大寫字母小寫字母和數(shù)字。這么復(fù)雜的大寫字母小寫字母和數(shù)字,我就隨便設(shè)一個,比如說大寫字母,這正常登錄試試看。大寫字母小寫字母數(shù)字就做一個段落。密碼就是一個去做一個登錄,發(fā)現(xiàn)這個時候就成功了,所以這個就是一個基于約束攻擊的簡單介紹。

題目:

(在這里我做一個演示,如果大家想看可以到安全牛課堂的視頻里看動手操作? ?CTF從入門到提升? ?課時2:10分20秒)

基于約束的就講這么多。接下來的話就講一下報錯注的一些問題,然后去做一個簡單的分析,然后也會結(jié)合一道題目來講解。 首先來看一個簡單的一個公式,直接往上套就可以去用了,但是我覺得既然學(xué)了還是要能了解就去了解一下。

?

報錯注入

首先要去了解一下一些函數(shù):

?

flow函數(shù)是向下取整。如果我們將rand*2之后,它的結(jié)果其實就會有0和1兩個結(jié)果。

?

這張表它其實就是默認會存在,而且這張數(shù)據(jù)表中的行數(shù)是很大的,后面我們也會去講到這個問題。在盲注中會用到一些笛卡爾積的形式調(diào)數(shù)據(jù)表數(shù)據(jù)量的問題。這個地方其實表中的數(shù)據(jù)量是很大的,所以說這個地方就是跟數(shù)據(jù)量會有一個關(guān)系,然后也可能跟后面的也會有一定的關(guān)系,要不然也不用這個橫豎了。

我們再繼續(xù)向下看,

它這個地方就是010101001,是這樣子,我第二次再執(zhí)行一次。0011,這兩次的執(zhí)行結(jié)果是不一樣的,你首先明白這個問題,然后第二另外一條語句它是加了一個0。

像這地方可以看一下,如果說0選中之后,去看這個序列,它是01101100的,即前幾位,我們再去做一個01101100。所以說他的前幾位序列是一致的,而且你要明白一個點,就是說剛才我們?nèi)タ此a(chǎn)生報錯的原因,是不是一條數(shù)據(jù)不報錯,然后調(diào)出兩條數(shù)據(jù)開始報錯,三條數(shù)據(jù)也可能報錯。它報出的前提條件就是前面幾條數(shù)據(jù)有就可以了,但到底需要幾條數(shù)據(jù),這個地方我們要進一步去看。那么所以說他肯定和序列是有關(guān)系的,因為像這種不加零的情況下,它是隨機報錯,就是兩條數(shù)據(jù),三條數(shù)據(jù)隨機報錯,但是加0必然報錯。

這個地方我們來看下演示。

(在這里我做一個演示,如果大家想看可以到安全牛課堂的視頻里看動手操作? ?CTF從入門到提升? ?課時2:21分26秒)

如果是不加零的話,我們可以是驗證一下我的說法。

(在這里我做一個演示,如果大家想看可以到安全牛課堂的視頻里看動手操作? ?CTF從入門到提升? ?課時2:23分40秒)

group,by的話它key這一列它其實必然是唯一的,不能出現(xiàn)重復(fù),那么這個時候它就不符合表的一個結(jié)構(gòu)問題,它自然就會報錯了。就是這樣的一個邏輯,可以看一下。

首先它會去建立一個虛擬表,就是我剛才演示的演示的一個表,組件就是像這個地方一樣的,就像這個地方那樣列明,然后這個是它數(shù)量:

發(fā)現(xiàn)第一條結(jié)果為零,查詢虛擬表0不存在,它要做一次插入。插入的時候,本質(zhì)其實是第二次調(diào)用,第二次調(diào)用就會在被計算一次,那么這時候插入的其實就是一個E那么插入了一周,接下來又是個E0110和幺序列,就這個序列對吧?那么又正常一的數(shù)量上去加一就是結(jié)果就是K等于1,它的那么就是數(shù)量事兒,對吧?然后接下來又是個零011,就會重復(fù)上一次的操作,查到的是零,它又想插個1,1是存在的,所以就會報錯了。

去做一個插入,本質(zhì)是第二次計算,第二次計算它就會超的一個實際值,然后第三次計算又是一個查詢,查詢之后又會做一個插入,那么如果它出現(xiàn)報錯,其實只要是插入的值兩次是一致的,它就會報錯,所以說在你只有表中只有兩條數(shù)據(jù)的時候,如果是隨機數(shù),那它就有可能去報錯,因為你兩次超過值都是一樣的。產(chǎn)生一個序列是一個0101,假設(shè)就是個去掉,查到一個0插入個1,而且它查到又是個0,又查個1,這時候就直接報錯了。但是其實它查的數(shù)據(jù)只有兩行,這個就是數(shù)據(jù)量少的時候報錯的原因。

我們再仔細來看一下這個語句這條數(shù)據(jù)。

它報錯的關(guān)鍵點其實是在于這個里面的這條數(shù)據(jù),假如在于這條數(shù)據(jù),我們可以把它復(fù)制出來看一下。

不一定要用0和1來代,只是為了方便大家理解。

除了這個報錯函數(shù)之外,還有很多的其他的報錯函數(shù)可以再去看一下,因為格式不符自然就要報錯。

像這個函數(shù)可以看一下,它的報錯,其實就是有局限性。

(在這里我做一個演示,如果大家想看可以到安全牛課堂的視頻里看動手操作? ?CTF從入門到提升? ?課時2:41分27秒)

這包括函數(shù)的基本原理就是這些。接下來的話我們?nèi)タ匆粋€題目,這是來自于實驗題目。

以上動手演示可見:CTF從入門到提升

課程地址:https://www.aqniukt.com/my/course/8954????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容