
雖說目前網際網路上已經有很多關于sql注入的神器了,但是在這個WAF橫行的時代,手工注入往往在一些真實環境中會引起尤為重要。此處主要把以前學過的知識做個總結,不會有詳細的知識解讀,替代查詢手冊的形式,更多以後的複習與查閱,文中内容可能會存在錯誤,望師傅們斧正!
0x01 Mysql手工注入
1.1聯合注入
1.2報錯注入
每個一個報錯語句都有它的原理:
exp()報錯的原理:exp是一個數學函數,取e的x次方,當我們輸入的值大于709将報錯,然後 取反它的值總會大于709,是以報錯。
updatexml()報錯的原理:由于updatexml的第二個參數需要Xpath格式的字元串,以 開頭的内容不是xml格式的文法,concat()函數為串聯連接配接函數而不符合規則,但嵌套内的執行結果以錯誤的形式報出,這樣就可以實作報錯注入了。
這裡需要注意的是它加了連接配接字元,導緻資料中的md5隻能爆出31位,這裡可以用分割函數分割出來:
1.3盲注1.3.1時間盲注
時間盲注也叫延遲注入一般用到函數sleep()BENCHMARK()還可以使用笛卡爾積(盡量不要使用,内容太多會很慢很慢)
一般時間盲注我們還需要使用條件判斷函數
我們一般喜歡把分割的函數編碼一下,當然不編碼也行,編碼的好處就是可以不用引号,常用到的就有ascii()hex()等等
1.3.2布爾盲注
1.4插入,删除,更新
插入,删除,更新主要是用到盲注和報錯注入,這種注入點不建議使用sqlmap等工具,會産生大量垃圾資料,一般這種注入會出現在編碼,ip頭,留言闆等等需要寫入資料的地方,同時這種注入不報錯一般較難發現,我們可以嘗試性插入,引号,雙引号,轉義符\讓語句不能正常執行,然後如果插入失敗,更新失敗,然後深入測試确定是否存在注入
1.4.1報錯
1.4.2盲注
1.5二次注入與寬位元組注入
二次注入的語句:在沒有被單引号包裹的sql語句下,我們可以用16進制編碼他,這樣就不會帶有單引号等。
二次注入在沒有二進制的情況比較難發現,通常見于注冊,登入惡意賬戶後,資料庫可能會因為惡意賬戶名的問題,将admin'-+誤認為admin帳戶
寬位元組注入:針對目标已達到一定的防護,單引号轉換為 ,mysql轉換 編碼為 ,寬位元組中兩個位元組代表一個漢字,是以把 加上 就變成了一個漢字“運”,使用這種方法成功繞過過轉義,就是所謂的寬位元組注入
0x02 Oracle手工注入
2.1聯合注入
2.2報錯注入
2.3盲注
2.3.1布爾盲注
既然是盲注,那麼肯定涉及到條件判斷語句,Oracle除了使用if else結束,如果這種複雜的,還可以使用encode()函數。
文法:decode(條件,值1,傳回值1,值2,傳回值2,...值n,傳回值n,更改值);
該函數的含義如下:
2.3.2時間盲注
可使用DBMS_PIPE.RECEIVE_MESSAGE('任意值',延遲時間)函數進行時間盲注,這個函數可以指定延遲的時間
0x03 SQL Server手工注入
3.1聯合注入
3.2報錯注入
3.3盲注
3.3.1布爾盲注
3.3.2時間盲注
END