原理
可以將web程式想象成乙個圖書館管理員,它機械的聽從使用者告訴它的資訊,在書庫(sql程式)中查詢(select)資訊
當你告訴它」三國演義」時,它會查詢並告訴你書庫中《三國演義》的資訊
這裡的組合方式就是 書庫中《[使用者輸入]》的資訊
但是如果你告訴它」三國演義》或《所有書籍」,它機械地聽從指令會查詢並告訴你
書庫中《三國演義》或《所有書籍》的資訊
究其原理,便是使用者輸入的」資料」被惡意構造成」操作」
上例的書名號就是用來區分書名(名詞)和句子其他成分的,在程式中則是使用雙引號來區分字串和語句其他功能指令的
利用這裡拿乙個wargame作為例子:
username=natas14
password=lg96m10tdfapyvbkjdjymbllq5l6qdl1
可以自己先試試~會了的話就不用看了0v0節省下好久時間呢!
開啟以後發現是username和password的輸入框,提供了伺服器端的php源**
<?
if(array_key_exists("username", $_request))
if(mysql_num_rows(mysql_query($query, $link)) > 0) else
mysql_close($link); //關閉mysql連線
?>
連線結構為:
瀏覽器<————->php<————->mysql
|客戶端| |---伺服器---|
清楚了sql語句的組成,我們就可以嘗試發現php的漏洞了
很明顯,雙引號用來包裹兩個變數,使其作為字串型別的變數送入mysql
而知道了這一點,惡意令輸入中帶有雙引號就會使得$query被送入mysql以後產生歧義:
試試令password= b」 and true,會構造出怎樣的sql語句呢?
select * from users where username = "aaa" and password="b" and true "
很明顯,這是一句錯誤的sql語句,因為雙引號是單數個,就意味著肯定有字串未閉合
說到這裡,就要解釋一下where子句的作用了:
select語句在mysql資料庫是查詢檢索的作用,where子句則是過濾條件
可以理解為
遍歷所有資料項
if(資料項滿足條件)then
echo 資料項;
我們不知道username和password,所以沒法讓username=*** and password=***成立
但是如果滿足的條件恆真,那麼mysql就會顯示所有資料了
即令sql語句為
select * from users where true;
由於and和or優先順序相同,因此它們依次從左向右運算
現有的語句為
select * from users where false and false
是我們可以注入的地方
那麼很明顯,or這個只要一側為真,就令整個表示式為真的操作符就派上用場了
構造select * from users where false and false or true
就可以使運算後where恆真了
觀察到$query後恒有乙個雙引號,因此不能簡單地輸入true,而是要構造能夠合理包含尾雙引號的語句,例如令password=b」 or 「1」 = 「1
生成的sql語句就是:
select * from users where username=」a」 and password=」b」 or 「1」=」1」
很明顯,where子句恆真,將會返回資料庫內所有資訊
防禦從sql注入被發現到現在已有十幾年的歷史,在這個過程中黑客和開發者進行了大量的博弈
從最簡單粗暴的檢測使用者輸入中是否存在引號等非法字元,到從sql解決問題的引數化查詢
黑客同時也引入了構造繞過過濾的寬位元組注入法等等
雖然引數化查詢其實可以根本性地解決sql注入的問題,不過由於開發者的水平問題,漏洞仍然層出不窮~
希望大家以後開發網頁的時候要注意哦0 -
SQL注入之Oracle注入及原理
oracle資料庫系統是美國oracle公司 甲骨文 提供的以分布式資料庫為核心的一組軟體產品,是目前最流行的客戶 伺服器 client server 或b s體系結構的資料庫之一,比如silverstream就是基於資料庫的一種中介軟體。oracle資料庫是目前世界上使用最為廣泛的資料庫管理系統,...
SQL注入實驗
1.執行apache server 映象已經安裝,只需執行命令 sudo service apache2 start 2.phpbb2 web應用 映象已經安裝,通過訪問,應用程式源 位於 var www sql sqllabmysqlphpbb 3.配置dns 上述的url僅僅在映象內部可以訪問,...
sql注入原理及基本認識
sql注入簡介 所謂sql注入,就是通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。具體來說,它是利用現有應用程式,將 惡意的 sql命令注入到後台資料庫引擎執行的能力,它可以通過在web表單中輸入 惡意 sql語句得到乙個存在安全漏洞...