A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐刚 中级黑马   /  2012-4-6 17:05  /  1915 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  老师在ADO.Net视频中关于注入漏洞攻击的讲解中,没有用一开始的那个“先查询用户名得到查询结果后再判断密码是否与查询结果中的密码一致”的登录程序,而是重新写了一个“直接查询用户名和密码得到查询结果的数目”的登录程序,想知道注入漏洞攻击对前一种有什么影响,个人认为前一种是不是在注入攻击时查询语句执行后返回整个数据库中的数据,然后攻击者利用某种手段或工具得到这些数据后,就可以想怎样就怎样了!前一个登录程序代码附出来,大家谈谈看法啊!
  1. Console.WriteLine("请输入您的用户名:");
  2.             string username = Console.ReadLine();
  3.             Console.WriteLine("请输入您的密码:");
  4.             string password = Console.ReadLine();

  5.             using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
  6.             {
  7.                 conn.Open();
  8.                 using (SqlCommand cmd = conn.CreateCommand())
  9.                 {
  10.                     cmd.CommandText = "select * from T_Users where UserName='" + username + "'";
  11.                     //先到表中查用户输入的用户名对应的信息
  12.                     using (SqlDataReader reader = cmd.ExecuteReader())
  13.                     {
  14.                         if (reader.Read())//用户名存在
  15.                         {                           
  16.                             string dbpassword = reader.GetString(reader.GetOrdinal("Password"));
  17.                             if (password == dbpassword)//比较用户输入的密码和数据库中存储的密码是否一致
  18.                             {                                
  19.                                 Console.WriteLine("登录成功!");
  20.                             }
  21.                             else
  22.                             {
  23.                                 Console.WriteLine("密码错误,登录失败!");
  24.                             }

  25.                         }
  26.                         else//Read返回false,就是没有查到这个用户名
  27.                         {                           
  28.                             Console.WriteLine("用户名不存在!");
  29.                         }
  30.                     }
  31.                 }
  32.             }
复制代码

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

3 个回复

倒序浏览
cmd.CommandText = "select * from T_Users where UserName='" + username + "'";
首先分析一下sql语句:查询出数据库中T_Users表格中字段UserName的值等于"username"的那一行所有数据。
当程序拿到这句sql语句时就会在T_Users表格中从第一行开始往下搜索。把每一行UserName字段存放的数据拿出来与where中的username的值进行判断,如果是ture则返回这行数据。
sql注入攻击:cmd.CommandText = "select * from T_Users where UserName='" + username + "'"+“or 1 = 1”;
这句话中where 中的逻辑语句的结果永远是ture,再加上select *,所以会把整个表格中的数据全部查询出来。
个人这么理解的。
那么老师的这一段代码:你可以在输入用户名的时候加上 "or 1 = 1” 试一试.应该能够查询到的

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 徐刚 于 2012-4-6 18:09 编辑
柏云杉 发表于 2012-4-6 17:35
cmd.CommandText = "select * from T_Users where UserName='" + username + "'";
首先分析一下sql语句:查 ...


我知道输入1' or '1'='1时查询就是查询到数据库的所有数据,可是对于上面的那个代码写成的程序你是登录不了的,除非你人品爆发,输入的密码是和数据表中第一行中的密码一样才能登录成功。可是我的意思不是这个,而是想知道查询返回了所有数据之后,攻击者可以利用什么手段得到这些数据?那样不就可以为所欲为了。
回复 使用道具 举报
  常见的SQL注入式攻击过程类如:   ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。   ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子:   System.Text.StringBuilder query = new System.Text.StringBuilder(   "SELECT * from Users WHERE login = '")   .Append(txtLogin.Text).Append("' AND password='")   .Append(txtPassword.Text).Append("'");   ⑶ 攻击者在用户名字和密码输入框中输入"'或'1'='1"之类的内容,例如a' or '1'='1。   ⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。   ⑸ 服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。   ⑹ 由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。   如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。
所以使用参数序列化或者键入字符加密处理可以防止注入式攻击发生,但也不是绝对安全!

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马