MSSQL 网站项目被 注入 的主要表现为:在 数据库 字段中加入了script src=http://aaa.bbb.ccc/js.js /script 类似这样的一段代码。 数据库 典型的JS 注入 。 主要原因为3 1、攻击者获得SQLServer的读写权限,直接操作 数据库 进行 注入 解决方式 sql2000做法
MSSQL 网站项目被 注入 的主要表现为:在 数据库 字段中加入了 类似这样的一段代码。 数据库 典型的JS 注入 。
1、攻击者获得SQLServer的读写权限,直接操作 数据库 进行 注入
解决方式
sql2000做法:
1.不要使用sa用户连接 数据库
2、新建一个public权限 数据库 用户,并用这个用户访问 数据库
3、[角色]去掉角色public对sysobjects与syscolumns对象的select访问权限
4、[用户]用户名称-> 右键-属性-权限-在sysobjects与syscolumns上面打[×]
5、通过以下代码检测(失败表示权限正确,如能显示出来则表明权限太高):
DECLARE @T varchar(255),
@C varchar(255)
DECLARE Table_Cursor CURSOR FOR
Select a.name,b.name from sysobjects a,syscolumns b
where a.id=b.id and a.xtype= 'u ' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167)
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN print @c
FETCH NEXT FROM Table_Cursor INTO @T,@C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
sql2005做法:
1、在系统视图找到sysobjects a,syscolumns b ,属性,进入权限,找到SELECT后面拒绝打勾即可。
2、通过字符串进行 注入 。
解决方式:
凡是输入字符串全部格式化,过滤JS语句以及SQLServer关键字
1、字符串过滤JS代码先
代码
#region 过滤JS/CSS脚本
///
/// 过滤JS脚本
///
/// 要过滤的内容
///
///
///
/// img的攻击样式为 等,所以去掉所有的javascript代码
public static string WipeScript( string html)
{
if ( string .IsNullOrEmpty(html)) return html;
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex( @" " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex.Replace(html, "" ); // 过滤 标记
System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex( @" href *= *[\s\S]*script *: " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex1.Replace(html, "" ); // 过滤href=javascript: () 属性
System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex( @" on[\s\S]*= " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex2.Replace(html, " _disibledevent= " ); // 过滤其它控件的on...事件
System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex( @" [\s\S]+ " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex3.Replace(html, "" ); // 过滤iframe
System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex( @" " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex4.Replace(html, "" ); // 过滤frameset
System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex( @" javascript: " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex5.Replace(html, "" ); // 过滤所有javascript
System.Text.RegularExpressions.Regex regex6 = new System.Text.RegularExpressions.Regex( @" :*expression " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex6.Replace(html, "" ); // 过滤所有javascript
System.Text.RegularExpressions.Regex regex7 = new System.Text.RegularExpressions.Regex( @" " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex7.Replace(html, "" ); //
System.Text.RegularExpressions.Regex regex8 = new System.Text.RegularExpressions.Regex( @" src *= *[\s\S]*script *: " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex1.Replace(html, "" ); // 过滤src=javascript: ( ) 属性
System.Text.RegularExpressions.Regex regex9 = new System.Text.RegularExpressions.Regex( @" " , System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex3.Replace(html, "" ); // 过滤applet,放弃对applet的支持
return html;
}
#endregion
2、字符串过滤SQLServer关键词
代码
// 删除与 数据库 相关的词
Htmlstring = Regex.Replace(Htmlstring, " select " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " insert " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " delete from " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " count'' " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " drop table " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " truncate " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " asc " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " mid " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " char " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " xp_cmdshell " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " exec master " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " net localgroup administrators " , "" , RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, " and " , "" , RegexOptions.IgnoreCase);
3、传值字符串过滤SQLServer关键词
代码
protected void Application_BeginRequest(Object sender, EventArgs e)
{
// SQL防 注入
string Sql_1 = " exec|insert+|select+|delete+|update+|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|creat+table " ;
string Sql_2 = " exec+|insert|insert+|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|truncate+|char+|+char(|declare+|drop+|creat+|drop+table|creat+table " ;
string [] sql_c = Sql_1.Split( ' | ' );
string [] sql_c1 = Sql_2.Split( ' | ' );
if (Request.QueryString != null )
{
foreach ( string sl in sql_c)
{
if (Request.QueryString.ToString().ToLower().IndexOf(sl.Trim()) >= 0 )
{
Response.Write( " 警告!你的IP已经被记录!不要使用敏感字符! " ); //
Response.Write(sl);
Response.Write(Request.QueryString.ToString());
Response.End();
break ;
}
}
}
if (Request.Form.Count > 0 )
{
string s1 = Request.ServerVariables[ " SERVER_NAME " ].Trim(); // 服务器名称
if (Request.ServerVariables[ " HTTP_REFERER " ] != null )
{
string s2 = Request.ServerVariables[ " HTTP_REFERER " ].Trim(); // http接收的名称
string s3 = "" ;
if (s1.Length > (s2.Length - 7 ))
{
s3 = s2.Substring( 7 );
}
else
{
s3 = s2.Substring( 7 , s1.Length);
}
if (s3 != s1)
{
Response.Write( " 警告!你的IP已经被记录!不要使用敏感字符! " ); //
Response.End();
}
}
}
}
3、获取web.config的数据连接字符串
解决方式:web.config进行加密
asp.net 2.0 加密web.config
aspnet_regiis -pe "connectionStrings" -app "/xx" (xx为应用程序名)
解密:aspnet_regiis -pd "connectionStrings" -app "/xx"
加密后,web.config如图:
解密后,如图:
加密后的web.config程序可正常访问,且解密与加密必须在同一机器才有效(A机器上加密的web.config只有在A机器才可解密)。
能想到的就是这些,后面再发生问题,再不断完善。请列位同仁不断指正。
查看更多关于sqlserver数据库表防JS木马注入终极教程知彼知己百战不殆。的详细内容...