SQL注入--(错误的关键词也能执行成功)--01

本文展示了一个使用Java进行数据库操作的例子,并通过一个简单的登录验证过程揭示了SQL注入的风险。文章详细介绍了如何加载数据库驱动、建立连接、执行SQL查询及处理结果集。
import java.sql.*;

public class Demo1 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;


        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String userName = "root";
            String password = "root";
            String url = "jdbc:mysql://localhost:3306/yhp2?serverTimezone=UTC";
            connection = DriverManager.getConnection(url,userName,password);


            //3.定义sql,创建状态通道(进行sql语句的发送)
            statement = connection.createStatement();

变量范围

        String uname = "abcd"; //在表记录中,abcd为错误uname,aa为正确 uname   错误但能执行成功
        // " '' or 1=1"  定义的变量值,即为输入的值
        // 方法不安全
        // 1=1表示恒成立条件  or表示其中一个满足都满足
        String pass = " '' or 1=1"; //在表记录中,111为正确pass
        resultSet = statement.executeQuery("select * from users2 where username='"+uname+"' and password="+pass); //executeQuery(sql)执行增删改时使用
        if(resultSet.next()){
        System.out.println("登录成功");
    }else{
        System.out.println("登录失败");
        }
      } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            try {


                //5.关闭资源
                if(resultSet !=null){
                    resultSet.close();
                }
                if(statement !=null){
                    statement.close();
                }
                if( connection !=null){
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }

    }
}

在这里插入图片描述

### 双写技术绕过SQL注入防护机制 在某些情况下,开发者可能会使用正则表达式或其他过滤方法来防止常见的SQL注入关键字被利用。然而,攻击者可以通过一些技巧绕过这些防御措施。其中一种常见的方式就是所谓的 **双写技术**。 #### 正则表达式的漏洞分析 当开发人员使用正则表达式匹配特定的关键字时,如果未充分考虑变体形式,则可能导致安全策略失效。例如,在PHP环境中使用的 `preg_match` 函数可能无法识别经过变形处理后的关键词[^1]: ```php if (!preg_match('/(and|or|union|where)/i', $input)) { // 输入被认为安全并执行查询 } ``` 上述代码片段仅检测到标准的 SQL 关键词列表 (`AND`, `OR`, `UNION`, 和 `WHERE`) 的单次出现情况。但是,它并未考虑到重复书写的情况,比如将 `ununionion` 替代为实际运行中的 `union`。 #### 绕过的具体实现方式 为了演示这种技术的实际应用效果,可以观察下面的例子: 原始尝试失败: ```sql Filtered injection: 1 || (select user from users where user_id = 1) = 'admin' ``` 而采用双写技术之后成功绕过了简单的字符串匹配逻辑: ```sql Bypassed injection: 1 || (selelectct user frfromom users liimitm it 1) = 'admin' ``` 这里通过故意拼接两个相同的字符序列(如 `selelectct` 对应于正常的 `select`),使得原本会被拦截下来的恶意输入得以顺利传递给数据库引擎解析执行。 值得注意的是,这种方法的有效性取决于目标系统的具体实现细节以及所部署的安全控制措施强度。对于更复杂的场景或者现代框架自带ORM层保护的情况下,单纯依赖此类手法往往难以奏效[^2]。 另外需要注意的是,尽管本例讨论了如何规避基本层面的静态模式验证过程,但在真实世界里实施任何非法访问行为均属违法行为,请严格遵守法律法规及道德准则! --- ### 实际案例说明 假设存在这样一个登录页面接口 `/login.php?id=USER_ID&password=PASSWORD_HASH` ,其内部采用了如下简单校验手段: ```php $id = $_GET['id']; $password_hash = hash('sha256', $_GET['password']); $query = "SELECT * FROM users WHERE id='$id' AND password_hash='$password_hash'"; $result = mysqli_query($conn, $query); ... ``` 此时如果我们直接提交包含敏感操作符的数据包将会触发报警甚至阻断连接请求;但如果巧妙运用双重编码思路构造payload的话就有可能突破防线完成测试目的——当然这仅仅适用于教学研究环境之下哦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值