SQL注入原理及联合查询
1、SQL注入原理:
用戶輸入的數(shù)據(jù)被當做SQL語句進行執(zhí)行
條件:①用戶能控制輸入的數(shù)據(jù)
????????②原本程序要執(zhí)行的代碼,拼接了用戶輸入的數(shù)據(jù)然后執(zhí)行
如何檢測SQL注入:
①:and 1=1? 頁面正確
and 1=2? 頁面錯誤? 可能存在SQL注入
②:字符運算法:+ - * /? (+號需要URL編碼之后再傳入,GET傳參會把+號當做空格來處理)
例如:id=2-1 跳到了id=1的頁面,那么就一定存在SQL注入(正常情況下網(wǎng)站是不會進行運算的)
檢測出存在SQL注入之后,下一步就是拿到數(shù)據(jù)庫的信息或者拿到數(shù)據(jù)庫權限
如何通過SQL注入獲取數(shù)據(jù)庫信息:
聯(lián)合查詢法:
A語句 union B語句
? ? ? ? 把兩條SQL語句一起去執(zhí)行(字段數(shù)要相同)
order by 排序
order by 1 以第一個字段進行排序? 可以用來查詢字段數(shù)
假如一個表里面只存在兩個字段,那么order by 3 頁面就會報錯
union select 1,2,3? 查看回顯點
由于一般情況下,頁面只顯示第一條數(shù)據(jù),所以如果我們想要吧第二條數(shù)據(jù)顯示出來,我們就需要讓前面的語句報錯
由于數(shù)據(jù)庫會選擇輸出,而這個選擇輸出的輸出位,就是我們想要的回顯點
我們想要的信息,都要從這個回顯點來輸出出來
下面用靶場來演示一下
進入靶場,在URL欄處輸入and 1=1頁面正常 and 1=2 頁面顯示不正常
?
?
接下來判斷字段數(shù)
order by 1正常? order by 2 正常? order by 3正常 order by 4 頁面不正常,說明存在3個字段
?
?
union select 1,2 ,3查看回顯點,可以看到回顯點是2和3這個地方
?接下來就是查詢數(shù)據(jù)庫的庫名,需要用到database()這個函數(shù),將這個函數(shù)直接寫到回顯點的位置上面,可以看到數(shù)據(jù)庫名是security
?接下來就是查詢數(shù)據(jù)庫的表名
查詢表名有兩種方法,一種是猜,在URL欄處輸入union select 1,2 ,3 from user 如果頁面輸出的是正常,那么就是存在,如果頁面顯示錯誤,那么就是沒有這個表,如下圖user不存在,users存在
另一種是利用系統(tǒng)自帶庫來查詢表名
mysql 5.0 以上的版本有一個系統(tǒng)自帶庫,information_schema,里面存儲著tables和columns
tables 里面是數(shù)據(jù)庫中庫和表的對應,上面我們已經(jīng)知道了庫名security,我們也猜出來了一個表名users,我們可以在tables里面看到,這個庫和表的對應
圖中我們可以看到表名對應的是table_name,庫名對應的是table_schema
庫.表.字段的結構? a.b.c就表示選中a庫里面的b表里的c字段
那么我們想要知道其他的表名,就可以利用數(shù)據(jù)庫的查詢語句結合這個information_schema來獲取其他的表名,構造語句:select table_name from information_schema.tables where table_schema=database()
現(xiàn)在將這個我們構造好的語句拼接到我們之前得到的回顯點上面,and 1=2 union select 1,2,?table_name from information_schema.tables where table_schema=database(),我們就可以看到表名了
?由于頁面只顯示第一行的數(shù)據(jù),想要看到其他的表名,我們就需要用到 limit 這個函數(shù)
limit 0,1 表示輸入第一行的數(shù)據(jù),輸出一行 0表示從第一行開始輸出? 1表示第一行
limit 從第幾行開始輸出(默認0),輸出幾行數(shù)據(jù)
現(xiàn)在我們想要看到其他的數(shù)據(jù),我們只需要在原來的語句中將limit拼接上就好了,and 1=2 union select 1,2,?table_name from information_schema.tables where table_schema=database() limit 0,1,我們只需要改變0這個數(shù)字,就可以得到我們想要的表名
接下來就是查詢字段名了,上面講到了有一個系統(tǒng)自帶的columns,這個就是數(shù)據(jù)庫中的庫和表和字段的對應,上面我們已經(jīng)知道了庫名security,我們拿到了一個表名emails,我們可以在colunms里面看到,這個庫和表和字段的對應
?圖中我們可以看到字段名對應的是column_name
我們就可以根據(jù)上面構造查詢表名的經(jīng)驗來構造查詢字段名的語句,select column_name from information_schema.colunms where table_schema=database() and table_name='emails'
這個語句的意思就是查詢這個字段從information_schema這個庫里面的columns去拿,where后面的就是條件,滿足查詢的這個字段保證在這個庫里面(table_schema=database()這個就是security這個庫),并且在emails這個表里面
?接下來就是利用limit來獲取其他的字段名
知道了庫名、表名、字段名,接下來就是拿數(shù)據(jù)了,利用數(shù)據(jù)庫查詢語句,就可以直接拿到數(shù)據(jù)
select 1,2,字段名?from 表名(select 1,2,id from emails)?,可以看到里面的數(shù)據(jù)就是1
?真實滲透中或者挖SRC,各位師傅只需要得到庫名就好了,完全沒必要往下走,一不小心就吃國家飯了,千萬不要拿數(shù)據(jù)。一定要遵守網(wǎng)絡安全法!!!
總結
以上是生活随笔為你收集整理的SQL注入原理及联合查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯刷题以及算法解析的网址
- 下一篇: 兽医外科设备的全球与中国市场2022-2