**:
b) 使用者自己構造sql語句(如:' or 1=1#,後面會講解)
c) 將sql語句傳送給資料庫管理系統(dbms)
d) dbms接收請求,並將該請求解釋成機器**指令,執行必要的訪問操作
e) dbms接受返回的結果,並處理,返回給使用者
因為使用者構造了特殊的sql語句,必定返回特殊的結果(只要你的sql語句夠靈活的話)。
下面,我通過乙個例項具體來演示下sql注入
二、sql注入例項詳解(以上測試均假設伺服器未開啟magic_quote_gpc)
1) 前期準備工作
先來演示通過sql注入漏洞,登入後台管理員介面
首先,建立一張試驗用的資料表:
複製**
**如下:
createtable `users` (
`id`int(11) not null auto_increment,
`username`varchar(64) not null,
`password`varchar(64) not null,
`email`varchar(64) not null,
primarykey (`id`),
uniquekey `username` (`username`)
)engine=myisam auto_increment=3 default charset=latin1;
新增一條記錄用於測試:
複製**
**如下:
insertinto users (username,password,email)
values('marcofly',md5('test'),'[email protected]');
接下來,貼上登入介面的源**:
複製**
**如下:
當使用者點選提交按鈕的時候,將會把表單資料提交給validate.php頁面,validate.php頁面用來判斷使用者輸入的使用者名稱和密碼有沒有都符合要求(這一步至關重要,也往往是sql漏洞所在)
**如下:
複製**
**如下:
<?php
$conn=@mysql_connect("localhost",'root','')or die("資料庫連線失敗!");;
mysql_select_db("injection",$conn) or die("您要選擇的資料庫不存在");
$name=$_post['username'];
$pwd=$_post['password'];
$sql="select * from users where username='$name' andpassword='$pwd'";
$query=mysql_query($sql);
$arr=mysql_fetch_array($query);
if(is_array($arr))else{
echo "您的使用者名稱或密碼輸入有誤,請重新登入!";
?>
注意到了沒有,我們直接將使用者提交過來的資料(使用者名稱和密碼)直接拿去執行,並沒有實現進行特殊字元過濾,待會你們將明白,這是致命的。
**分析:如果,使用者名稱和密碼都匹配成功的話,將跳轉到管理員操作介面(manager.php),不成功,則給出友好提示資訊。
到這裡,前期工作已經做好了,接下來將展開我們的重頭戲:sql注入
2) 構造sql語句
填好正確的使用者名稱(marcofly)和密碼(test)後,點選提交,將會返回給我們「歡迎管理員」的介面。
因為根據我們提交的使用者名稱和密碼被合成到sql查詢語句當中之後是這樣的:
複製**
**如下:
select * from users where username='marcofly' andpassword=md5('test')
很明顯,使用者名稱和密碼都和我們之前給出的一樣,肯定能夠成功登陸。但是,如果我們輸入乙個錯誤的使用者名稱或密碼呢?很明顯,肯定登入不了吧。恩,正常情況下是如此,但是對於有sql注入漏洞的**來說,只要構造個特殊的「字串」,照樣能夠成功登入。
比如:在使用者名稱輸入框中輸入:' or 1=1#,密碼隨便輸入,這時候的合成後的sql查詢語句為:
複製**
**如下:
select * from users where username='' or 1=1#' and password=md5('')
語義分析:「#」在mysql中是注釋符,這樣井號後面的內容將被mysql視為注釋內容,這樣就不會去執行了,換句話說,以下的兩句sql語句等價:
複製**
**如下:
select * from users where username='' or 1=1#' and password=md5('')
等價於複製**
**如下:
select *from users where username='' or 1=1
因為1=1永遠是都是成立的,即where子句總是為真,將該sql進一步簡化之後,等價於如下select語句:
複製**
**如下:
select * from users
沒錯,該sql語句的作用是檢索users表中的所有字段
小技巧:如果不知道' or 1=1#中的單引號的作用,可以自己echo 下sql語句,就一目了然了。
看到了吧,乙個經構造後的sql語句竟有如此可怕的破壞力,相信你看到這後,開始對sql注入有了乙個理性的認識了吧~
沒錯,sql注入就是這麼容易。但是,要根據實際情況構造靈活的sql語句卻不是那麼容易的。有了基礎之後,自己再去慢慢摸索吧。
有沒有想過,如果經由後台登入視窗提交的資料都被管理員過濾掉特殊字元之後呢?這樣的話,我們的萬能使用者名稱' or 1=1#就無法使用了。但這並不是說我們就毫無對策,要知道使用者和資料庫打交道的途徑不止這一條。
mysql注入技巧原理 Mysql注入小技巧
一 字串擷取函式 平時我們進行盲注時用substr 函式擷取字串,當substr 被過濾時,怎麼辦呢?我們可以用這些函式可以達到同樣的效果1.left str,length 從左邊第length位開始擷取字串 用法 left str,length 即 left 被擷取字串,擷取長度 結果為 www....
Mysql報錯注入簡單測試模型
測試mysql環境 mysql 5.7.12 log mysql community server gpl 1 收集內建函式 2 整理列表 select functionname version select functionname 1,version select functionname ve...
理論小知識 MySQL 及 SQL 注入
如果您通過網頁獲取使用者輸入的資料並將其插入乙個mysql資料庫,那麼就有可能發生sql注入安全的問題。本章節將為大家介紹如何防止sql注入,並通過指令碼來過濾sql中注入的字元。所謂sql注入,就是通過把sql命令插入到web表單遞交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的...