PHP常見漏洞(1) SQL注入

2021-09-21 04:20:32 字數 4149 閱讀 9298

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

sql注入攻擊的一般步驟:

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

2、攻擊者構造注入語句,注入語句和程式中的sql語句結合生成新的sql語句 3、新的sql語句被提交到資料庫中執行 處理 

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

例項

資料庫 

create table `postmessage` ( 

`id` int(11) not null auto_increment, 

`subject` varchar(60) not null default 」, 

`name` varchar(40) not null default 」, 

`email` varchar(25) not null default 」, 

`question` mediumtext not null, 

`postdate` datetime not null default 』0000-00-00 00:00:00′, 

primary key (`id`) 

grant all privileges on ch3.* to 『sectop』@localhost identified by 』123456′; 

可能存在注入點,我們來測試

and 1=1

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

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轉義特殊字元

if(get_magic_quotes_gpc()) 

else 

再次測試,漏洞已經修補!!! ok !

雖然國內很多php程式設計師仍在依靠addslashes防止sql注入,還是建議大家加強中文防止sql注入的檢查。addslashes的問題在 於黑客 可以用0xbf27來代替單引號,而addslashes只是將0xbf27修改為0xbf5c27,成為乙個有效的多位元組字元,其中的0xbf5c仍會 被看作是單引號,所以addslashes無法成功攔截。

當然addslashes也不是毫無用處,它是用於單位元組字串的處理,多位元組字元還是用mysql_real_escape_string吧。

開啟magic_quotes_gpc來防止sql注入

php.ini中有乙個設定:magic_quotes_gpc = off

這個預設是關閉的,如果它開啟後將自動把使用者提交對sql的查詢進行轉換,

比如把 ' 轉為 '等,對於防止sql注入有重大作用。

如果magic_quotes_gpc=off,則使用addslashes()函式

另外對於php手冊中get_magic_quotes_gpc的舉例

**如下:

if (!get_magic_quotes_gpc())  else 

最好對magic_quotes_gpc已經開放的情況下,還是對$_post[』lastname』]進行檢查一下。

再說下mysql_real_escape_string和mysql_escape_string這2個函式的區別:

mysql_real_escape_string 必須在(php 4 >= 4.3.0, php 5)的情況下才能使用。否則只能用 mysql_escape_string ,兩者的區別是:mysql_real_escape_string 考慮到連線的當前字符集,而mysql_escape_string 不考慮。

(1)mysql_real_escape_string -- 轉義 sql 語句中使用的字串中的特殊字元,並考慮到連線的當前字符集

使用方法如下:

$sql = "select count(*) as ctr from users where 

username02.='".mysql_real_escape_string($username)."' and 03.password='". 

mysql_real_escape_string($pw)."' limit 1";

自定義函式

function inject_check($sql_str)  

function verify_id($id=null)  elseif(inject_check($id))  elseif(!is_numeric($id))  

$id = intval($id); 

return $id; 

} function str_check( $str )  

$str = str_replace("_", "_", $str); 

$str = str_replace("%", "%", $str); 

return $str; 

}  function post_check($post)  

$post = str_replace("_", "_", $post); 

$post = str_replace("%", "%", $post); 

$post = nl2br($post); 

$post = htmlspecialchars($post); 

return $post; 

}對於這些修改****的情況,還可使使用一些防注入的工具,像安全狗實驗室出的安全狗對於防注入就非常的強大,可以攔住不少的入侵者的腳步。同樣還有一些的防注入工具也很強大,大家可以去試試!

end!!!

資料分片(1 sql)

邏輯表 真實表資料節點 繫結表廣播表 邏輯表水平拆分的資料庫 表 的相同邏輯和資料結構表的總稱。例 訂單資料根據主鍵尾數拆分為 10 張表,分別是 t order 0 到 t order 9,他們的邏輯表名為 t order。真實表在分片的資料庫中真實存在的物理表。即上個示例中的 t order 0...

SQL注入漏洞 OWASP TOP 1

所謂sql注入,就是通過把sql命令插入到web表單中 此處涉及到sql注入的點 提交最終達到欺騙伺服器執行惡意的sql命令。具體來說,它是利用現有的web應用程式,將 惡意的 sql命令注入到後台資料庫引擎,它可以通過在web表單中輸入 惡意 sql語句得到乙個存在安全漏洞的 上的資料庫,而不是按...

SQL注入漏洞

sql注入漏洞曾經是web應用程式的噩夢,cms bbs blog無一不曾受其害。sql注入的原理 以往在web應用程式訪問資料庫時一般是採取拼接字串的形式,比如登入的時候就是根據使用者名稱和密碼去查詢 string sql select top 1 from user where username...