SQL注入攻击华中科技大学计算机学院问题1.什么是SQL注入攻击?2.SQL注入攻击的分类?3.SQL注入攻击的危害?4.常见的SQL注入攻击的过程?5.怎样防止SQL注入攻击?6.我们介绍SQL注入攻击的目的1.什么是SQL注入攻击?不够完整的定义:•脚本注入式攻击,恶意用户输入用来影响被执行的SQL脚本;•从一个数据库获得未经授权的访问和直接检索;利用SQL语法,针对应用程序开发者编程中的漏洞,往应用程序中插入一些SQL语句成分或者SQL语句,从而能够操作不可访问的数据的方法。•通过在应用程序中预先定义好的查询语句结尾加上额外的SQL语句元素,使得数据库服务器执行非授权的查询。1.什么是SQL注入攻击?——一个实例例1:现有的多数网络应用程序,没有充分利用DBMS的身份验证功能,而是在数据库中建立一张表(例如表名为user_table),保存访问应用系统的用户名及其密码,实际访问数据库服务器的只有一个用户。•当使用JSP(或ASP)编写一个简单的验证登录网页程序时,该页面要求用户输入用户名(input_username)和密码(input_password)。•提交后由后台应用程序通过拼接:''select*fromuser_tablewhereusername='''+input_username+'''andpassword='''+input_password+''';''动态生成一个SQL语句。•通过验证结果是否为空来判断用户是否为合法用户。1.什么是SQL注入攻击?——一个实例攻击方法:•在密码框输入:'or'1'='1,在用户名框输入:zhuhong•后台应用程序组装的SQL语句是:select*fromuser_tablewhereusername='zhuhong'andpassword=''or'1'='1';——这个语句的执行结果是什么?讨论:针对本例解决的办法?•更为常见的例子:=41.什么是SQL注入攻击?实质:•在一个有漏洞的网络应用程序中,允许用户输入查询条件,并将查询条件嵌入到SQL请求语句中,发送到与该应用程序相关联的数据库服务器中去执行。•攻击者通过构造一些畸形的输入,实现操作这种请求语句去获取未知的结果。——SQL注入不是数据库或者Web服务器的问题,而是Web应用中的漏洞或者缺陷2.SQL注入攻击的分类?《IntroductiontoSQLInjectionAttacksforOracleDevelopers》将Oracle数据库中的SQL注入攻击分为4类:•SQLManipulation(SQL操纵)•CodeInjection(代码注入)•FunctionCall(函数调用)•BufferOverflows(缓冲区溢出)2.SQL注入攻击的分类?SQLManipulation(SQL操纵)•最常见的一种SQL注入攻击方法。攻击者一般试图通过增加where子句中的条件或者用集合操作符(如UNION、INTERSECTION或MINUS)扩展SQL语句,达到修改SQL语句的目的。例2:selectproduct_namefromall_productswhereproduct_namelike'%chairs%';•攻击者可以让上面的SQL语句变成:selectproduct_namefromall_productswhereproduct_namelike'%chairs'UNIONselectusernameFROMdba_userswhereusernamelike'%';使用UNIONSELECT还要求当前语句和最初的语句查询的信息必须具有相同数据类型,不然就会出错2.SQL注入攻击的分类?CodeInjection(代码注入)•SQL注入攻击者试图向现有的SQL语句中增加额外的SQL语句或者命令。——攻击MicrosoftSQLServer数据库应用程序例:select*fromuserswhereusername='bob'andpassword='mypassword';deleteformuserswhereusername='admin';•在SQL-Server中可能注入成功,但在Oracle中会报错。原因在于SQLServer支持多句执行,而Oracle不允许。2.SQL注入攻击的分类?CodeInjection(代码注入)•Oracle中一些动态执行的匿名存储过程,对于代码注入攻击十分脆弱。例4:在一个Web应用程序中执行的存储过程:BEGINENCRYPT_PASSWORD('bob','mypassword');END;BEGINENCRYPT_PASSWORD('bob','mypassword');DELETEFROMusersWHEREupper(username)=upper('admin');END2.SQL注入攻击的分类?FunctionCall(函数调用)•将数据库函数或者自定义函数插入到一个脆弱的SQL语句中。这些函数调用可以调用操作系统或操作数据库中的数据。如Oracle数据库允许函数作为SQL语句的一部分来执行。例5:SELECTTRANSLATE('userinput','uf','ar')FROMdual;•调用Oracle数据库函数的注入方式如下:SELECTTRANSLATE(''||UTL_HTTP.REQUEST('||'','uf','ar')FROMdual;——改变的SQL语句可以向一个WEB服务器请求一个页面。2.SQL注入攻击的分类?FunctionCall(函数调用)•调用自定义的函数也可以实现SQL注入,如下:SELECTTRANSLATE(''||myappadmin.adduser('admin','newpass')||'','uf','ar')FROMdual;——攻击者可以创建一个新的用户BufferOverflows(缓冲区溢出)•通过缓冲区溢出,实现代码或SQL语句的注入,通常采用的方法是函数调用。3.SQL注入攻击的危害在风险方面,SQL注入攻击对数据库的危害是位居前列的,与缓冲区溢出等漏洞基本相当。•如果要实施缓冲区溢出攻击,攻击者必须首先能绕过站点的防火墙。•一旦网络应用程序有注入漏洞,攻击者就可以直接访问数据库进而能够获得数据库所在的服务器的访问权,因此在某些情况下,SQL注入攻击的风险要高于所有其他漏洞。4.常见的SQL注入攻击的过程假设:•在攻击前,对网络应用程序、数据库类型、表结构等信息都一无所知,这些信息都需要在注入的过程中通过探测获得;•被攻击的网络应用程序存在注入漏洞。过程:•确定注入漏洞识别错误;定位错误;确定注入点•实施注入攻击确定符合SQL语法的注入语句;判断数据库的类型;构造注入利用代码4.常见的SQL注入攻击的过程——确定注入漏洞识别错误——网络应用程序产生的错误缺陷无处不在,检查所有的输入点:.Web表单的域;.URL查询串中的脚本参数;.Cookie中的值或者隐藏的域4.常见的SQL注入攻击的过程——确定注入漏洞识别错误——网络应用程序产生的错误•攻击者首先必须能确立一些与服务器产生的错误相关的提示类型。尽管错误信息本身已被屏蔽,网络应用程序仍然具有能区分正确请求和错误请求的能力,攻击者只需要学习去识别这些提示,寻找相关错误,并确认其是否和SQL相关。•攻击者会首先尝试提交一些无效的请求,并观察应用程序如何处理这些错误,以及如果出现SQL错误会发生什么情况。4.常见的SQL注入攻击的过程——确定注入漏洞识别错误•由Web服务器产生的代码异常(exception),类似于“500:InternalServerError”;•由应用程序代码产生的错误:应用程序考虑到可能会出现一些无效的情况,并分别为之产生了一个特定的错误信息。4.常见的SQL注入攻击的过程——确定注入漏洞例:有两个电子商务的应用程序,都使用studetails.asp的页面,该页面期待获得一个参数StuID,即学号,获取该参数后,从数据库中提取相应的学生详细信息数据,然后对返回的结果进行一些处理。两个应用程序都是通过一个学生列表页面上的链接调用studetails.asp,因此能保证StuID一直都存在且有效。AB认为这样就不会出现问题在对记录进行处理前对参数不做额外的检查.会确认记录的大小若攻击者篡改了StuID,是否会超过0,如果输入了一个在数据表中不存在的是空记录,给出提示学号,数据库就会返回一个空记录。错误:该学生不存在可能会出现异常,产生或隐藏该错误,将页面“500:InternalServerError”。重新定位到学生列表的页面。4.常见的SQL注入攻击的过程——确定注入漏洞定位错误•攻击者试图定位由人为构造的输入而产生的错误信息,使用标准的SQL注入测试技术,独立地测试每个参数:添加一些SQL关键字,如OR,AND;添加一些字符,如“;”,“'”。•任何一个返回错误的参数都有可能存在SQL注入漏洞。•测试的结果是得到一个可疑的参数列表,剔除造成SQL无关的错误的参数。4.常见的SQL注入攻击的过程——确定注入漏洞确定注入点•测试字符串参数的情形:字符串表达式是放在引号中的,因此需要阻断引号;不同的数据库服务器连结字符串的语法不同,MSSQLServer使用符号+,Oracle使用符号||。例6:=zhuhong•测试该参数:先将其替换成一个无效的字符串,然后再替换成一个可能生成正确字符串的表达式SELECT*FROMstudentsWHEREStuName='zhuhong''出错SELECT*FROMstudentsWHEREStuName='zhu'+'hong'结论:参数StuName存在注入漏洞4.常见的SQL注入攻击的过程——确定注入漏洞确定注入点•即使应用程序已经过滤了'和+等字符,攻击者可以在输入时通过把字符转换成URL编码(即字符ASCII码的16进制)绕过检查例7:/mysite/proddetails.asp?ProdID=3+1就等于/mysite/proddetails.asp?ProdID=3%2B1/mysite/proddetails.asp?ProdID=B'+'ook就等于/mysite/proddetails.asp?ProdID=B%27%2B%27ook4.常见的SQL注入攻击的过程——实施注入攻击确定符合SQL语法的注入语句:•技术原理简单;关键是能否成功地突破插入语符号限制并能顺利地结束请求语句;需要进行多次测试难点:(i)通过标准的SELECT…WHERE语句,注入点是WHERE语句的一部分。方法:•仅仅加上OR1=1——简单情形•如何配对插入符号,使之能与前面的已使用的符号,如左括号匹配•被篡改的请求语句可能会导致应用程序产生其他错误。——难以和SQL语句产生的错误相区分4.常见的SQL注入攻击的过程——实施注入攻击难点:(ii)UNIONSELECT注入或存储过程注入,还需要能先顺利地结束整个SQL请求语句,然后才能添加其他攻击者所需要的SQL语句——攻击者可以选择使用SQL注释符号(--)来结束语句例8:登录页面需要输入用户名和密码,并提交SQL请求:•SELECTusername,UserID,passwordFROMusersWHEREusername='user'ANDpassword='pass'用户输入:john'--作为用户名,将会构造出以下WHERE语句:WHEREusername='john'--'ANDpassword='password'•考虑:若程序中使用的是:WHERE(username=‘user’ANDPassword=‘pa