|
- Z' f! X+ }# E8 A( o( ]& U3 W& [6 ]
转自CSDN,作者hellochenlu/网易号,云计算那些事互联网的攻击形式千万种,威胁最大的独一份,就是SQL注入了!由于它的危害之大,它也成为了每一个运维工程师为客户部署业务系统前必做的防御问题来了,对接我们的客户大多数技术钻研不是很”深刻“,我们。
& y, c7 a0 e& u) P& S9 K 经常因为跟客户的技术沟通而抓狂!接下来我们可以了解一下关于SQL注入攻击的内容!
0 t: V( r: j+ x8 i$ w 一、什么是SQL注入呢?SQL是结构化查询语言(Structured Query Language)的简称,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统说的直白一些,就是工程师与数据库进行沟通和交流的一种语言 2 ~2 w+ i2 ?7 t
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生注入攻击如果代码使用存储过程,而这些存储过程。 0 M& A: ]# }4 C. @
作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。
, P: `7 U4 O& U! a" @% k 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉最常见的比如:我们上网经常会看到。
& f5 w8 T* v! F8 P. O 一些免费或者超低价格的各大视频网站的会员账户和密码,这些账户和密码怎么来的呢? ' g/ Z: N: T. G! s( A8 }% s
大部分都是通过WEB表单递交查询字符暴出来的大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击二、SQL注入产生原因目标服务器上运行SQL语句以及进行其他方式的攻击,动态生成SQL语句时没有对用户输入的数据进行验证是SQL注入攻击得逞的主要原因。
5 o! l; l4 d+ j6 t1 a) u" R' { 对于Java数据库连接JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。
1 r7 r4 m2 H; y+ Q7 L' [ G 三、SQL注入原理下面我们来说一下SQL注入原理,以使读者对SQL注入攻击有一个感性的认识,至于其他攻击,原理是一致的SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库SQL是结构化查询语言的简称,它是访问数据库的事实标准。 & A) H8 _' v. z( J3 i2 g2 `
SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。
. p6 W) ^8 q6 m* ]/ q0 A 二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。
, O# z1 V6 V6 J 如以直接注入式攻击为例就是在用户输入变量的时候,先用一个分号结束当前的语句然后再插入一个恶意SQL语句即可由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。 " T$ r, m: z* p' t, Q$ z
四.SQL注入攻击的简单示例:如验证用户是否存在的SQL语句为:用户名and pswd=密码如果在用户名字段中输入: or 1=1或是在密码字段中输入 r 1=1将绕过验证,但这种手段只对只对Statement有效,对PreparedStatement无效。 7 K5 p8 ^% A9 }
相对Statement有以下优点: 1 A) g7 Y# l4 c& E: s) n
1.防注入攻击2.多次运行速度快3.防止数据库缓冲区溢出4.代码的可读性可维护性好这四点使得PreparedStatement成为访问数据库的语句对象的首选,缺点是灵活性不够好,有些场合还是必须使用Statement。 . s/ P, X& h' L1 V6 G
五、SQL注入过程?我们再来举个形象的例子~一天,你代表你的老板去银行办理业务你的老板给了你一个信封,上面写着收银员的指示现在,信件内容是:在这张纸上写下A号账户的余额同时将500元从A号账户转到另一个B账户。
* e" e0 Y1 x/ @% ? 签名:Boss出纳员检查你的身份,确认你是相关账户的授权人员,便按照信函中的说明进行操作。 8 F; L+ E0 k% k5 ?! x
结果Boss被“偷了”500元!在这个过程中:你的老板是合法的程序代码;你是将SQL代码传递到数据库的程序代码和数据库驱动程序;信函内容是传递给数据库的SQL代码;小偷是袭击者,俗称“黑客”;出纳员是数据库;
$ V2 \+ x/ {; n! p+ Q 身份标识通常是数据库的登录名和密码。
5 S7 n0 n ^; F. U6 U5 u SQL 注入漏洞已成为互联网最常见也是影响非常广泛的漏洞,那么:六、如何避免1. 采用预编译语句集出纳员在处理信函内容的时候,只处理账户和金额,对转账动作不处理2. 检查数据类型和格式出纳员在处理信函内容的时候,会去查验小偷添加内容的类型和格式,是否符合规定。
# E* U! Q/ U( O a:验证所有输入始终通过测试类型、长度、格式和范围来验证用户输入实现对恶意输入的预防时,请注意应用程序的体系结构和部署方案请注意,设计为在安全环境中运行的程序可能会被复制到不安全的环境中对应用程序接收的数据不做任何有关大小、类型或内容的假设:。 # ?( j2 E" n6 R# ^& z
如果一个用户在需要邮政编码的位置无意中或恶意地输入了一个 10 MB 的 MPEG 文件,应用程序会做出什么反应?如果在文本字段中嵌入了一个 DROP TABLE 语句,应用程序会做出什么反应?
4 Z# d4 g9 O9 l& L A8 m6 {5 i b:使用存储过程来验证用户输入在多层环境中,所有数据都应该在验证之后才允许进入可信区域未通过验证过程的数据应被拒绝,并向前一层返回一个错误c:实现多层验证对无目的的恶意用户采取的预防措施对坚定的攻击者可能无效。
+ ~+ c/ [( P+ l& E; E- p 更好的做法是在用户界面和所有跨信任边界的后续点上验证输入例如,在客户端应用程序中验证数据可以防止简单的脚本注入但是,如果下一层认为其输入已通过验证,则任何可以绕过客户端的恶意用户就可以不受限制地访问系统。
, J4 k4 ~, w( T; O/ L+ D; S 3. 过滤特殊字符出纳员在处理信函内容“将500元从123456号账户转到另一个654321账户”的时候,转译出现问题,即报错只要注入的 SQL 代码语法正确,便无法采用编程方式来检测篡改因此,必须验证所有用户输入,并仔细检查在您所用的服务器中执行构造 SQL 命令的代码。 4 {& o) a, D5 c F
本主题中的以下各部分说明了编写代码的最佳做法绝不串联未验证的用户输入字符串串联是脚本注入的主要输入点在可能据以构造文件名的字段中,不接受下列字符串:AUX、CLOCK$、COM1 到 COM8、CON、CONFIG$、LPT1 到 LPT8、NUL 以及 PRN。
( r& @! {4 U% M5 u 还有,如果可能,拒绝包含以下字符的输入输入字符 在 Transact-SQL 中的含义; 查询分隔符 字符数据字符串分隔符-- 注释分隔符/* ... */ 注释分隔符服务器不对 /* 和 */ 之间的注释进行处理。
1 o/ L2 z z: z! ^ xp_ 用于目录扩展存储过程的名称的开头,如 xp_cmdshell。
$ F- p6 {' B+ G& }! ^% ^ 测试输入的大小和数据类型,强制执行适当的限制这有助于防止有意造成的缓冲区溢出测试字符串变量的内容,只接受所需的值拒绝包含二进制数据、转义序列和注释字符的输入内容这有助于防止脚本注入,防止某些缓冲区溢出攻击。
. Z5 Q3 U9 s' ]* F+ x& K R1 m/ s 使用 XML 文档时,根据数据的架构对输入的所有数据进行验证绝不直接使用用户输入内容来生成 Transact-SQL 语句泾溪石险人兢慎,终岁不闻倾覆人却是平流无石处,时时闻说有沈沦——杜荀鹤《泾溪》声明:我们尊重原创者版权,除确实无法确认作者外,均会注明作者和来源。
; h6 Q. V; e6 h! j1 \2 ^ 转载文章仅供个人学习研究,同时向原创作者表示感谢,若涉及版权问题,请及时联系小编删除!精彩在后面
! @2 K- b- E0 K) M3 T2 S/ Z! w Hi,我是超级盾更多干货,可移步到,微信公众号:超级盾订阅号!精彩与您不见不散!超级盾:从现在开始,我的每一句话都是认真的如果,你被攻击了,别打110、119、120,来这里看着就行截至到目前,超级盾成功抵御史上最大2.47T黑客DDoS攻击,超级盾具有无限防御DDoS、100%防CC的优势。
1 P7 G, s, \. \( ?! n9 }9 B
1 {$ f0 _" p2 f J- l7 y
# g+ y& I) {4 y& V+ K+ d" _3 E8 w5 M+ K4 N' h: B7 o
# g1 ?% B e* n; ?( }+ { |