zoukankan      html  css  js  c++  java
  • WebGoat学习——SQL注入(SQL Injection)

    SQL注入(SQL Injection)

          所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。攻击者通过web请求提交带有影响正常SQL执行的参数(arlen’ OR ‘1’=’1),服务端在执行SQL时参数的特殊性影响了原本的意思(select * from table where user=’arlen’ OR ’1’=’1’;),执行了非预期的操作(select * from table where user=’arlen’ OR ‘1’='1’),从而是攻击者获取到了其他用户的信息或者对服务造成了攻击。

          SQL注入操作简单,危害严重,现在也有比较成熟的防范措施,但是往往因为开发人员操作不当(例如:忘记过滤参数、不当的错误处理、配置失误)而产生风险,如果未被发现SQL注入漏洞并不影响任何系统功能,往往也不被察觉,一旦攻击者发现SQL漏洞,后果就比较严重。

    SQL注入技术原理

        在大多数web接口传入的参数最终都会反映到数据库表中的某一字段,例如用户登录的例子:

          后端代码通过如下方法实现:

    <?php
    $con = mysql_connect("localhost", "xxx", "xxx");
    if (!$con)
    {
          die('Could not connect: '.mysql_error());
    }
    
    $db_selected = mysql_select_db("xxx", $con);
    if (!$db_selected) 
    {
         die('select db test failed: '.mysql_error());
    }
    
    $user = $_REQUEST["user"];
    $pwd = $_REQUEST["password"];
    
    $sql = "select count(*) as count from user_info where user = '$user' AND password = '$pwd';";
    
    $sql_query = mysql_query($sql, $con);
    if (!$sql_query)
    {
        die(' mysql_query failed: '.mysql_error());
    }
    
    $num = 0;
    if (!$data = mysql_fetch_object($sql_query))
    {
        die('mysql_fetch_object failed: '.mysql_error());
    }
    else
    {
        $num = $data->count;
    }
    
    if (0 >= $num)
    {
         echo "user[$user] login failed!";
    }
    else
    {
        echo "user[$user] login succ!";
     }
    
    ?>

          在后端实现是通过下面SQL来判断用户和密码是否匹配:

    SELECT COUNT (*) as count FROM user_info WHERE user='arlen' AND password='123456';

    如果服务器没有做过滤操作,可以令user=arlen’ or ‘1’='1来进行登录,即便完全不知道用户arlen对应的密码一样可以校验通过,php拼装的SQL语句为:

    SELECT COUNT (*) as count FROM user_info WHERE user='arlen' or '1' = '1' AND password='123456';

          这样只要user_info表中有数据就能通过login的校验。

          SQL注入的原理就是在正常station 字段中注入特征字符,能组合成新的SQL 语句。SQL注入学习成本低,攻击性高,容易防范,但往往因为工作上的失误或者测试的不足而留下漏洞。

    SQL注入防御

          SQL注入原理简单易学,但防范起来却略为复杂,本质就是防止用户输入的不安全参数放映到具体的SQL语句上,例如:

    1. web参数过滤,只允许约定的字符出现,比如数字、字母,100%解决问题,但过于暴力;

    2. 对需要拼装SQL语句的参数做过滤,例如PHP自带的mysql_real_escape_string()函数,修改上述代码如下:

    if (!$db_selected) 
    {
         die('</br>select db test failed: '.mysql_error());
    }
    
    $user = mysql_real_escape_string($_REQUEST["user"]);
    $pwd = mysql_real_escape_string($_REQUEST["password"]);
    
    
    $sql = "select count(*) as count from user_info where user = '$user' AND password = '$pwd';";
    
    echo $sql;
    
    $sql_query = mysql_query($sql, $con);

    这样实际执行的SQL为:

    select count(*) as count from user_info where user = 'arlen' or '1' = '1' AND password = '1234567';

    3. 小心拼写SQL语句,一定要注意拼接SQL字段各个字段的来源,如果是外部传入的,根据不信任原则,一定要严格校验过滤;

    4. 设置Mysql权限,只给访问数据库的web应用功能所需的最低权限帐户,这种只能降低损失,并不能避免注入;

    5. 避免将数据库的错误信息直接返回,对于Mysql错误,程序一定要识别后再做返回,避免将错误描述直接返回给前端。

    6. 小心、细心,SQL注入最常出现在开发人员粗心时;

    7. 借助SQL注入扫描工具。

    SQL注入其他资料

    百度百科:http://baike.baidu.com/view/3896.htm

    SQL注入危害:http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html

  • 相关阅读:
    SOGo 2.0 发布,群组协同工作系统
    微软随.NET 4.5发布新REST API框架
    DynamicReports 3.0.2 发布,Java 报表方案
    使用 Ant 集成 IBM Security AppScan Standard 进行自动测试
    SUSE 用 zypper 工具 安装 rpm
    嵌入式ARM系统中OpenCV的移植
    qtopiax86安装配置及编程方法
    [转]QTCreator的使用
    在Qt Creator中使用OpenCV库
    vim
  • 原文地址:https://www.cnblogs.com/arlenhou/p/WebGoatSqlInjection.html
Copyright © 2011-2022 走看看