黑马程序员技术交流社区

标题: 关于注入漏洞攻击 [打印本页]

作者: 徐刚    时间: 2012-4-6 17:05
标题: 关于注入漏洞攻击
  老师在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.             }
复制代码

作者: 柏云杉    时间: 2012-4-6 17:35
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” 试一试.应该能够查询到的
作者: 徐刚    时间: 2012-4-6 17:48
本帖最后由 徐刚 于 2012-4-6 18:09 编辑
柏云杉 发表于 2012-4-6 17:35
cmd.CommandText = "select * from T_Users where UserName='" + username + "'";
首先分析一下sql语句:查 ...


我知道输入1' or '1'='1时查询就是查询到数据库的所有数据,可是对于上面的那个代码写成的程序你是登录不了的,除非你人品爆发,输入的密码是和数据表中第一行中的密码一样才能登录成功。可是我的意思不是这个,而是想知道查询返回了所有数据之后,攻击者可以利用什么手段得到这些数据?那样不就可以为所欲为了。
作者: 白建新    时间: 2012-4-6 17:55
  常见的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字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。
所以使用参数序列化或者键入字符加密处理可以防止注入式攻击发生,但也不是绝对安全!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2