Common Web Attacks
本文介绍了 XSS,CSRF,SQL Injection 和 DDOS 攻击的基本原理,由于基本是参考链接摘录,读者可酌情阅读。
Cross Site Scripting (XSS)
跨站脚本攻击,为了区分 Cascading Style Sheets (CSS),把 Cross 缩写为 X。易受此类攻击的站点被用来执行 恶意 JS 代码
。防御方法是加强输入 校验
,将提交内容 编码
后保存,不随意将外部内容直接渲染到页面。
Example
下面这段 JSP 代码将请求参数中的 eid
直接渲染到 HTML。攻击者可以构造 eid
为 JS
的链接,通过邮件等形式诱导受害者点击,从而让浏览器执行恶意代码。这种形式的攻击称为 Reflected XSS
。
<% String eid = request.getParameter("eid"); %>
...
Employee ID: <%= eid %>
下面这段 JSP 代码从数据库取 用户名
渲染到 HTML。如果不加校验,攻击者可以将自己的用户名设为 JS
片段,诱导受害者访问他的主页触发恶意代码执行。这种形式的攻击称为 Stored XSS
。
<%...
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from emp where id="+eid);
if (rs != null) {
rs.next();
String name = rs.getString("name");
%>
Employee Name: <%= name %>
下面这段 HTML 代码从 URL 中解析语言参数渲染到 DOM。
…
Select your language:
<select><script>
document.write("<OPTION value=1>"+decodeURIComponent(document.location.href.substring(document.location.href.indexOf("default=")+8))+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
…
攻击者可以构造下面这样的链接诱导受害者点击,从而执行恶意 JS 代码。由于这种攻击不与服务器交互,因此称为 DOM Based XSS
。
<!-- 正常链接 -->
http://www.some.site/page.html?default=French
<!-- 恶意链接 -->
http://www.some.site/page.html?default=<script>alert(document.cookie)</script>
Cross Site Request Forgery (CSRF)
跨站请求伪造,利用用户未登出的 Session
执行非法操作。防御方法是为每个请求生成唯一 Token
,校验通过再执行操作。
Example
假如以下请求是某银行的转账接口。攻击者可以构造恶意链接更改目标账户和金额,利用钓鱼邮件等形式诱导用户点击,从而实现非法目的。
GET http://bank.com/transfer.do?acct=BOB&amount=100 HTTP/1.1
即使是非 GET 方法,也可以在钓鱼页面通过 JS 发送。
PUT http://bank.com/transfer.do HTTP/1.1
{ "acct":"BOB", "amount":100 }
<!-- 现代浏览器已经不允许未经服务器允许的 CORS 请求 -->
<script>
function put() {
var x = new XMLHttpRequest();
x.open("PUT","http://bank.com/transfer.do",true);
x.setRequestHeader("Content-Type", "application/json");
x.send(JSON.stringify({"acct":"BOB", "amount":100}));
}
</script>
<body onload="put()">
Structured Query Language Injection (SQL Injection)
SQL 注入攻击。利用服务端对 SQL 参数的 弱校验
,盗取或破坏 数据库
信息。防御方法是加强入参校验。
Example
以下服务端代码如果不对请求参数作校验而直接构造 SQL 执行,则攻击者可以任意拼接执行恶意操作。
String query = "SELECT \* FROM accounts WHERE custID='" + request.getParameter("id") + "'";
例如,攻击者可发送如下请求获取系统所有账户。
http://example.com/app/accountView?id=' or '1'='1
Distributed Denial of Service (DDOS)
分布式拒绝服务。利用庞大僵尸网络对网站发起大量恶意请求,致使服务端资源耗竭,无法为正常用户提供服务。防御关键是 恶意流量
的检测和清洗。
References
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »