sql學(xué)習(xí)筆記

二次排序注入思路:

  1. 黑客通過構(gòu)造數(shù)據(jù)的形式,在瀏覽器或者其他軟件中提交HTTP數(shù)據(jù)報文請求到服務(wù)端進(jìn)行處理,提交的數(shù)據(jù)報文請求中可能包含了黑客構(gòu)造的SQL語句或者命令。

  2. 服務(wù)端應(yīng)用程序會將黑客提交的數(shù)據(jù)信息進(jìn)行存儲,通常是保存在數(shù)據(jù)庫中,保存的數(shù)據(jù)信息的主要作用是為應(yīng)用程序執(zhí)行其他功能提供原始輸入數(shù)據(jù)并對客戶端請求做出響應(yīng)。

  3. 黑客向服務(wù)端發(fā)送第二個與第一次不相同的請求數(shù)據(jù)信息。

  4. 服務(wù)端接收到黑客提交的第二個請求信息后,為了處理該請求,服務(wù)端會查詢數(shù)據(jù)庫中已經(jīng)存儲的數(shù)據(jù)信息并處理,從而導(dǎo)致黑客在第一次請求中構(gòu)造的SQL語句或者命令在服務(wù)端環(huán)境中執(zhí)行。

  5. 服務(wù)端返回執(zhí)行的處理結(jié)果數(shù)據(jù)信息,黑客可以通過返回的結(jié)果數(shù)據(jù)信息判斷二次注入漏洞利用是否成功。

sql注入繞開過濾(lesson25)

一般有以下思路

1. 大小寫變形 :

如:Or,OR,oR

2. 改變編碼:

如:通過hex,urlencode、url等編碼
Eg:果or被過濾時,我們可以采用url編碼(其相當(dāng)于把a(bǔ)scii編碼的0x給替換成%,比如o的ascii為0x6f,url編碼就是%6f),這個時候我們可以試試%6fr,即把o換成url編碼,也可以全換,也可以大小寫的換,如果沒被過濾就成功了,(如果%被過濾了的話…)

注:這個可以積極的去使用,比如測試時and被注釋,使用&&替換也失敗,這個時候不妨試試%26%26(&的url編碼)

3. 添加注釋:

如:/or/(不止應(yīng)對字母被注釋)
Eg:某個過濾器能夠過濾的字符如下——“select ”、”from ”、”limit ”等,注意這些字符最后面都有一個空格,這個時候我們就能通過內(nèi)聯(lián)注釋來繞過這個過濾器,如:

SELECT/**/username,password/**/FROM/**/users
注:這個注釋甚至可以穿插在關(guān)鍵字當(dāng)中,例如被過濾了or,我們可以把order by改成o/**/rder by,參考的資料上是這么說(滑稽

4. 利用符號

如:and=&& or=||
Eg:

‘ || updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

5.往字符里面插入被過濾的字符

如or被過濾了,我們可以往里面加or,即注入:oorr,這個時候里面的or就被刪去了,剩下的組成新字符,也就是or,是個很好用的繞過方法,像這種類似的還有很多

數(shù)字被注釋(1、2等)

6.使用浮點數(shù):

如:1.0、2.0

符號被注釋(>、<等)

7.利用函數(shù)來替代

如盲注時經(jīng)常用到比較,這時候要是比較符號被注釋了不能用平常的方法了,所以需要用某些函數(shù)如greatest()【greatest(n1,n2,n3,...)函數(shù)返回輸入?yún)?shù)(n1,n2,n3,...)的最大值】、least()等,比如語句:select * from users where id=1 and ascii(substr(database(),0,1))>64就可以替換成select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64

注:當(dāng)or被注釋時,像order by這種含有相關(guān)字符的語句也同樣無法使用,這個時候如果改變大小寫也無用時,可以使用上述的內(nèi)聯(lián)注釋/**/,或者用別的編碼形式,如果不行的話,那就只能放棄使用order by,可以嘗試使用group by語句等

寬字節(jié)注入

原理:

1、我們都知道,在防御SQL注入的時候,大多說都是使用的過濾特殊字符,或者使用函數(shù)將特殊字符轉(zhuǎn)化為實體,就是說在字符轉(zhuǎn)義,添加‘\’。這里第一條就是有這個機(jī)制。
2、設(shè)置寬字節(jié)字符集,這里為GBK字符集,GBK字符集占用兩個字節(jié)。關(guān)鍵就在于這個設(shè)置字符集。通常有很多方法可以設(shè)置,例如:

  • mysql_query,如mysql_query("SET NAMES 'gbk'", conn)、mysql_query("setcharacter_set_client = gbk",conn)。

  • mysql_set_charset,如mysql_set_charset("gbk",$conn)。
    實現(xiàn)過程:當(dāng)我們測試的時候,輸入“%df‘”,這個時候如果php函數(shù)是使用的addslashes()的時候,會在冒號的前面加上’\’。也就變成了%df\’ 。對應(yīng)的編碼是%df%5c’.這時候網(wǎng)站字符集是GBK,MYSQL使用的編碼也是GBK的話,就會認(rèn)為%df\是一個漢“運’”,這樣的話,單引號前面的\就不起作用了,從而轉(zhuǎn)義失敗,導(dǎo)致報錯

涉及到的一些概念

字符、字符集與字符序

字符(character)是組成字符集(character set)的基本單位。對字符賦予一個數(shù)值(encoding)來確定這個字符在該字符集中的位置。
字符序(collation)指同一字符集內(nèi)字符間的比較規(guī)則。

UTF8

由于ASCII表示的字符只有128個,因此網(wǎng)絡(luò)世界的規(guī)范是使用UNICODE編碼,但是用ASCII表示的字符使用UNICODE并不高效。因此出現(xiàn)了中間格式字符集,被稱為通用轉(zhuǎn)換格式,及UTF(Universal Transformation Format)。

寬字節(jié)

GB2312、GBK、GB18030、BIG5、Shift_JIS等這些都是常說的寬字節(jié),實際上只有兩字節(jié)。寬字節(jié)帶來的安全問題主要是吃ASCII字符(一字節(jié))的現(xiàn)象。

MYSQL的字符集轉(zhuǎn)換過程

  1. MySQL Server收到請求時將請求數(shù)據(jù)從character_set_client轉(zhuǎn)換為character_set_connection;
  2. 進(jìn)行內(nèi)部操作前將請求數(shù)據(jù)從character_set_connection轉(zhuǎn)換為內(nèi)部操作字符集,其確定方法如下:
  • 使用每個數(shù)據(jù)字段的CHARACTER SET設(shè)定值;
  • 若上述值不存在,則使用對應(yīng)數(shù)據(jù)表的DEFAULT CHARACTER SET設(shè)定值(MySQL擴(kuò)展,非SQL標(biāo)準(zhǔn));
  • 若上述值不存在,則使用對應(yīng)數(shù)據(jù)庫的DEFAULT CHARACTER SET設(shè)定值;
  • 若上述值不存在,則使用character_set_server設(shè)定值。
    將操作結(jié)果從內(nèi)部操作字符集轉(zhuǎn)換為character_set_results。
注:寬字節(jié)注入發(fā)生的位置就是PHP發(fā)送請求到MYSQL時字符集使用character_set_client設(shè)置值進(jìn)行了一次編碼。

附:

寬字節(jié)注入詳解:
https://www.cnblogs.com/lcamry/articles/5625276.html
https://blog.csdn.net/helloc0de/article/details/76180190

Stacked injection--堆疊注入--堆查詢注入

  • Stacked injections:堆疊注入。從名詞的含義就可以看到應(yīng)該是一堆sql語句(多條)一起執(zhí)行。而在真實的運用中也是這樣的,我們知道在mysql中,主要是命令行中,每一條語句結(jié)尾加 ; 表示語句結(jié)束。這樣我們就想到了是不是可以多句一起使用。這個叫做stacked injection。

原理:

在SQL中,分號(;)是用來表示一條sql語句的結(jié)束。試想一下我們在 ; 結(jié)束一個sql語句后繼續(xù)構(gòu)造下一條語句,會不會一起執(zhí)行?因此這個想法也就造就了堆疊注入。而union injection(聯(lián)合注入)也是將兩條語句合并在一起,兩者之間有什么區(qū)別么?區(qū)別就在于union 或者union all執(zhí)行的語句類型是有限的,可以用來執(zhí)行查詢語句,而堆疊注入可以執(zhí)行的是任意的語句。例如以下這個例子。用戶輸入:1; DELETE FROM products服務(wù)器端生成的sql語句為:(因未對輸入的參數(shù)進(jìn)行過濾)Select * from products where productid=1;DELETE FROM products當(dāng)執(zhí)行查詢后,第一條顯示查詢信息,第二條則將整個表進(jìn)行刪除。
Eg:

當(dāng)執(zhí)行查詢后,第一條顯示查詢信息,第二條則將整個表進(jìn)行刪除。

局限性

堆疊注入的局限性在于并不是每一個環(huán)境下都可以執(zhí)行,可能受到API或者數(shù)據(jù)庫引擎不支持的限制,當(dāng)然了權(quán)限不足也可以解釋為什么攻擊者無法修改數(shù)據(jù)或者調(diào)用一些程序。

附:

關(guān)于堆疊注入的更多內(nèi)容:
https://www.bbsmax.com/A/kvJ3Eq9Xdg/
http://www.sqlinjection.net/stacked-queries/

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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