SQL注入攻擊的總體思路
·發現SQL注入位置;
·判斷後台資料庫類型;
·確定XP_CMDSHELL可執行情況
·發現WEB虛擬目錄
·上傳ASP,php,jsp木馬;
·得到管理員權限;
<?PHP
//PHP整站防注入程式,需要在公用檔案中require_once本檔案
//判斷magic_quotes_gpc狀態
代碼如下 |
複製代碼 |
if (@get_magic_quotes_gpc ()) { $_GET = sec ( $_GET ); $_POST = sec ( $_POST ); $_COOKIE = sec ( $_COOKIE ); $_FILES = sec ( $_FILES ); } $_SERVER = sec ( $_SERVER ); function sec(&$array) { //如果是數組,遍曆數組,遞迴調用 if (is_array ( $array )) { foreach ( $array as $k => $v ) { $array [$k] = sec ( $v ); } } else if (is_string ( $array )) { //使用addslashes函數來處理 $array = addslashes ( $array ); } else if (is_numeric ( $array )) { $array = intval ( $array ); } return $array; } |
1、整型參數的判斷
當輸入的參數YY為整型時,通常abc.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位=YY,所以可以用以下步驟測試SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from 表名 where 欄位=YY’,abc.asp運行異常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
綜合上面我們寫一個整型過濾函數
代碼如下 |
複製代碼 |
function num_check($id) { if (! $id) { die ( '參數不可為空!' ); } //是否為空白的判斷 else if (inject_check ( $id )) { die ( '非法參數' ); } //注入判斷 else if (! is_numetic ( $id )) { die ( '非法參數' ); } //數字判斷 $id = intval ( $id ); //整型化 return $id; } //字元過濾函數 function str_check($str) { if (inject_check ( $str )) { die ( '非法參數' ); } //注入判斷 $str = htmlspecialchars ( $str ); //轉換html return $str; } function search_check($str) { $str = str_replace ( "_", "_", $str ); //把"_"過濾掉 $str = str_replace ( "%", "%", $str ); //把"%"過濾掉 $str = htmlspecialchars ( $str ); //轉換html return $str; } //表單過濾函數 function post_check($str, $min, $max) { if (isset ( $min ) && strlen ( $str ) < $min) { die ( '最少$min位元組' ); } else if (isset ( $max ) && strlen ( $str ) > $max) { die ( '最多$max位元組' ); } return stripslashes_array ( $str ); }
|
當輸入的參數YY為字串時,通常abc.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位='YY',所以可以用以下步驟測試SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from 表名 where 欄位=YY’,abc.asp運行異常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='1', abc.asp運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='2', abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
代碼如下 |
複製代碼 |
//防注入函數 function inject_check($sql_str) { return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str ); // www.111cn.net 進行過濾,防注入 } function stripslashes_array(&$array) { if (is_array ( $array )) { foreach ( $array as $k => $v ) { $array [$k] = stripslashes_array ( $v ); } } else if (is_string ( $array )) { $array = stripslashes ( $array ); } return $array; } |
?>
好了文章介紹到的防注入也算是比較全面的,大家可以測試或更出更好的方法.