PHP漏洞全解(五)-SQL注入攻擊

來源:互聯網
上載者:User

標籤:

SQL注入攻擊(SQL Injection),是攻擊者在表單中提交精心構造的sql語句,改動原來的sql語句,如果web程式沒有對提交的資料經過檢查,那麼就會造成sql注入攻擊。

SQL注入攻擊的一般步驟:

1、攻擊者訪問有SQL注入漏洞的網站,尋找注入點

2、攻擊者構造注入語句,注入語句和程式中的SQL語句結合產生新的sql語句

3、新的sql語句被提交到資料庫中執行 處理

4、資料庫執行了新的SQL語句,引發SQL注入攻擊

執行個體

資料庫

 

  1. CREATE TABLE `postmessage` (  

  2. `id` int(11) NOT NULL auto_increment,  

  3. `subject` varchar(60) NOT NULL default ”,  

  4. `name` varchar(40) NOT NULL default ”,  

  5. `email` varchar(25) NOT NULL default ”,  

  6. `question` mediumtext NOT NULL,  

  7. `postdate` datetime NOT NULL default ’0000-00-00 00:00:00′,  

  8. PRIMARY KEY (`id`)  

  9. ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT=’運用者的留言’ AUTO_INCREMENT=69 ;  

  10. grant all privileges on ch3.* to ‘sectop’@localhost identified by ’123456′;  

  11. //add.php 插入留言  

  12. //list.php 留言列表  

  13. //show.php 顯示留言  

 

頁面 http://www.netsos.com.cn/show.php?id=71 可能存在注入點,我們來測試

 

http://www.netsos.com.cn/show.php?id=71 and 1=1

 

返回頁面

一次查詢到記錄,一次沒有,我們來看看源碼

//show.php 12-15行

// 執行mysql查詢語句

$query = "select * from postmessage where id = ".$_GET["id"];

$result = mysql_query($query)

or die("執行ySQL查詢語句失敗:" . mysql_error());

參數id傳遞進來後,和前面的字串結合的sql語句放入資料庫執行 查詢

提交 and 1=1,語句變成select * from postmessage where id = 71 and 1=1 這語句前值後值都為真,and以後也為真,返回查詢到的資料

提交 and 1=2,語句變成select * from postmessage where id = 71 and 1=2 這語句前值為真,後值為假,and以後為假,查詢不到任何資料

正常的SQL查詢,經過我們構造的語句之後,形成了SQL注入攻擊。通過這個注入點,我們還可以進一步拿到許可權,比如說運用 union讀取管理密碼,讀取資料庫資訊,或者用mysql的load_file,into outfile等函數進一步滲透。

防範方法

整型參數:

運用 intval函數將資料轉換成整數

函數原型

int intval(mixed var, int base)

var是要轉換成整形的變數

base,可選,是基礎數,預設是10

浮點型參數:

運用 floatval或doubleval函數分別轉換單精確度和雙精確度浮點型參數

函數原型

int floatval(mixed var)

var是要轉換的變數

   int doubleval(mixed var)

var是要轉換的變數

字元型參數:

運用 addslashes函數來將單引號“’”轉換成“\’”,雙引號“"”轉換成“\"”,反斜線“\”轉換成“\\”,NULL字元加上反斜線“\”

函數原型

string addslashes (string str)

str是要檢查的字串

那麼剛才出現的代碼漏洞,我們可以這樣修補

// 執行mysql查詢語句

$query = "select * from postmessage where id = ".intval($_GET["id"]);

$result = mysql_query($query)

or die("執行ySQL查詢語句失敗:" . mysql_error());

 

如果是字元型,先判斷magic_quotes_gpc能無法 為On,當不為On的時候運用 addslashes轉義特殊字元

 

  1. if(get_magic_quotes_gpc())  

  2. {  

  3.     $var = $_GET["var"];  

  4. }  

  5.  else  

  6.  {  

  7.     $var = addslashes($_GET["var"]);  

 

再次測試,漏洞已經修補

PHP漏洞全解(五)-SQL注入攻擊

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.