揭秘Web黑客3种注入点判断方法
特殊注入点的判断 除了常见的注入点判断方法以外,有些脚本系统过滤了单引号等字符,以达 到简单防止脚本注入的目的,如果遇到这样的情况,恶意攻击者将会用以下的方 法进行测试。 urucode转换:在ns标准中,unicode字符是可以实现其他字符转义的,攻击者可以将URL中需要构造的注入语句转变成umcode字符,再进行提交,以达 到绕过防注入设置的目的。 基本概念解释:什么是unicode? unicode(又称统一码、万国码、单一码)是一种在计算机上使用的字符编 码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨 语言、跨平台进行文本转换、处理的要求。
ASCⅡ码转换:同unicode类似,攻击者在特定的情况下,也可以把输入的 字符串用ASCI1码代替,以达到简单绕过防呼入设置,找到注入点的目的,如u=chr (85),a=chr (97)等。 基本概念解释;什么是ASCⅡ码? ASCII又叫美国信息交换标准代码(American Standard Code for Informatnion Interchange).ASCⅡ码是使用指定的7位或8位二进制敷组合来 表示128或256种可能的字符,用于在不同计算机硬件和软件系统中实现数据 传输标准化。目前在大多数的小型机或全部的个人计算机都使用此码。
判断数据库类型 一般来说,Microsoft Access与Microsatt SQL Server是最常用的数据库服务 器,也是典型的数据库判断的例子,毗它们为倒。尽管以上两者都支持T-SQL标 准,但还有不同之处,而且不同的数据库有不同的攻击方法,攻击者一般都会根 据情况区别对待,进而选择不同的攻击技术。 基本概念解释:什么叫T-SQL? T-SQL是标准SQL程序设计语言的增强版,是用来让应用程序与SQLServer沟通的主要语言。T-SQL提供标准SQL的DDL和DMI。功能,加上延 伸的函数、系统预存程序阻厦程式设计结构,以便让程序设计更有弹性。 通常,攻击者判断数据库类型会使用以下3种方法。
第1种方法:利用数据库服务器的系统变量进行数据库判断 Microsoft SQL Server有user,db_name()等系统变量,利用这些系统值不 仅可以判断出是使用的Microsoft SQL Server数据库,而且可以得到大量有用的信 息。例如,攻击者一r能一般会提交如下的URL,通过页面的错误与正确返回情况, 或者页面中的直接错误信息进行判断。如 http://www.vm888.com//anli. a sp ? ID -1 and u s e r > O 如果在未过滤的脚本系统中,此语句直接被数据库判断为正常语句执行并给 用户进行反馈,恶意攻击者不但可以判断目标系统是否采用Microsoft SQL Server 系统,还可以得到当前连接到数据库的用户名是否存储在“user一中。
第2种方法:利用系统表进行数据库判断 通常,恶意攻击者会用如下两个语句提交给服务器,并通过服务器返回昀不 同结果进行数据库判断: HTTP ; ( /www . carig feng zhe . com/anli . asp ? ID:1 and t s elec t c ount / * from sysobjectsl>O HrrP : //www. cangf eng zha . com/anli . asp ? ID:1 and l select c ount l * frcm msysobjects;>0 从根源上说,之所以攻击者提交这两条URL进行测试,是因为一般情况下, Microsoft Access的系统表是msysobjects,且在默认Web环境下用户是没有访问 权限的,而Microsoft SQL Server的系统袁是sysobjects,在默认Web环境下用户 是有访问权限的。 提变以上两条语句后,若攻击目标数据库是Microsoft SQL Server,并且没有 进行基本的参数过滤,则第一条语句运行结果将会是正常页面,第二条语句结果 则是异常页面。相反,如果目标数据库是Microsoft Access,则两条语句返回结 果都是异常页面。
第3种方法:{通过Micrasofl SQL Server 3个关键系统表进行数据库判断 Sysdatabases系统表:Microsoft SQL Server土的每个数据库在表中占一行, 最初安装Microsoft SQL Server时,sysdatabases包含master、modcl、msdb、mssql 和tempdb数据项。这个表中记录了什么内容呢?此衷保存了所有库名,以及库的ID和一些相关信息,都是非常重要的信息。 一般情况下,恶意攻击者会构造“URL+select+ from master.dbo.sysdatqbases” 的方式,查询出所有的库名。当然,如果得到了想要的结果,就说明此数据库是 Microsoft SQL Server. Sys。bjects系统表;Microsoft SQL Server的每个数据库中都有此系统表,它 存放数据库内创建的所有对象,如默认值、日志、规则、存储过程等。同样,每 个对象在表中占一行。 Syscolumns系统表:该表位于每个数据库中,主要字段有name、id、colid 等,分别是表示字段名称、表ID号、字段ID号- 攻击者会构造“URL+select+ from cangfengzhe.dbo.syscolumna where id=123一,提交后得到cangfenzhe这个库中,表的ID是123的所有宇段列表。 通过以L(tJ3种方法,攻击者可以很方便地判断目标的数据库类型t并为阻 后的有目的性的攻击做好前期的准备。 1.1.3.5判断数据库中的表结构 总的来说,在判断数据库类型以后,对数据庠中具体的表、字段、数据的猜 解或判断方法有很多,大体步骤是:猜解所有数据库名称、猜出库中的每张表名、 分析可能存放用户名与密码的表名、猜出袁中的每个字段名、猜出表中的每条或 者某条数据内容(如管理员账户密码等)。
需要特别说明的是,以上的方法是常规方法,根据攻击者习惯或者注入安全 隐患强度,完全有可能采取其他的攻击方法。我们这里举例的方法是尽量典型, 以便新读者理解。 对判断数据库中的表结构这一步来说,这个步骤相对于第4部分的判断数据 库类型来说,是一个水到渠成的步骤,因为如果目标系统没有做相关的防护,攻 击者利用M。crosofiSQL Server的强大功能,会很快得到完整的数据库表结构。 猜解所有数据库名称一般使用如下的典型语句进行测试: HITP://www.cangfen弘he.com/anLi.asp?iD=l and (select count(+) from master.dbo.sysdatabases where name>l and dbid-6)<>0 我们来简单分析此语句:因为在Microsoft SQL Server中,dbid的值1到5 是系统占用,所以当用户在创建数据库的时候,一定是从dbid 6开始的,这是一 个准确的判断条件。另外,攻击者提交了name>1,一般情况下name字段是一个 字符型的字段,不能将字符型字段和和数字型字段比较,如果比较就会出错- 通过上面的测试语句,anli asp应该会工作异常,那攻击者就可得到第一个数 据库名。同理,把dbid分别改成7,8,9,10,11,12--就可得到所有数据库名。
假设攻击者得到的数据库名是TestDB。 1 1 3 6判断数据库裹中字段的结构 在判断完数据库中表结构以后,根据“数据库一表呻字段一内容”的数据库 存储结构,攻击者会使用特定的方法对字段进行判断。常用方法有两种: 猜解法:所谓猜解,意思是凭借攻击者的个人经验、普通数据库建库人员的 常规习惯等条件,对目标系统中可能存在的字段进行猜解。 一般来说,user、users、member、members. userlist、memberlist. userinfo、 manager. admin. admunustrator. systemuser、systemusers、sysuser、sysusers、 sysaccounts、systemaccounts等都是常用字段。猜解语句如下: HrrP://www.cangfengzhe.com/anlHi.asp?ID=l and(select count( *)from TestDB.dbo 表名)>0 若表名存在,则anli.aspT作正常,否则异常。如此循环,直到猜到存放系 统管理员账号密码的表名。 读取法:所谓读取法,是因为在Microsoft SQL Server申,有一个存放系统核 一山-息J表sysobjects。此表存储一个数据库中的所有表、视图等信息,而且默认 情况下,此表可以通过Web进行访问,也就是说攻击者可以通过构造语句读取此 表中的信息。
基本的实现方法是通过“select+ from cangfengzhe.dbo.sysobjects where xtype= ’U and status>0”这个语句,当“xtype='Uand status>0”条件成立,则代表这是用 户建立的表。继续构造提交,井分析得到的每个用户建立的表及名称,便可以得 到需要的用户名表的名称了。 当然-随着技术的发展,很多更简便的注入方法也随之出现,如果攻击者对 以上的掰种方法感觉比较麻烦,可以采用以下的语句进行简单的判断: 猜表名:And (Selectcount(‘)from表名)(>0 猜列名:And (Select count(列名)from表名)00 或者猜表名:and exists (select+ from表名) 猜列名:and exists(select列名from表名) 如果结果返回正确,那么猜测的表名或列名就是正确的。这里要注意的是, exists不能应用于猜内容上,倒如构造语句“and exists(select len (user) from admuin》3”,这样是不行的。
更多信息来自东方联盟网:http://www.vm888.com
- 11-15不看后悔!程序员防御XSS的无奈
- 11-10揭秘Web黑客3种注入点判断方法
- 11-10黑客Web脚本注入攻击深度剖析
- 10-21全球无线网络面临黑客攻击风险 WiFi曝安全漏洞
- 02-24iPhone再爆安全漏洞 黑客1分钟可盗照片及加密信息
- 02-22互联网金融风险 警示网站漏洞或成“致命点”
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复