从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理。
今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事。
众所周知的万能密码SQL注入漏洞,大家相信很熟悉了。
不懂得简单了解下,懂的大牛直接飘过即可。
*****************************************************************************
当我们用御剑之类的扫描器扫描到某些有这个万能密码SQL注入的漏洞网站后台后,
打开网页,输入下列内容,无需知道账号密码也可以登录后台。
http://www.*******.com/admin/admin_login.asp 账号:djlfjdslajdfj(随意输入) 密码:‘or’’=‘
那么为什么呢?
其实原理很简单:
我们先看一条普通的数据库查询语句:
1.普通的直接在数据库里进行查询语句:
select * from T_users where username='root' and password='root';
2.在网站开发中有些人是这样做的,T_users是表名,username是数据库中字段名,
name和pwd是变量。
"select * form T_users where username=' "+ name +" ' "+" and password=' "+ pwd +" ' ";
如果变量name赋值为root,pwd变量赋值为root的话,这根本不会有什么问题,和上面一模一样。
即等价于"select * from T_users where username= 'root' and password= 'root' "
3.但是如果变量name赋值:随意输入,而pwd被赋值 1 or 1=1 ,
那么整个语句就变成了这个样子:
"select from T_users where 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 > )
{
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 > )
{
Console.WriteLine("登陆成功!");
}
else
{
Console.WriteLine("登陆失败!");
}
}
} Console.ReadKey();
}
}
}
普通输入,输错密码无法登陆:

输入正确密码,登陆成功:

万能密码登陆失败!

从c#角度看万能密码SQL注入漏洞的更多相关文章
- SQL注入漏洞技术的详解
SQL注入漏洞详解 目录 SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 Up ...
- SQL注入漏洞详解
目录 SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 UpdateXml报错注 ...
- 10年前,我就用 SQL注入漏洞黑了学校网站
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- sql注入漏洞笔记随笔
sql注入是从1998年出现的,是一个十分常见的漏洞,它是OWASP top10的第一名(注入) 在了解sql注入之前,我们需要先了解web框架 webapp:web网站,这种方式它采用的是B/S架构 ...
- 利用SQL注入漏洞登录后台的实现方法
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
- 浅谈SQL注入漏洞以及防范策略
--HeShiwei 2014-5-15 什么是SQL注入 SQL注入,指的是用户通过向登录框输入恶意字符,利用代码的字符串拼接漏洞进行网站注入攻击,最终导致整个网站用户表信息泄露的攻击方式.黑客就是 ...
- 利用SQL注入漏洞登录后台的实现方法 。。。。转载
一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS ...
- 简单分析什么是SQL注入漏洞
现在很多人在入侵的过程中基本都是通过SQL注入来完成的,但是有多少人知道为什么会有这样的注入漏洞呢?有的会随口说着对于字符的过滤不严造成的.但是事实是这样吗?我们学这些,不仅要知其然,更要知其所以然! ...
- 利用“参数赋值”防范SQL注入漏洞攻击
<<年轻,无权享受>————送给每一个看到此文的同僚们 在这无精打采的炎夏 我躺在阳台上房东的旧沙发 回想几个月来遇到的问题 我不禁内心开始慌张喘着粗气 还有大把时间去打拼 没有到只 ...
随机推荐
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- JS正则表达式常用总结
正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...
- HTML5 sessionStorage会话存储
sessionStorage 是HTML5新增的一个会话存储对象,用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据.本篇主要介绍 sessionStorage(会话存储) ...
- 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程
最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下. 以VS2010为例: 这是一个已经设置好最基本的Visual Studio ...
- SQL Server2008R2 在windows8上安装,出现“兼容性”和 “执行未经授权的操作”的错误!
本人是windows8.1的操作系统,亲测安装成功 解决方法如下: 1.卸载干净sql Server2008r2,包括注册表内容,删除c盘下的安装路径! 2.关闭防火墙(这步很重要) 3.断开网络连接 ...
- Html.DropDownLis绑定数据库
效果: 方法一: View: <div class="col-md-md-4"> <div class="input-group"> & ...
- 利用for循环找出1000以内的质数
var n=0; for(var i=2;i<=1000;i++){ var zhishu=true; for(var j=2;j<i;j++){ if(i%j==0){ ...
- BPM与 SAP & Oracle EBS集成解决方案分享
一.需求分析 SAP和Oracle EBS都是作为全球顶级的的ERP产 品,得到了众多客户的青睐.然而由于系统庞大.价格昂贵以及定位不同,客户在实施过程中经常会面临以下困惑: 1.SAP如何实现&qu ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...