自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL中SQL的單字節(jié)注入與寬字節(jié)注入

安全 數(shù)據(jù)安全 數(shù)據(jù)庫運維 MySQL
本文將分別介紹MySQL中SQL的單字節(jié)注入與寬字節(jié)注入,這些問題是大家在日常工作中會碰到的問題。本文也將給出一些解決方法。

一、單字節(jié)SQL注入

MYSQL的SQL注入已經(jīng)由來已久,以下是普遍采用的注入步驟:

1、在GET參數(shù)上加一個/*或者#(mysql專有的注釋),判斷數(shù)據(jù)庫是否是mysql,比如:
http://www.xxx.com.cn/article.php?id=1607 and 1=1/*

2、猜解某表的字段數(shù),從order by 1一直更改到頁面出錯為止,就可以得到該表的字段數(shù)

注入URL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 order by 10#

對應(yīng)的SQL:

select * from articles where id=1607 or 1=1 order by 10#….

3、使用該表和用戶表進行關(guān)聯(lián)查詢,在文章列表里就可以看到用戶名和密碼了。當(dāng)也要猜解用戶表的表名和用戶名、密碼的字段名,比如上一步得到的字段數(shù)是5:

注入的URL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 union select  username,password,1,2,3 from user

對應(yīng)的SQL:

select * from articles where id=1607 or 1=1  union select  username,password,1,2,3 from user

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

解決方法:

過濾數(shù)據(jù):這并不是羅唆。在合適的地方使用良好的數(shù)據(jù)過濾,可以減小多數(shù)安全隱患,甚至可以消除其中的一部分。

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

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

二、寬字節(jié)注入

寬字節(jié)注入也是在最近的項目中發(fā)現(xiàn)的問題,大家都知道%df’ 被PHP轉(zhuǎn)義(開啟GPC、用addslashes函數(shù),或者icov等),單引號被加上反斜杠\,變成了 %df\’,其中\(zhòng)的十六進制是 %5C ,那么現(xiàn)在 %df\’ = %df%5c%27,如果程序的默認字符集是GBK等寬字節(jié)字符集,則MYSQL用GBK的編碼時,會認為 %df%5c 是一個寬字符,也就是縗’,也就是說:%df\’ = %df%5c%27=縗’,有了單引號就好注入了。比如:

$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=

對應(yīng)的SQL是:

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

解決方法:就是在初始化連接和字符集之后,使用SET character_set_client=binary來設(shè)定客戶端的字符集是二進制的。如:

mysql_query(”SET character_set_client=binary”);

【編輯推薦】

  1. MySQL中Order By實現(xiàn)原理分析
  2. 詳解MySQL分組查詢Group By實現(xiàn)原理
  3. MySQL數(shù)據(jù)庫接口的VC實現(xiàn)與應(yīng)用
責(zé)任編輯:彭凡 來源: junney
相關(guān)推薦

2014-04-08 16:02:28

寬字節(jié)注入數(shù)據(jù)安全MYSQL

2017-10-10 14:38:35

2010-04-13 14:35:17

2023-08-08 14:51:29

2010-12-20 16:04:30

2013-01-11 16:23:29

2010-09-14 16:00:16

2017-05-08 14:33:51

2018-02-10 09:44:19

2017-08-10 10:23:59

2017-05-05 11:31:34

2017-03-01 14:16:20

2024-04-30 14:50:13

2014-05-26 09:32:15

2020-10-26 07:04:29

SQL注入mysql

2013-05-02 15:09:22

2010-09-08 13:10:03

2010-06-30 17:56:06

2014-11-04 13:43:10

2010-10-22 15:18:18

SQL注入漏洞
點贊
收藏

51CTO技術(shù)棧公眾號