数字型,字符型及搜索型和XX型的SQL注入

本文介绍了SQL注入的四种类型:数字型、字符型、搜索型和XX型。通过示例展示了利用Pikachu数据进行检验,以及如何通过Burp Suite(BP)进行抓包和重放测试,揭示了SQL注入的可能,并提供了后端代码片段以说明攻击方式。对于字符型注入,强调了需要构造合法SQL语句的重要性。

一,数字型:
在这里插入图片描述

在这里插入图片描述
先随机选一个选项 点击查询 得到上图

然后YY是否可以进行注入
在这里插入图片描述
在这里插入图片描述
打开pikachu数据 输入show tables 进行检验
在这里插入图片描述
在输入desc member
在这里插入图片描述
再输入下图代码 遍历数据库 由于1or1永远为真 所以会将数据库内容全部显示

在这里插入图片描述

打开bp进行抓包

为操作方便 先关闭拦截 使用HTTP history进行查找

在这里插入图片描述
先随便选择一个选项 点击查询 然后在bp中找到 发送到repeater中做重放测试

在这里插入图片描述

在这里插入图片描述

将id更改为

运行后 得到返回值为200
在这里插入图片描述

在这里插入图片描述
通过上述可知可以进行SQL注入 可以自己拼接一下SQL来让它反应
后端代码:
在这里插入图片描述
二,字符型注入

初始步骤与数字型基本相同

在这里插入图片描述
在这里插入图片描述
先YY

在这里插入图片描述
在这里插入图片描述
需要构造一个合法的SQL语句
在这里插入图片描述
效果图
在这里插入图片描述
三,搜索型SQL注入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
四,XX型SQL注入
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好艰辛

### 如何区分SQL注入中的字符型参数与数字型参数 在 SQL 注入攻击中,理解并区分字符型参数数字型参数至关重要。以下是两种类的定义及其区别: #### 数字型参数 数字型参数通常用于表示整数或浮点数值,在 SQL 查询中不需要额外的引号包裹。如果输入的内容被当作纯数字处理,则该参数属于数字型。 当测试是否存在数字型注入漏洞时,可以通过修改 URL 参数的方式验证。例如,假设有一个查询字符串 `id=1`,尝试将其改为如下形式: - 添加逻辑条件:`?id=1 AND 1=1` 或 `?id=1 AND 1=2` 如果页面行为发生变化(如显示不同的结果集),则可能表明存在数字型注入漏洞[^3]。 - 使用注释符绕过后续逻辑:`?id=1--` 或 `?id=1/*` 此类操作能够终止原 SQL 语句的一部分,从而影响其执行效果[^2]。 #### 字符型参数 字符型参数一般指代字符串数据类,在 SQL 中需要用单引号 `'` 将其括起来。因此,针对此类参数实施注入攻击时需特别注意闭合这些引号。 要检测某个字段是否接受字符型输入可采取下面的方法之一: - 插入特殊字符组合以破坏语法结构,像这样:`?username=' OR '1'='1` 或者 `?username=a' UNION SELECT NULL, version() --` 。假如服务器响应异常或者泄露敏感信息,则说明可能存在风险[^1]。 - 对比正常请求与恶意构造后的表现差异;比如原本期望得到单一记录却收到多条甚至整个数据库表的信息列表等情况均值得怀疑[^4]。 通过上述手段可以有效辨别目标应用系统内的各个变量究竟归属于哪种类别——要么是纯粹基于数值运算场景下的“数字型”,要么是在涉及文本匹配环节里使用的“字符型”。 ```python # 示例代码展示简单的数字型字符型注入模拟 import sqlite3 def test_sql_injection(user_input_type, user_value): conn = sqlite3.connect(':memory:') cursor = conn.cursor() # 创建示例表格 cursor.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT)') cursor.executemany('INSERT INTO users VALUES (?, ?)', [(1, "Alice"), (2, "Bob")]) try: if user_input_type == 'numeric': query = f'SELECT * FROM users WHERE id={user_value} LIMIT 1;' # 不安全的做法 elif user_input_type == 'string': query = f"SELECT * FROM users WHERE username='{user_value}' LIMIT 1;" # 同样不推荐 result = cursor.execute(query).fetchall() print(f'Result of injection attempt ({query}): {result}') except Exception as e: print(f'Error occurred during execution: {e}') test_sql_injection('numeric', '1 or 1=1') # 测试数字型注入 test_sql_injection('string', "' OR 'a'='a") # 测试字符型注入 ``` 以上脚本仅作教学用途,请勿应用于非法目的!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值