作者 | 肖博阳 上海控安可信软件创新研究院汽车网络安全组
来源 | 鉴源实验室
引言:在如今的数字化时代,Web应用程序已经渗透到我们生活的每个角落。从购物平台、社交媒体到企业级系统,无论是用户还是组织,都依赖于这些应用程序来满足各自的业务需求。然而,随着Web应用程序的蓬勃发展,与之而来的网络攻击也日益复杂、防不胜防。这些攻击不仅对用户的隐私和数据构成威胁,还可能对企业造成金融损失、声誉受损等严重危害。因此,理解和防范Web应用程序的常见漏洞变得尤为重要。
01 OWASP Top 10
为了帮助开发者、安全专业人员和组织更好地了解Web应用程序的主要风险,全球网络安全专业组织OWASP(Open Web Application Security Project)制定了OWASP Top 10,包括了当前Web应用程序面临的最重要的十大漏洞。
本文将聚焦于近年来OWASP Top 10中的若干漏洞,深入浅出地探讨它们的原理、危害以及防范策略。
02 SQL注入
注入漏洞被认为是最严重的漏洞之一,SQL注入漏洞是一种典型的注入漏洞,它允许攻击者通过构造SQL语句,绕过应用程序的身份验证和授权机制,访问、修改甚至删除数据库中的敏感信息。下面用一个例子具体说明SQL注入的原理。
2.1 SQL注入实例
在购物网站点击种类为“Accessories”的商品:
此时跳转到该种类的商品页面,url参数为“/filter?category=Accessories”
上述url参数将转化成SQL语句,用于查询数据库中的信息:SELECT * FROM products WHERE category = 'Accessories',即从数据库全部内容中查询类别为“Accessories”的商品,并将结果返回到页面中。
在理解url参数和SQL语句作用后,对url参数稍作更改即可实施SQL注入攻击。
将url参数更改为“/filter?category=Accessories'or+1=1--”。其中:
单引号“'”用于闭合原始的 SQL 查询;
“or”为逻辑运算符,用于连接两个条件,若其中一个条件为真,整个条件就为真;
“+”为url参数的连接符;
“1=1”为始终为真的条件;
“--”为SQL 中的注释符,它会注释掉后面的所有内容,从而防止查询语句因为被闭合的引号而变得不完整。
上述url参数最终将转化成SQL语句:SELECT * FROM products WHERE category = 'Accessories' or 1=1--,由于第二个条件始终为真,故整个条件为真,达到了跳过第一个条件的目的。从页面返回结果可知,本次查询绕过了类别过滤,从而获取到了所有商品的信息。
2.2 SQL注入小结
上述结果得知网站并未对SQL注入做防御措施,而进一步的SQL注入攻击可能导致更严重的后果,如读取、修改或删除敏感数据,绕过身份验证,破坏数据完整性,执行拒绝服务攻击,甚至获取操作系统级别的权限。这可能导致泄露用户隐私、系统崩溃、服务不可用、甚至整个系统被入侵,因此对SQL注入进行防御是必要的。
上述网站是Burpsuite官方实验室提供的SQL注入安全练兵场(下文XSS攻击使用的网站是XSS安全练兵场),因此未对SQL注入做任何防御措施。所幸目前绝大部分网站不存在这样的漏洞,已通过各种方式进行防御,如:验证过滤用户输入、使用参数化查询等。例如在对百度网使用相同的注入方式时,无法绕过过滤。
03 XSS攻击
XSS(Cross-Site Scripting)是另一种常见的web应用安全漏洞,它允许攻击者向网页注入恶意脚本代码,使这些脚本在用户浏览器中执行,从而达到攻击的目的。XSS可分为反射型XSS、存储型XSS和DOM型XSS。
3.1反射型XSS
反射型XSS指恶意脚本通过URL参数传递,被目标服务器反射回响应,并在用户浏览器中执行。常见于具有输入参数功能(如搜索功能)的页面,如下所示:
在搜索栏内输入“<script>alert(‘hello’)</script>”,执行该javascript语句将在用户浏览器内弹出内容为“hello”的对话框:
3.2 存储型XSS
存储型XSS指恶意脚本被存储在目标服务器上,当其他用户访问包含恶意脚本的页面时,脚本被执行。常见于具有存储输入功能(如评论功能)的页面,如下所示:
在评论区输入“<script>alert(‘hello’)</script>”,显示提交成功后回到原页面,用户浏览器内弹出内容为“hello”的对话框:
也就是说,任意用户只要浏览到该评论,均会弹出该对话框。存储型XSS比反射型XSS更容易产生危害,因为它无需用户主动进行操作,在浏览页面时无意识中被攻击。
3.3 DOM型XSS
DOM型XSS指恶意脚本直接影响浏览器的 DOM,通过修改页面的结构来执行攻击。DOM(Document Object Model)即文档对象模型,可简单理解为网页内容。DOM型XSS与前两类XSS攻击的最大区别在于不会被插入到服务器响应中,而是通过修改页面现有DOM结构来触发,这一特点使得DOM型XSS难以被服务端检测。
如下所示,在输入“1”后点击搜索:
出现搜索结果后通过开发者工具查看网页结构:
在DOM中发现用户输入的参数“1”被包裹在img标签内部。根据此信息,可在搜索框内输入“"><svg οnlοad=alert(1)>”,该参数在截断img标签后,新增一个svg标签,并在该标签内部通过“onload”事件属性触发弹窗事件:
点击搜索后出现了弹窗“1”,此时再通过开发者工具查看网页结构:
发现原本的img标签已被截断,出现了新增的svg标签且标签内部包含弹窗事件。
3.4 XSS总结
以上三类XSS示例均为攻击者展开攻击的第一步,攻击者通过该步骤判断网站是否进行了XSS防护。若攻击成功,可实施进一步攻击,如窃取用户信息、会话劫持等。
网站可通过输入验证、输出编码、CSP(Content Security Policy)等方式进行防御。
04 失效的身份认证
失效的身份认证指攻击者利用网站应用程序中的身份认证缺陷获取高权限并对应用服务进行攻击。通俗来说,攻击者能够破译密码等信息,绕过身份验证机制,暂时或永久地冒用其他用户身份从而进行攻击。
可能导致失效身份认证的因素包括:
弱密码策略:使用弱密码或允许用户设计弱密码,使攻击者更容易猜测或破解;
会话管理问题:Web应用程序中,会话指一种交互性的通信期间,即客户端和服务端进行通信的一段时间。若会话管理不当,如未设置会话过期时长或会话标识泄露时,攻击者将轻而易举地获取权限进行攻击;
不安全的密码重置:若密码重置功能不安全,攻击者可能通过恢复或绕过此功能来获取对用户账户的访问权限。
4.1 失效的身份认证实例
如下所示,在某FOTA平台利用低权限账户进行登录(该账户无账户管理功能),并通过抓包工具BurpSuite获取该网络请求的详细信息,记录低权限账户的令牌信息Authorization:
再以高权限账户进行登录(该账户拥有账户管理功能),同样获取网络请求的详细信息,此时将高权限账户的令牌信息替换为低权限用户的令牌信息,并重新发送该请求:
发现仍能成功获取相关信息,攻击者通过低权限账号直接获取了系统内敏感数据。
在上述实例中,将高权限令牌替换为低权限令牌,相当于模拟使用一个已登录的低权限账户去访问高权限接口。从实际攻击的角度出发,攻击者可通过一个普通账户(如游客账户),去访问一个高权限账户(如管理员账户)接口,进而使用超出自身权限的功能。
4.2 失效的身份认证小结
失效的身份认证是一种常见的安全漏洞,主要涉及到身份验证机制的不足或不正确使用,导致攻击者有可能通过不同的手段绕过身份验证,获得未经授权的访问权限。为防范此类漏洞,可采用实施强密码策略、设置会话过期时间、采用安全会话标识等措施。
05 小结
本文介绍了三种常见的Web应用程序漏洞:SQL注入、XSS攻击和失效的身份认证。
SQL注入允许攻击者通过在输入字段中注入恶意SQL代码来绕过验证,执行未经授权的数据库操作。为了防范SQL注入,Web应用程序应采用验证过滤用户输入、使用参数化查询等安全措施。
XSS攻击通过在网页中注入恶意脚本来在用户浏览器上执行恶意代码。分为存储型、反射型和DOM型XSS。为了预防XSS,Web应用程序应采用输入验证、输出编码和CSP(Content Security Policy)等关键措施。
失效的身份认证允许攻击者绕过已有的身份认证机制,获取未经授权的访问权限。为预防该攻击可加强会话管理,同时在密码强度上进行一定强制要求。
总体而言,通过综合使用这些安全措施,可以有效保护Web应用程序免受部分攻击的影响。