LOGI

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」版。查看和发表评论请点击:完整版 »