宠文网

30天打造专业红客

宠文网 > 现代小说 > 30天打造专业红客

第23章

书籍名:《30天打造专业红客》    作者:翟羽佳
    《30天打造专业红客》章节:第23章,宠文网网友提供全文无弹窗免费在线阅读。!


id=2499  and  1=(select  count(*)  from  admin  where  left(password,10)=administra)  

结果密码是administra  

就这么简单,我只是举个很简单的例子,想大家应该会灵活应用,当然我还会讲多一些方法的

。今天就到这,因为这2天有点事,所以还请大家多多谅解

『第20天』继续说sql  injection

sql  injection也就是昨天说的SQL注入(也可以有其他的翻译,反正我喜欢用注入这个词)

昨天只举了个简单的例子,今天咱们来深入讨论这个吧

SQL  injection可以说是一种漏洞,也可以说成是一种攻击方法,程序中的变量处理不当,对用户提交的数据过滤不足,都可能产生这个漏洞,而攻击原理就是利用用户提交或可修改的数据,把想要的SQL语句插入到系统实际SQL语句中,轻则获得敏感的信息,重则控制服务器。SQL  injection并不紧紧局限在Mssql数据库中,Access、Mysql、Oracle、Sybase都可以进行SQL  injection攻击。  这个昨天有提到但不全面今天我特地再说一遍。

SQL  injection使得攻击者能够利用  Web  应用程序中某些疏于防范的输入机会动态生成特殊的  SQL  指令语句。举一个常见的例子:  

某  Web  网站采用表单来收集访问者的用户名和密码以确认他有足够权限访问某些保密信息,然后该表单被发送到  Web  服务器进行处理。接下来,服务器端的ASP  脚本根据表单提供的信息生成  SQL  指令语句提交到  SQL  服务器,并通过分析  SQL  服务器的返回结果来判断该用户名/密码组合是否有效。  

为了实现这样的功能,Web  程序员可能会设计两个页面:一个  HTML  页面  (Login.htm)  用于登录,另一个ASP  页面  (ExecLogin.asp)  用于验证用户权限(即向数据库查询用户名/密码组合是否存在)。具体代码可能象这样:  

Login.htm  (HTML  页面)  

代码:  Username:  

Password:  

    

ExecLogin.asp  (ASP  页面)  

代码:<%  Dim  p_strUsername,  p_strPassword,  objRS,  strSQL  p_strUsername  =  Request.form("txtUsername")  p_strPassword  =  Request.form("txtPassword")  strSQL  =  "SELECT  *  FROM  tblUsers  "  &  _  "WHERE  Username='"  &  p_strUsername  &  _  "'  and  Password='"  &  p_strPassword  &  "'"  Set  objRS  =  Server.CreateObject("ADODB.Recordset")  objRS.Open  strSQL,  "DSN=..."  If  (objRS.EOF)  Then  Response.Write  "Invalid  login."  Else  Response.Write  "You  are  logged  in  as  "  &  objRS("Username")  End  If  Set  objRS  =  Nothing  %>  

乍一看,ExecLogin.asp  的代码似乎没有任何安全漏洞,因为用户如果不给出有效的用户名/密码组合就无法登录。然而,这段代码偏偏不安全,而且它正是SQL  指令植入式攻击的理想目标。具体而言,设计者把用户的输入直接用于构建SQL  指令,从而使攻击者能够自行决定即将被执行的  SQL  指令。例如:攻击者可能会在表单的用户名或密码栏中输入包含“  or  ”和“=”  等特殊字符。于是,提交给数据库的  SQL  指令就可能是:  

代码:SELECT  *  FROM  tblUsers  WHERE  Username=''  or  ''=''  and  Password  =  ''  or  ''=''  

这样,SQL  服务器将返回  tblUsers  表格中的所有记录,而  ASP  脚本将会因此而误认为攻击者的输入符合  tblUsers  表格中的第一条记录,从而允许攻击者以该用户的名义登入网站。  

SQL  指令植入式攻击还有另一种形式,它发生在  ASP  服务器根据  querystring  参数动态生成网页时。这里有一个例子,此  ASP  页面从  URL  中提取出  querystring  参数中的  ID  值,然后根据  ID  值动态生成后继页面:  

代码:<%  Dim  p_lngID,  objRS,  strSQL  p_lngID  =  Request("ID")  strSQL  =  "SELECT  *  FROM  tblArticles  WHERE  ID="  &  p_lngID  Set  objRS  =  Server.CreateObject("ADODB.Recordset")  objRS.Open  strSQL,  "DSN=..."  If  (Not  objRS.EOF)  Then  Response.Write  objRS("ArticleContent")  Set  objRS  =  Nothing  %>  

在一般情况下,此  ASP  脚本能够显示具有特定  ID  值的文章的内容,而  ID  值是由  URL  中的  querystring  参数指定的。例如:当URL为  http://example/Article.asp?ID=1055  时,ASP  就会根据  ID  为  1055  的文章提供的内容生成页面。  

如同前述登录页面的例子一样,此段代码也向SQL  指令植入式攻击敞开了大门。有些用户(比如我们)可能会把  querystring  中的文章  ID  值偷换为“0  or  1=1”等内容(也就是说,把  URL  换成  http://example/Article.asp?ID=0  or  1=1)  从而诱使  ASP  脚本生成不安全的  SQL  指令如:  

代码:SELECT  *  FROM  tblArticles  WHERE  ID=0  or  1=1  

于是,数据库将会返回所有文章的内容。  

当然了,本例服务器所受的攻击不一定会引起什么严重后果。可是如果我们变本加厉,比如用同样的手段发送  DELETE  等  SQL  指令。这只需要简单地修改前述  URL  中的  querystring  参数就可以了!例如:任何人都可以通过  “http://example/Article.asp?ID=1055;  DELETE  FROM  tblArticles  ”  之类的  URL  来访问  Web  网站。  

但程序毕竟是各种各样的,有些可以通过修改URL数据来提交命令或语句,有些则不行,不能打URL的主意,怎么办呢?通过修改标签内的value的值也可以提交我们构造的语句,SQL  injection是很灵活的技术,但我们的目的只有一个,就是想方设法饶过程序或IDS的检测和处理提交我们构造的有效语句。  

在大多数ASP站点中,我们并不知道其程序代码,*任何扫描器也不可能发现SQL  injection漏洞,这时就要*手工检测了,由于我们执行SQL语句要用到单引号、分号、逗号、冒号和“--”,所以我们就在可修改的URL后加上以上符号,或在表单中的文本框加上这些符号,比如:  

代码:  

http://localhost/show.asp?id=1'  

http://localhost/show.asp?id=1;  

……

通过页面返回的信息,判断是否存在SQL  injection漏洞,只是最简单的通过字符过滤来判断,根据IIS配置不同,返回的信息是不定的,有时显示

Microsoft  OLE  DB  Provider  for  ODBC  Drivers  错误  '80040e21'  

ODBC  驱动程序不支持所需的属性。