来源:自学PHP网 时间:2015-04-16 23:15 作者: 阅读:次
[导读] 以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理。今天学习c 数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事。众所周知...
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理。
今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事。 众所周知的万能密码SQL注入漏洞,大家相信很熟悉了。 不懂得简单了解下,懂的大牛直接飘过即可。 ***************************************************************************** 当我们用御剑之类的扫描器扫描到某些有这个万能密码SQL注入的漏洞网站后台后, 打开网页,输入下列内容,无需知道账号密码也可以登录后台。 http://www.*******.com/admin/admin_login.asp 账号:djlfjdslajdfj(随意输入) 密码:1‘or’1’=‘1 那么为什么呢? 其实原理很简单: 我们先看一条普通的数据库查询语句: 1.普通的直接在数据库里进行查询语句: select * from T_users where username='root' and password='root'; 2.在网站开发中经常这样做, T_users是表名 ,username是数据库中字段名,name和pwd是变量。 " select * form T_users username=' " + name +" ' "+" and password=' " + pwd +" ' "; 如果变量name赋值为 root ,pwd变量赋值为 root 的话,这根本不会有什么问题,和上面一模一样。 即等价于" select from T_users username= root and password= root " 3.但是如果变量name赋值:随意输入,而pwd被赋值 1 or 1=1 , 那么整个语句就变成了这个样子: " select from T_users username= adsfafsf and password=1 or 1=1 " 可以看出,此时 整个查询语句返回值始终为true. 模拟测试数据库如下:
模拟万能密码SQL注入漏洞源码如下: using System; using System.Data.SqlClient; namespace 第一个数据库程序 { class Program { static void Main(string[] args) { //解决数据库添加不进去数据,两个mdf问题冲突问题代码,即. /***************************************************/ string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")) { dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); } /************************************************/ Console.WriteLine("请输入用户名:"); string user = Console.ReadLine(); Console.WriteLine("请输入密码:"); string pwd = Console.ReadLine(); //与数据库建立连接 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")) { conn.Open();//打开连接 //创建sql语句命令 using (SqlCommand cmd = conn.CreateCommand()) { //SQL语句查询命令 cmd.CommandText = " select * from [T_users] where username='"+ user + "'" + "and password='" + pwd + "'" ; int i = Convert.ToInt32(cmd.ExecuteScalar());//返回第一行第一列的值 if (i > 0) { Console.WriteLine("登陆成功!"); } else { Console.WriteLine("登陆失败!"); } } } Console.ReadKey(); } } } 程序运行截图: 普通输入,输错密码无法登陆:
输入正确密码,登陆成功: 输入万能密码,登陆成功! 那么该如何解决这问题呢? 解决源码如下: using System; using System.Data.SqlClient; namespace 第一个数据库程序 { class Program { static void Main(string[] args) { //解决数据库添加不进去数据,两个mdf问题冲突问题代码,即. /***************************************************/ string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")) { dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); } /************************************************/ Console.WriteLine("请输入用户名:"); string user = Console.ReadLine(); Console.WriteLine("请输入密码:"); string pwd = Console.ReadLine(); //与数据库建立连接 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")) { conn.Open();//打开连接 //创建SQL命令语句 using (SqlCommand cmd = conn.CreateCommand()) { //SQL查询语句 cmd.CommandText = "select * from T_users where username=@NAME and password=@PW"; cmd.Parameters.Add(new SqlParameter("NAME", user));//NAME 和PW是参数,名字自己随意取,但必须和上面的一致。 cmd.Parameters.Add(new SqlParameter("PW", pwd)); int i = Convert.ToInt32(cmd.ExecuteScalar());//函数返回第一行第一列的值 if (i > 0) { Console.WriteLine("登陆成功!"); } else { Console.WriteLine("登陆失败!"); } } } Console.ReadKey(); } } } 普通输入,输错密码无法登陆:
输入正确密码,登陆成功: 万能密码登陆失败! |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com