浅谈Web安全-SQL注入

简单的说一下我对Web安全的了解,主要是代码注入方面。

SQL注入

简介:

SQL攻击(SQL injection),简称为注入攻击,是发生于应用程序数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。

简单的说,所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。例如:如果用户在用户名文本框中输入 ’ or ‘1’ = ‘1’ or ‘1’ = ‘1,则验证的SQL语句变成: select * from student where username=” or ‘1’ = ‘1’ or ‘1’ = ‘1’ and password=”;SQL语句的where条件永远是成立的,所以验证永远是有效的。

SQL注入过程

作用原理

  • SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)
  • SQL命令对于传入的字符串参数是用单引号字符所包起来。《但连续2个单引号字元,在SQL资料库中,则视为字串中的一个单引号字元》
  • SQL命令中,可以注入注解《连续2个减号字元 – 后的文字为注解,或“/”与“/”所包起来的文字为注解》
  • 因此,如果在组合SQL的命令字符串时,未针对单引号字符作替换处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的SQL语法的作用。

SQL 注入的主要形式:

  1. 直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量。
  2. 间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。
注入的两个条件
  1. 用户能够控制输入;
  2. 程序要执行的代码拼接了用户输入的数据。

常见注入方式

  1. 转义字符处理不当:

  2. 类型处理不当:

  3. 查询语句组装不当

  4. 错误处理不当

  5. 多个提交处理不当

常见的风险

在应用程序中若有下列状况,就有可能应用程序正暴露在SQL Injection的高风险情况下:

- 在应用程序中使用字符串联结方式组合SQL指令。

- 在应用程序链接数据库时使用权限过大的账户(例如很多开发人员都喜欢用最高权限的系统管理员账户(如常见的root,sa等)连接数据库)。

- 在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)

- 太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。

可能造成的损失:

  • 数据表中的数据外泄,例如个人机密数据,账户数据,密码等。
  • 数据结构被黑客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。
  • 数据库服务器被攻击,系统管理员账户被窜改(例如ALTER LOGIN sa WITH PASSWORD=’xxxxxx’)。
  • 获取系统较高权限后,有可能得以在网页加入恶意链接、恶意代码以及XSS等。
  • 经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell “net stop iisadmin”可停止服务器的IIS服务)。
  • 破坏硬盘数据,瘫痪全系统(例如xp_cmdshell “FORMAT C:”)。

避免的方法

  • 在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据访问功能。
  • 在组合SQL字符串时,先针对所传入的参数作字符替换(将单引号字符替换为连续2个单引号字符)。如果使用PHP开发网页程序的话,可以打开PHP的魔术引号(Magic quote)功能(自动将所有的网页传入参数,将单引号字符替换为连续2个单引号字符)。
  • 其他,使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。
  • 更换危险字符,如果可能,拒绝包含以下字符的输入:

  • 验证所有输入,例如限制用户输入的长度,限制用户输入的取值范围,测试输入的大小和数据类型,强制执行适当的限制。这有助于防止有意造成的缓冲区溢出。。
  • 为当前应用建立权限比较小的数据库用户,这样不会导致数据库管理员丢失。
  • 把数据库操作封装成一个Service,对于敏感数据,对于每个客户端的IP,在一定时间内每次只返回一条记录。这样可以避免被拖库。
  • 使用SQL防注入系统。

常见问题

  1. 如果web站点禁止输入单引号字符,是否可以避免SQL注入?

    答:不能,可以使用多种方法对单引号字符进行编码,这样就能将它作为输入来接收,有些SQL注入漏洞不需要使用该字符,但应号不是唯一能用于SQL注入的字符,攻击者还可以使用其他字符,如双竖线(||)和双引号(“).

  2. 选择的语言能否避免SQL注入?

    答:不能,任何编程语言,只要再将输入传递到动态创建的SQL语句之前未经历验证,就容易受到潜在的攻击,除非使用参数化查询和绑定变量。

