熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MySQL中SQL的單字節注入與寬字節注入

2013-11-23 21:06:58  來源: MySQL 

  單字節SQL注入

  MYSQL的SQL注入已經由來已久以下是普遍采用的注入步驟

  在GET參數上加一個/*或者#(mysql專有的注釋)判斷數據庫是否是mysql比如http://wwwxxxcomcn/articlephp?id= and =/*

  猜解某表的字段數從order by 一直更改到頁面出錯為止就可以得到該表的字段數

  注入URLhttp://wwwxxxcomcn/articlephp?id= or = order by #

  對應的SQL

select * from articles where id= or = order by #…


  使用該表和用戶表進行關聯查詢在文章列表裡就可以看到用戶名和密碼了當也要猜解用戶表的表名和用戶名密碼的字段名比如上一步得到的字段數是

  注入的URLhttp://wwwxxxcomcn/articlephp?id= or = union select  usernamepassword from user

  對應的SQL

select * from articles where id= or =  union select  usernamepassword from user

  這樣就可以在界面上看到用戶名和密碼了

  解決方法

  過濾數據這並不是羅唆在合適的地方使用良好的數據過濾可以減小多數安全隱患甚至可以消除其中的一部分

  將數據用括號包含如果你的數據庫允許(MySQL 允許)在 SQL 語句中不論什麼類型的數據都用單引號包含起來

  轉義數據一些合法的數據可能在無意中破壞 SQL 語句本身的格式使用 mysql_escape_string() 或者所使用數據庫提供的轉移函數如果沒有提供這樣的函數addslashes() 也是不錯的最後選擇

  寬字節注入

  寬字節注入也是在最近的項目中發現的問題大家都知道%df 被PHP轉義(開啟GPC用addslashes函數或者icov等)單引號被加上反斜槓\變成了 %df\其中\的十六進制是 %C 那麼現在 %df\ = %df%c%如果程序的默認字符集是GBK等寬字節字符集則MYSQL用GBK的編碼時會認為 %df%c 是一個寬字符也就是縗也就是說%df\ = %df%c%=縗有了單引號就好注入了比如

$conn = mysql_connect(”localhost”,”root”,”2sdfxedd”);
mysql_query(”SET NAMES ‘GBK’”);
mysql_select_db(”test”,$conn);
$user = mysql_escape_string($_GET['user']);
$pass = mysql_escape_string($_GET['pass']);
$sql = “select * from cms_user where username = ‘$user’ and password=’$pass’”;
$result = mysql_query($sql,$conn);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$rows[] = $row;
}
?>


  則通過以下注入即可:
http://www.xxx.com/login.php?user=%df’%20or%201=1%20limit%201,1%23&pass=

  對應的SQL是:

select * from cms_user where username = ‘運’ or 1=1 limit 1,1#’ and password=”

  解決方法:就是在初始化連接和字符集之後,使用SET character_set_client=binary來設定客戶端的字符集是二進制的。tw.winGWit.cOm如:

mysql_query(”SET character_set_client=binary”);
From:http://tw.wingwit.com/Article/program/MySQL/201311/29610.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.