最近公司经常有人提Secure Coding, 我也来研究一下脚本攻击的知识.

SQL Injection

关于SQL Injection, 借用一段JK_Rush博客1的一段描述

SQL Injection就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.

首先让我们了解什么时候可能发生SQL Injection.

假设我们在浏览器中输入URL www.sample.com,由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL Injection,当我们输入www.sample.com?testid=23时,我们在URL中传递变量testid,并且提供值为23,由于它是对数据库进行动态查询的请求(其中?testid=23表示数据库查询变量),所以我们可以该URL中嵌入恶意SQL语句.

简单例子

最重要的, 我们需要通过表单或者URL参数进行注入

使用Form进行注入

例如这样一个登陆页面:

假设后台SQL伪代码为:

    select ...
    from user
    where name = ? and password = ? 

正常情况我们会输入合法的账号和密码并提交, 但是Attacker会在输入框中使用各种SQL使得后台的SQL出现异常, 比如:

用户名随意输入

密码输入xxx' or 'a'='a

那么总体SQL就可能被修改为

    select ...
    from user
    where name = 'abcdef' and password = 'xxx' or 'a'='a'

显然上述SQL是绝对成立的, 因此可以顺利进行后方的业务逻辑, 如此Attacker在不知道密码的情况下就可以使用任何用户的身份登录

使用URL参数进行注入

这个相比Form注入要更加简单, 有些页面为了方便直接将必要参数(例如ID等数据)通过URL参数传过去

比如如下这样的页面

可能对应这样的后台SQL

    select ...
    from employer
    where jopid = [URL.jobid]

甚至我们可以输入一些特定的数据库操作语句, 例如我们将URL后方的参数改为

xxx.cfm?jobid=1; delete from employer

那么整体SQL就会变为

select ...
from employer
where jopid = 1; delete from employer;

虽然格式有些混乱但是依然没有运行错误, 结果就是表中所有数据都被意外删除了.

除此之外, 在我们刚开始攻击的时候可能不清楚对应服务器的数据库系统以及后台语言, 但如果没有对错误进行catch而是直接抛给用户的话, 那么Attacker就可以了解到对应配置(数据库系统及服务器系统等), 更加方便其进行攻击.

关于预防SQL Injection

1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双”-“进行转换等.

2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取.

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接.

4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息.

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中.

XSS

参考Wiki的解释2

Cross-site scripting (XSS) is a type of computer security vulnerability typically found in web applications. XSS enables attackers to inject client-side scripts into web pages viewed by other users. A cross-site scripting vulnerability may be used by attackers to bypass access controls such as the same-origin policy. Cross-site scripting carried out on websites accounted for roughly 84% of all security vulnerabilities documented by Symantec as of 2007.[1] Their effect may range from a petty nuisance to a significant security risk, depending on the sensitivity of the data handled by the vulnerable site and the nature of any security mitigation implemented by the site’s owner.

通过上文可以得知, ‘XSS enables attackers to inject client-side scripts into web pages viewed by other users’

目的就是在对应页面注入特定的脚本代码, 这里一般指JS脚本

XSS分为两类: 持久型非持久型, 区别在于是否仅影响本地client page. 对于持久型, 即各种会将用户输入显示出来的页面都可能拥有此漏洞. 例如购物车, 留言板等等.

当然如果要进行攻击那么一定需要让修改持久, 因此我们只提及持久型.

简单例子

在注入的时候不是注入SQL而是输入一段JS

在没有进行验证的情况下我们写入的script会被插入表单提交后的页面里面:

    
The input is [form.input]

那么这里就会变成

    
The input is <scr*pt>alert(3)</scr*pt>

当然这一步骤就如同Helloworld一样, 接下来你可以做更多的事情了.

也有另一个例子

    

我们甚至可以输入"><script>xxx</script><input value=" 来将对应tag截断并注入需要的JS

关于XSS的危害

  1. Attacker可以嵌入任何有危险的代码, 甚至可以include远程服务器的代码
  2. Attacker可以篡改用户的输入, 或者篡改请求将对应数据发送到额外的服务器(给form.onSubmit添加一个AJAX将用户数据发送到到自己服务器等等)
  3. Attacker可以获取其他用户的cookie, 实现跨权限登录

关于预防XSS

  1. 和SQL Injection类似, 永远不要相信用户的输入. 过滤特殊字符, 对不可预料的输入进行编码
  2. 使用HTTP头指定类型
  3. 对于用户
    • 尽可能使用最新版的浏览器, 以保证安全性

参考文献