2011年4月1日

[PHP] SQL injection 資料隱碼攻擊

資料隱碼:

$value = $_get['f_value'];
$sql = "select * from a where f='$value'";
echo $sql;

大部份的programmer會把user輸入的參數照單全收的放進$value
hacker利用這特點,不會依照一般user輸入值
他可以將f_value的內容輸入為
' or '1' = '1
按照以上他給的值帶進最上面的語法中你會發現
$sql = "select * from a where f='' or '1' = '1'";
於是,整個a的資料都洩露光光了
這種資料隱碼的攻擊運用還有很多
在MSSQL裡,若是DB權限沒有管制而開至dbowner
它可以埋code下 'exec master ..xp_cmdshell 'net user test testpass/ADD'--
如此一來他現在有一個test的使用者和testpass的密碼..........................

解決的辦法:
php.ini裡有一個magic_quotes_gpc,若是值訂為OFF,則PHP就不會在敏感的字元前加上反斜線(\)
因為user輸入的值可能帶有敏感字元如單引號,如此就會導致SQL injection漏洞
在此可以用addslashes()函數來解決,它會自動在敏感字元前加反斜線
但是昨為一個開發者,不會知道環境變數是off還是on
get_magic_quotes_gpc()可以了解此狀況,因此產生以下function


function quotes($content){
if(!get_magic_quotes_gpc()){
if(is_array($content)){ //檢查是否為陣列,若是的話用foreach全部解決
foreach($content as $key => $value){
$content[$key] = addslashes($value);
}
}else{
addslashes($content);
}
}else{
//magic_quotes_gpc=on,不處理
}
return $content;
}


回到我們一開始的code,就可以寫成

$value = quotes($_get['f_value']);
$sql = "select * from a where f='$value'";
echo $sql;


沒有留言:

張貼留言