protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
  
            int SSN = Convert.ToInt32(Request.QueryString["id"]);
            SqlCommand cmd =new SqlCommand("SELECT * FROM teachers WHERE id = @uid");
            SqlParameter param = new SqlParameter("uid", SqlDbType.Int);
            param.Value = SSN;
            cmd.Parameters.Add(param);  
            
            DataBase db = new DataBase();            SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand = cmd;
            DataTable dt = new DataTable();
            dt = db.getDT(cmd);
           。。各种label
          
        }
    }

解决方案 »

  1.   

    你可能还没有知道sql注入的全部原因,弄清楚了就应该知道自己的原因了
      

  2.   

    在用户可以输入东西的地方,过滤掉sql语法里关键字,如or,and,drop,delete等
      

  3.   

     是有白帽子发过来的一个结尾为id=15的链接有注入,就和我用sqlmap截图的一样,我是初学asp,之前的管理员生病现在一个人奋斗,花了一晚上改的参数化也不知道对不对
      

  4.   

    楼主可以断点调试下  用参数的形式去注入下,结果:参数化不可能被注入。请检查其他页面的sql写法,是否有拼接的。
    给楼主提2点意见:
    1sql 尽量在底层dal 层去处理,而不是写在ui 后端
    2sql不要用拼接 全部用参数化 ,防止注入,能用过程处理 尽量避免sql,方便维护。
    希望采纳!
      

  5.   

    你的getDT方法的代码贴出来看看
      

  6.   

    你用他们传递的例子查过吗?
    另外不知道你的GetDT是干嘛的,看你已经SqlDataAdpater了
    那么直接sda.Fill(dt);就可以了
      

  7.   

    你好!目前我只修改了这一个页面,测试的时候也是用的这一个页面,其他页面的注入漏洞会对这个页面有影响吗?sql 参数化 是不会被注入的,检查下其他页面sql的写法 有无拼接的
      

  8.   

    public DataTable getDT(SqlCommand cmd) 
       {           Open();
                DataSet ds=new DataSet ();
                SqlDataAdapter da =new SqlDataAdapter ();            try
                {cmd.Connection = conn;
                    da.SelectCommand = cmd;
                    da.Fill(ds, "dt");
                    Close();
                    return ds.Tables["dt"];}
                catch(Exception ex)
                    {
                        return null; 
                    Close();}
                
       }
      

  9.   

    就是用他们给的注入点查的,用的sqlmap,要疯了
      

  10.   

    你好,改了一下:
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
      
                int SSN = Convert.ToInt32(Request.QueryString["id"]);
                if ( SSN < 50)
                {
                    SqlCommand cmd = new SqlCommand("SELECT * FROM teachers WHERE id = @uid");
                    SqlParameter param = new SqlParameter("uid", SqlDbType.Int);
                    param.Value = SSN;
                    cmd.Parameters.Add(param);                DataBase db = new DataBase();                //SqlDataAdapter sda = new SqlDataAdapter();
                    //sda.SelectCommand = cmd;
                    DataTable dt = new DataTable();
                    dt = db.getDT(cmd);
                    Label1.Text = dt.Rows[0]["tname"].ToString().Trim();
                    Label2.Text = dt.Rows[0]["zhich"].ToString().Trim();
                    Label3.Text = dt.Rows[0]["classes"].ToString().Trim();
                    Label4.Text = "    " + dt.Rows[0]["huojiang"].ToString().Trim();
                    Label5.Text = dt.Rows[0]["contents"].ToString().Trim();
                    Image1.ImageUrl = "admin/upload/" + dt.Rows[0]["pic"].ToString().Trim();
                    this.Title = Label2.Text.Trim() + "--" + Label1.Text.Trim() + "详细内容";
                    Label6.Text = "教师:" + Label1.Text.Trim() + "信息";
                }
            }
        }
      

  11.   

    @yupeigu  
    你来看下呢,我感觉他这个例子已经没sql注入了
      

  12.   

    你好!我是用sqlmap,具体注入过程:
    命令行输入:python sqlmap.py --wizard
    输入链接地址;
    [1] Normal (default)
    [2] Medium
    [3] Hard
    > 1
    Enumeration (--banner/--current-user/etc). Please choose:
    [1] Basic (default)
    [2] Smart
    [3] All
    > 1sqlmap is running, please wait..
    然后就是主楼黑屏的内容,崩溃。
      

  13.   

    你好!我是用sqlmap,具体注入过程:
    命令行输入:python sqlmap.py --wizard
    输入链接地址;
    [1] Normal (default)
    [2] Medium
    [3] Hard
    > 1
    Enumeration (--banner/--current-user/etc). Please choose:
    [1] Basic (default)
    [2] Smart
    [3] All
    > 1sqlmap is running, please wait..
    然后就是主楼黑屏的内容,崩溃。
    粗看上面的代码,你说的是 这条语句:SELECT * FROM teachers WHERE id = @uid会被sql注入吗?
      

  14.   

    你好!我是用sqlmap,具体注入过程:
    命令行输入:python sqlmap.py --wizard
    输入链接地址;
    [1] Normal (default)
    [2] Medium
    [3] Hard
    > 1
    Enumeration (--banner/--current-user/etc). Please choose:
    [1] Basic (default)
    [2] Smart
    [3] All
    > 1sqlmap is running, please wait..
    然后就是主楼黑屏的内容,崩溃。
    粗看上面的代码,你说的是 这条语句:SELECT * FROM teachers WHERE id = @uid会被sql注入吗?应该是,这还是我修改过的,最开始的代码是:    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                SqlCommand cmd = new SqlCommand();
                DataBase db = new DataBase();
                string cmdstr = "";
                if (Request.QueryString["id"] != null)
                {
                    cmdstr = "select * from teachers where id=" + Request .QueryString ["id"].Trim (); 
                    cmd.CommandText = cmdstr;
                    DataTable dt= new DataTable ();
                    dt= db.getDT(cmd);
                   Label1 .Text =dt.Rows[0]["tname"].ToString ().Trim ();
                   Label2 .Text =dt.Rows[0]["zhich"].ToString ().Trim ();
                   Label3 .Text =dt.Rows[0]["classes"].ToString ().Trim ();
                   Label4 .Text ="    "+dt.Rows[0]["huojiang"].ToString ().Trim ();
                   Label5 .Text =dt.Rows[0]["contents"].ToString ().Trim ();
                   Image1 .ImageUrl ="admin/upload/"+dt.Rows[0]["pic"].ToString ().Trim ();
                   this.Title = Label2.Text.Trim() + "--" + Label1.Text.Trim() + "详细内容";
                   Label6 .Text ="教师:"+Label1.Text.Trim()+"信息";
                   }
                }
            }    
      

  15.   

    没改过的代码很明显有sql的拼接,会注入,但是改过的还有我就真的想不通了。本来准备改好这一个,就接着把网站上所有接受输入的地方都改了,现在这一个也不成功,完全进行不下去了。希望能得到各位帮助!
      

  16.   

    不要应该是
    cmdstr = "select * from teachers where id=" + Request .QueryString ["id"].Trim (); 
    这句100%会被注入
    SELECT * FROM teachers WHERE id = @uid
    这句不可能被注入
    你拿一个改过之后不可能被注入的代码来问为啥上一句被注入的代码问题……
      

  17.   

    不是,我是说这两句都检测出sql注入了,改前改后都一样
      

  18.   

    这个网站不是我做的,好像没有发布,每次都是从服务器上把源文件整个复制下来改好又替换上去。我把改完的Detail.aspx.cscs文件替换服务器的再测试还是一样
      

  19.   

    ……
    aspx生成后是dll,你要替换dll,不是替换aspx
    你替换aspx.cs文件,测试时检查的还是原来的代码……
    你把你改后的代码生成下,然后将bin目录下的dll复制到服务器同名的bin目录下,话说不能sqlmap不能测试本机么?你本机VS调试下,然后你的sqlmap直接测你本地不行吗?
      

  20.   

    不是,我是说这两句都检测出sql注入了,改前改后都一样另外,你在后台,开启sql profiler,监控一下sql语句,看看,经过注入之后,sql是什么样子的
      

  21.   

    撸主应该是修改了本地代码,却一直拿发布的页面测试~我也是这么猜测的,楼主一直测试未发布的代码。btw:如果是调用存储过程,而且存储过程里拼接sql,那么参数化也会存在注入可能(这个跟楼主的例子无关)
      

  22.   

    抱歉实在初学不太懂,但是上一个管理员交给我以后好像说没编译就是源文件,刚刚看了服务器上都是asp文件,没有dll
      

  23.   

    撸主应该是修改了本地代码,却一直拿发布的页面测试~我也是这么猜测的,楼主一直测试未发布的代码。btw:如果是调用存储过程,而且存储过程里拼接sql,那么参数化也会存在注入可能(这个跟楼主的例子无关)
    抱歉实在初学不太懂,但是上一个管理员交给我以后好像说没编译就是源文件,刚刚看了服务器上都是asp文件,没有dll
      

  24.   

    真的?!我没有仔细看,但是最后都显示了网站数据表和管理员的名字,
    ---
    web server operating system: Windows 2008 R2 or 7
    web application technology: ASP.NET, Microsoft IIS 7.5, ASP.NET 2.0.50727
    back-end DBMS operating system: Windows 7 Service Pack 1
    back-end DBMS: Microsoft SQL Server 2005
    banner:
    ---
    Microsoft SQL Server 2005 - 9.00.5000.00 (X64)
            Dec 10 2010 10:38:40
            Copyright (c) 1988-2005 Microsoft Corporation
            Developer Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1
    )
    ---
    current user:    'xxxxx'
    current database:    'xxxxxxxx'
    current user is DBA:    True
      

  25.   

    参数化了应该不会被注入的,你本地调试 用那个测试会不会被注入呢?如果本地调试没问题,那么你发布了之后,生成的文件,在发布的文件夹下面的/bin文件夹下面的 web.dll   然后上传到服务器上就行了。
      

  26.   

     抱歉实在初学不太懂,但是上一个管理员交给我以后好像说没编译就是源文件,刚刚看了服务器上都是asp文件,没有dll 
    另外,我的参数化代码不知道写得对不对
      

  27.   

    本地测试没有注入:
    sqlmap is running, please wait..[21:12:18] [ERROR] possible integer casting detected (e.g. "$id=intval($_REQUEST['id'])") at the back-end web application
    do you want to skip those kind of cases (and save scanning time)? [y/N] N
    [21:12:24] [CRITICAL] all tested parameters appear to be not injectable. Try to increase '--level'/'--risk' values to perform more tests. Also, you can try to rerun by providing either a valid value for option '--string' (or '--regexp') If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could retry with an option '--tamper' (e.g. '--tamper=space2comment')另外这个网站没有发布,直接在服务器上放的源代码。替换源代码之后网站测试还是有注入。
      

  28.   

     抱歉实在初学不太懂,但是上一个管理员交给我以后好像说没编译就是源文件,刚刚看了服务器上都是asp文件,没有dll 
    另外,我的参数化代码不知道写得对不对
    抱歉,没注意看清楚,那你这个是ASP程序?注入的 是查询代码吗?
      

  29.   

    这个网站不是我做的,好像没有发布,每次都是从服务器上把源文件整个复制下来改好又替换上去。我把改完的Detail.aspx.cscs文件替换服务器的再测试还是一样在那条语句后面加日志功能,打出来看下感觉你没更新成功。。
      

  30.   

    这个网站不是我做的,好像没有发布,每次都是从服务器上把源文件整个复制下来改好又替换上去。我把改完的Detail.aspx.cscs文件替换服务器的再测试还是一样在那条语句后面加日志功能,打出来看下感觉你没更新成功。。
    我把服务器上该页面的内容都删了,只留了一个空文件detail.aspx.cs,结果测试sql注入依然能显示我的数据库名称和管理员名字等,我真是震惊了
      

  31.   

     抱歉实在初学不太懂,但是上一个管理员交给我以后好像说没编译就是源文件,刚刚看了服务器上都是asp文件,没有dll 
    另外,我的参数化代码不知道写得对不对
    抱歉,没注意看清楚,那你这个是ASP程序?注入的 是查询代码吗?
    asp的网站,没有发布直接用的源代码;诸如测试链接.......detail.aspx?id=10
      

  32.   

    ASP程序的SQL注入,也应该差不多的,参数化了,在做一个关键字处理试试呢?
      

  33.   

    之前听说过一个工具。只要SQLSERVER的数据库只要开启BROWER服务。开启那个软件就会得到那台服务器的管理员控制权。
    不知真假。
    只是听说未曾见过。
      

  34.   

    这个网站不是我做的,好像没有发布,每次都是从服务器上把源文件整个复制下来改好又替换上去。我把改完的Detail.aspx.cscs文件替换服务器的再测试还是一样在那条语句后面加日志功能,打出来看下感觉你没更新成功。。
    我把服务器上该页面的内容都删了,只留了一个空文件detail.aspx.cs,结果测试sql注入依然能显示我的数据库名称和管理员名字等,我真是震惊了在执行语句的地方,把语句打出来,被只测试,看到打出来执行的语句是什么?不可能是参数化的语句
      

  35.   

    这是我改过的代码,您看一下写的对吗?
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
      
                int SSN = Convert.ToInt32(Request.QueryString["id"]);
                if ( SSN < 50)
                {
                    SqlCommand cmd = new SqlCommand("SELECT * FROM teachers WHERE id = @uid");
                    SqlParameter param = new SqlParameter("uid", SqlDbType.Int);
                    param.Value = SSN;
                    cmd.Parameters.Add(param);                DataBase db = new DataBase();                //SqlDataAdapter sda = new SqlDataAdapter();
                    //sda.SelectCommand = cmd;
                    DataTable dt = new DataTable();
                    dt = db.getDT(cmd);
                    Label1.Text = dt.Rows[0]["tname"].ToString().Trim();
                    Label2.Text = dt.Rows[0]["zhich"].ToString().Trim();
                    Label3.Text = dt.Rows[0]["classes"].ToString().Trim();
                    Label4.Text = "    " + dt.Rows[0]["huojiang"].ToString().Trim();
                    Label5.Text = dt.Rows[0]["contents"].ToString().Trim();
                    Image1.ImageUrl = "admin/upload/" + dt.Rows[0]["pic"].ToString().Trim();
                    this.Title = Label2.Text.Trim() + "--" + Label1.Text.Trim() + "详细内容";
                    Label6.Text = "教师:" + Label1.Text.Trim() + "信息";
                }
            }
        }
      

  36.   

    这个网站不是我做的,好像没有发布,每次都是从服务器上把源文件整个复制下来改好又替换上去。我把改完的Detail.aspx.cscs文件替换服务器的再测试还是一样在那条语句后面加日志功能,打出来看下感觉你没更新成功。。
    我把服务器上该页面的内容都删了,只留了一个空文件detail.aspx.cs,结果测试sql注入依然能显示我的数据库名称和管理员名字等,我真是震惊了在执行语句的地方,把语句打出来,被只测试,看到打出来执行的语句是什么?不可能是参数化的语句
    不好意思,不太懂,实在sqlmap里面操作吗/?不太懂?
      

  37.   

    参数式,不可能有注入。你被注入,只能说你还有SQL拼接没处理好。一个最简单 办法:
    无论什么东西,拼接前,替换掉单引号。Replace("'","''")
      

  38.   

    我也觉得我的参数化代码依然有问题,但是实在看不出来,能不能麻烦您看一下?
    这是我改过的代码,您看一下写的对吗?
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
      
                int SSN = Convert.ToInt32(Request.QueryString["id"]);
                if ( SSN < 50)
                {
                    SqlCommand cmd = new SqlCommand("SELECT * FROM teachers WHERE id = @uid");
                    SqlParameter param = new SqlParameter("uid", SqlDbType.Int);
                    param.Value = SSN;
                    cmd.Parameters.Add(param);                DataBase db = new DataBase();
                    DataTable dt = new DataTable();
                    dt = db.getDT(cmd);
                    
                    Label1.Text = dt.Rows[0]["tname"].ToString().Trim();
                    Label2.Text = dt.Rows[0]["zhich"].ToString().Trim();
                    Label3.Text = dt.Rows[0]["classes"].ToString().Trim();
                    Label4.Text = "    " + dt.Rows[0]["huojiang"].ToString().Trim();
                    Label5.Text = dt.Rows[0]["contents"].ToString().Trim();
                    Image1.ImageUrl = "admin/upload/" + dt.Rows[0]["pic"].ToString().Trim();
                    this.Title = Label2.Text.Trim() + "--" + Label1.Text.Trim() + "详细内容";
                    Label6.Text = "教师:" + Label1.Text.Trim() + "信息";
                }
            }
        }
      

  39.   

    最新进展:sqlmap注入测试总是超时
    [17:19:43] [CRITICAL] connection timed out to the target URL or proxy. sqlmap is going to retry the request(s)
      

  40.   

    每次sqlmap注入测试就超时,然后网站打不开,又登陆服务器重启网站,如此往复,累