参考

SQL注入方式-维基百科

MSDN 的 SQL 注入概述

时间: 2024-11-06 11:36:47

浅谈Web安全-SQL注入的相关文章

【架构】浅谈web网站架构演变过程

浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理 阶段一.单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件.此时我们使用一个容器,如tomcat.jetty.jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架如maven+spring+struct+hibernate.maven+spri

浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等 servlet容器处理jsp.1.2.ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器.由于Nginx 超越 Apache 的高性能和稳

浅谈Web自适应

浅谈Web自适应 2016-08-13 前端大全 前端大全 (点击上方公众号,可快速关注我们) 来源:卖烧烤夫斯基 链接:www.cnblogs.com/constantince/p/5708930.html 前言 随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难,适配问题在当下显得越来越突出.记得刚刚开始开发移动端产品的时候向设计MM要了不同屏幕的设计

浅谈.NET编译时注入(C#-->IL)

原文:浅谈.NET编译时注入(C#-->IL) .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台.所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT).JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点.本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入

浅谈WEB安全性(前端向)

相信进来的时候你已经看到alert弹窗,显示的是你cookie信息(为配合博客园要求已删除).单纯地在你的客户端弹出信息只是类似于迫使你在自己的房间脱衣服——没人看得到,自然也不算啥恶意行为.那么如果我把你的信息通过脚本发送到我的服务器保存起来呢?先放心,我不打算这么做,也没那笔闲钱去购置一个服务器来做羞羞的事情,也不希望博客园把我这地盘给封掉了. 如同标题所写的,今天要聊的是WEB安全机制,但这“前端”二字倒是说的狭义了些,安全的问题大部分还是更依赖于后端的过滤和拦截措施,后端的朋友如果感兴趣

[Web安全]SQL注入

Web网站最头痛的就是遭受攻击.Web很脆弱,所以基本的安防工作,我们必须要了解! 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 通过一下的例子更形象的了解SQL注入: 有一个Login画面,在这个Login画面上有两个文本框分别用来输入用户名和密码,当用户点了登录按钮的时候,会对输入的用户名和密码进行验证.验证的SQL语句如下:       select * from student where userna

渗透攻防Web篇-SQL注入攻击初级

不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问,我们真的了解SQL注入吗?看完本篇文章希望能让你更加深刻的认识SQL注入. 注入攻击原理及自己编写注入点 1.1.什么是SQL?SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统.SQL 语句用于取回和更新数据库中的数据.SQL 可与数据库程序协同工作,比如 MS Access.DB

浅谈web前端开发

有部分同学和朋友问到过我相关问题.利用周末我就浅浅地谈谈我对web前端开发的理解和体会,仅仅能浅浅谈谈,高手请自己主动跳过本篇文章. 毕竟我如今经验并非非常足,连project师都算不上,更不用说大牛了.今天也不谈技术.技术非常多人比我掌握得更好,也大同小异.可是每一个人的理解体会是不一样的. 对前端开发的三个整体理解和体会 我对前端开发的整体体会有三: 第一:杂而难,难度甚至超过了一般的后台开发,假设有人认为前端开发简单仅仅能说明他还没有入门. 第二:web前端开发正在向响应式和移动端方向大步

浅谈对宽字节注入的认识

宽字节注入之前看到过,但是没有实战过,后面也没有找到合适的测试环境,今天刚好看到一个关于宽字节注入的ctf题,因此借此来学习下宽字节注入,如果写得不好的地方,烦请各位多多指导,谢谢!本文主要是简单介绍下宽字节注入,以及如何通过手工和工具进行宽字节注入的一个利用,通过本文我主要学习到以下三点: 1.扩展了我对SQL注入进行探测的一个思路! 2.学习了如何使用宽字节探测注入! 3.如何使用sqlmap自动化对宽字节进行注入! 0x01   宽字节注入 这里的宽字节注入是利用mysql的一个特性,my