injection注入攻擊
- 數字&字符型注入
- 聯合查詢注入
- 寬位元組注入
SQL注入的原理
前端的資料傳入到后臺處理時,沒有做嚴格的判斷,導致其傳入的“資料”拼接到SQL陳述句中后,被當作SQL陳述句的一部分執行,
注入的關鍵在于 構造閉合
本文章將以pikachu靶場作為演示實驗場景
數字&字符型注入
數字型、字符型注入的判斷
判斷數字型:在注入點輸入
1 and 1=1 ,1 and 1=2,
第一個回傳正常第二次回傳錯誤,則為數字型
判斷字符型:基本原理同上,但是需加入單引號做閉合
1’ and ‘1’=‘1,1’ and ‘1’='2
在pikachu靶場中做實際演示
數字型注入(POST)
在此場景,可以發現無輸入框,通過傳輸下拉串列的資料

看到查詢userid為1的時候,會傳回來名字kobe和他的email
抓包,發送到repeater

id在資料包中以明文傳輸,給了我們可乘之機
修改id資料為
1 or 1=1#
點擊發送,可以看到資料庫內的所有資料被爆了出來,

字符型注入(GET)
在這個場景中,資料是以GET方式傳輸,可以看到url中包含了我們所查詢的資訊allen

對這個name做點手腳,payload和數字型的原理相同
a’ or ‘1’='1
可以看到資料被爆了出來,
在字符型中要注意使用單引號閉合,
代碼原理
先看看這個數字型的

問題出在了sql陳述句這里,傳入的資料未做任何處理就拼接到了sql陳述句中,就成了下面這樣
select username,email from member where id=1 or 1=1
當sql陳述句執行where判斷條件時,由于1=1時恒為真的,所以不管前面id=幾這條sql陳述句都會被當成正確的陳述句被執行,導致了sql注入,

再看這個字符型的,和數字型的原理一模一樣,輸入的資料拼接到sql陳述句中后
select id,email from member where username=‘a’ or ‘1’=‘1’
此時就顯現除了單引號閉合的作用,
聯合查詢注入
使用union進行聯合查詢注入
使用union的前提是需要知道當前sql陳述句一共有多少列名,常用方法是order by判斷列數,原理是order by是根據某一列進行排序的,如果輸入的值大于所查詢的屬性個數就會報錯,
在字符型注入場景內嘗試這一方法,
例:在注入點輸入
// # 的作用是為了把后面的單引號注釋掉
a’ order by 5#
如頁面回傳報錯,則說明所查詢的屬性個數是少于5的,這時可利用“二分法查找”,如輸入order by 3或者2,查看頁面是否報錯,如若報錯,則再向下分,
反之,頁面如果回傳正確資訊,則向上翻倍,輸入order by 10,根據頁面回傳情況在在進行翻倍或平分,直至找出sql陳述句所查詢的屬性個數,


輸入5時報錯,2時回傳正常,這里pikachu最終的測驗結果是2,構造聯合查詢陳述句
a’ union select database(),user()#

可以看到database()和user()兩個資料庫函式發揮了作用,這里可以使用更多的方法,比如利用information_schema
a’ union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=‘pikachu’)#

這種利用方法,我以后的文章內會詳細解釋,
寬位元組注入
當GBC開啟或者遇到addslashes()函式時,單引號雙引號等敏感字符會被反斜杠 “\” 轉義
首先先了解一下GBK編碼,GBK采用雙位元組表示,兩個位元組為一個字符,
當在單引號前加入一個字符,如%df,在單引號轉義時%df’會變成%df%5c%27,由于GBK時雙位元組,所以%df%5c會被識別成一個漢字,這樣單引號就逃逸了出來,

感謝大家閱讀,如有不足,懇請指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389071.html
標籤:其他
上一篇:[ 滲透入門篇 ] 從滲透測驗執行標準著手的滲透學習大綱。掌握了這些知識點還擔心找不到作業?
下一篇:【淺記CTF(一)】復習周來襲
