sql注入思路及一般步骤

sql注入基础

step1:找到可疑点,判断能否进行sql注入

查找思路、方法

1、一般是查找登录入口、查找页面或添加页面等用户可以查找或修改数据的地方。
2、查看网页源码,分析网页是否对输入的数据进行了过滤

判断方法

法一:在正确的地址后加单引号’,根据错误提示获取信息
例:http://www.mytest.com/showdetail.asp?id=49 我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:

Microsoft JET Database Engine 错误 ‘80040e14’
字符串的语法错误 在查询表达式 ‘ID=49’’ 中。
/showdetail.asp,行8

从这个错误提示我们能看出下面几点:

  1. 网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。
  2. 程序没有判断客户端提交的数据是否符合程序要求。
  3. 该SQL语句所查询的表中有一名为ID的字段。

法二:1=1、1=2测试法
http://www.mytest.com/showdetail.asp?id=49
http://www.mytest.com/showdetail.asp?id=49 ;and 1=1
http://www.mytest.com/showdetail.asp?id=49 ;and 1=2

可以注入的表现: (原理 是 判断原网址是否对输入信息有过滤)
① 正常显示(这是必然的,不然就是程序有错误了)
② 正常显示,内容基本与①相同
③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、
或显示内容为空(程序加了on error resume next)

不可以注入的表现:
①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。

step2:判断数据库类型

一般是Access和SQLServer两个库,两者区别:Access的系统表[msysobjects]在Web环境下读该表会提示“没有权限”,但,SQLServer的系统表[sysobjects]在Web环境下可正常读取。
法一:服务器IIS提示关闭时
可通过注入
http://www.mytest.com/showdetail.asp?id=49 ;and (select count() from sysobjects)>0
http://www.mytest.com/showdetail.asp?id=49 ;and (select count(
) from msysobjects)>0
若为Access,由于找不到表msysobjects,会提示出错;而如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.mytest.com/showdetail.asp?id= 49是大致相同的
法二:服务器IIS提示未关闭时
由于SQLServer有一个内置变量user,它的值是当前连接的用户名,类型为nvarchar,拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换换数据类型为 int 的列时发生语法错误,而“abc”的值即为用户名,可通过注入http://www.mytest.com/showdetail.asp?id=49 ;and user>0 判断。

step3:根据注入参数类型,在脑海中重构SQL语句的原貌,通过注入sql语句猜表名和字段名(字段名即 列名)

方法:ID=49 And (Select Count() from Admin)>=0 即猜表名为Admin,若猜对则显示的页面与ID=49相同,猜对表名后,将Count()改成Count(字段名),直到猜对

step4:使用SQL语句,得出字段的值

方法:Ascii逐字解码法
例,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度: http://www.mytest.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0
原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8
当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:
id=49 and (select top 1 unicode(substring(username,1,1)) from Admin)>0
同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。

sql注入常用函数

Access:asc(字符) SQLServer:unicode(字符)
作用:返回某字符的ASCII码
Access:chr(数字) SQLServer:nchar(数字)
作用:与asc相反,根据ASCII码返回字符
Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)
作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串
Access:abc(数字) SQLServer:abc (数字)
作用:返回数字的绝对值(在猜解汉字的时候会用到)
Access:A between B And C SQLServer:A between B And C
作用:判断A是否界于B与C之间

中文处理方法

Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变
SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值