从c#角度看万能密码SQL注入漏洞

以前学习渗透时,虽然也玩过万能密码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 [email protected] and [email protected]";

                    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();
        }
    }
} 

普通输入,输错密码无法登陆:

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

万能密码登陆失败!

从c#角度看万能密码SQL注入漏洞

时间: 2024-10-21 17:50:54

从c#角度看万能密码SQL注入漏洞的相关文章

利用SQL注入漏洞登录后台的实现方法

利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的.  如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的.  前些天,网上传

利用SQL注入漏洞登录后台

题记:工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的. 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的. 前些天,网上传得沸沸扬扬的“拖库”事件给我们敲响了安全警钟. 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常

Axublog 1.1.0 c_login.php存在sql注入漏洞

0x00前言 开始从小的漏洞开始练习,搬运项目地址: https://github.com/imsebao/Code-Audit 0x01 Axublog是一款PHP个人博客系统. Axublog(c_login.php)存在SQL注入漏洞.攻击者可利用漏洞, 直接进行注入,获取数据库敏感信息. 漏洞分析: 漏洞出现在后台登录验证的部分. 首先看后台登录页面代码.www/ad/login.php <?php include_once("all.php"); header(&quo

利用SQL注入漏洞登录后台的实现方法 。。。。转载

一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e) DBMS接受返回的结果,并处理,返回给用户 因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活的话). 下面,我通过一个实例具体来演示下SQL注入 二.SQL注入实例详解(以上测试均假设服务器未开启magic

[转]SQL注入漏洞及绑定变量浅谈

1.一个问题引发的思考 大家在群里讨论了一个问题,奉文帅之命写篇作文,且看: String user_web = "user_web"String sql = "update user set user_web="+user_web+" where userid=2343"; 大家看看这条sql有没有问题,会将user_web字段 更新成什么? 问题的结论是:执行后的记录结果跟执行前一样,(执行时的sql语句为 update user set u

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2

jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一个客户可以对应多个订单,一个订单只属于一个客户! * 建表原则: * 在多的一方创建一个字段,作为外键指向一的一方的主键!!! * 多对多: * 一个学生可以选择多个课程,一个课程也可以被多个学生选择! * 建表原则: * 创建第三张表,第三张表中放入两个字段,作为外键分别指向多对多双方的主键! *

zabbix 爆高危 SQL 注入漏洞,可获系统权限(profileIdx 2 参数)

漏洞概述 zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统,也可通过script等功能轻易直接获取zabbix服务器的操作系统权限. 影响程度 攻击成本:低 危害程度:高 是否登陆:不需要 影响范围:2.2.x, 3.0.0-3.0.3.(其他版本未经测试) 漏洞测试 在zabbix地址后面添加这串url jsrpc.php?type=9&method=s

知名CMS软件Joomla 存SQL注入漏洞

  近日,Trustwave SpiderLabs 研究员Asaf Orpani 发现知名CMS Joomla 3.2-3.4.4版本中存在SQL注入漏洞,经安全狗实验室检测该漏洞危害巨大,影响范围广,利用难度低.目前官方已在3.4.5版本中修复该漏洞,请相关网站及时更新.另外,经测试安全狗可防御该漏洞. 漏洞详细说明与利用方法 据 Asaf Orpani 分析得出,该SQL注入漏洞存在于 /administrator /components /com_contenthistory/ model