首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册

正在浏览:   1 名游客





MySQL Injection Ultimate Tutorial- By BaKo[翻译] [部分]
网站管理员
注册日期:
1970/1/1 8:00
所属群组:
网站管理员
帖子: 7077
等级: 58; EXP: 5
HP : 0 / 1426
MP : 2359 / 209524
离线
MySQL Injection Ultimate Tutorial- By BaKo[翻译] [部分]
Published by admin at 3:35 am under 原创文章 (126 views)
昨天晚上从一点翻译到三点,不过还没翻译好,还是先贴出来吧
MySQL Injection Ultimate Tutorial- By BaKo
sql注入攻击是当今最流行的一种web应用程序攻击模式.与此同时它又是最致命的一种错误,因为它允许远程用户窃取如用户名,信用卡帐户等保密信息.随着数据库技术在大量的服务器上的应用,它便成为了机智的黑客的一种十分有效的破坏手段.sql注入攻击不仅由于黑客显示技术,取乐或者挑战的目标
MySQL Injection Outline (目录)
In Part 1 (this part):
第一部分-数据库信息系统导论
第二部分-注入攻击的步骤

1)如何闭合前面的语句以及如何以及如何结束语句
2)检查magic quotes
3)检查UNION语法是否可用
4)猜解列数
5)构造适合的union语句使不产生错误,并且获得输出的列名
6)判断mysql版本来确定information_schema是否可用
7)得到我们想获得的表名和列名
8)获得我们的数据
In Part 2: (not done yet)
...


在我们开始之前,我们需要了解一些基础性的东西以便我们能全面的领会这篇文章的内容.在这部分之后你将会较全面的了解数据库基础以及他们是如何和用户进行交互的
第一部分:数据库基础
数据库(DB)服务器是用来存储信息的,信息被存储在有组织性的能够快速执行存取等功能的数据库上.
数据库服务器能够拥有多个数据库,可以用作web或者企业内部互联网的信息的存储.下面介绍集中大同小异的数据库类型:
1)1)Mysql
2)MsSQL (Microsoft SQL Server)
3)Oracle
4)Microsoft Access
5)Postgre SQL
等等
在这份指南中我们将讨论MySql数据库
数据库有许多存储有用户信息或者文章等的表组成,同时表又有许多将数据组织成一些类似于用户名,密码,注册日期等类型的列组成.为了更加形象化,请看下图
为了从数据库服务器获得信息,你需要使用SQL-结构化查询语言.这和编程语言是相似的,它有自己的函数,算法和语法.这便于我们检索相关的库,表,列等信息
SQL有它自己的格式来进行检索,如:
SELECT column1,column2 FROM table
这句话的意思是从“table”表里检索出“column1”和“column2”两个列中的所有数据(由于id值并未制定,所以检索出来的将是两个列中的所有数据)
但是如果你只想要其中的两行呢?你需要重新得到所有的行,然后用php语言进行筛选,但是这不是有效的.假如你想要前面两个username和password,你可以这样写
Select column_name FROM table_name limit start,number
column_name是想要检索的列名,如果你想要检索两个列名,那么应改写成column1,column2.table_name是你想要检索的表名,如果你想要从其它的数据库中进行检索你需要写成database.table limit start,number来告诉服务器你想要检索多少行.假如你想要检索前面两行,那么你应该从开始于第一行(以0标识),用数字2来代表二行.即写成"0,2".
如果你想要检索接下来的二行,你需要写成"limit 2,2".如果你想要检索全部四行,则写成"limit 0,4"
对于注射攻击来说,你并不需要知道服务器是如何从php/asp查询中得到数据的,
你只需要找出那列将会在页面中显示出来,这我们在后门会讨论.
现在我们假设你想要得到一个用户(balo123)的密码.在验证登陆信息的系统中你通常会使用如下语句:
Select column_name FROM table_name WHERE column_name = 'Value'
例如,如果你想要从用户表中检索出用户名为"bako123"的用户名的密码,你可以这样写:
Select password FROM users WHERE username = 'bako123'
这将为你找回相对应的用户名的密码.在检索诸如文章,用户信息个人金融信息等方面也是类似的.
如果你想要检索用户名类似于boke的用户如xbako,bakos或者xbakos等,你可以这样写:
Select password FROM users WHERE username LIKE '%bako%'
"%"在这里作为一个通配符,标识在这里会有一段字符串,在上述情况下便表示在bako前后将会有一些字符,这就起到了搜索的作用.
下面我们将讨论最后一点:Magic Quotes.
一些数据库系统采用Magic Quotes--"'"来进行指定字符串,如WHERE username =''.在上面我们是这样做的,WHERE username LIKE '%bako%',引号在这里告诉服务器我们搜索的是%bako%字符串.如果没有引号,服务器不在解释%bako%为字符串,不仅检索将失败,而且脚本也会返回错误,因为%bako%在这里是不恰当的.
Magic Quotes在注射中是不利的,因为它试图将单引号和双引号分别转义成\'和\".
sql服务器将解释\'号为单引号,并且把他认作一个合法的字符串.例如你想要检索用户名为Bako's的用户,如果你这样写:
Select password FROM users WHERE username = 'bako's'
在o和s之间的单引号将结束字符串,编程WHERE username = 'bako',错误也就产生了.因此如果你想要在SQL语句中插入单引号,那么你需要用\这个符号来进行转义,使服务器认为你输入的是一个合法的字符.
数据库服务器转义单引号的另一种方法是将其转义成''(注意这里是两个单引号).还是上面的例子,经过服务器处理后将变成
Select password FROM users WHERE username = 'bako''s'
这将使'bako's这个字符串变成两个字符串即为bako和s,结果s在这里变成了多余的,结果将会返回错误.在某些情况下我们可以绕过,之后我们会讨论.现在如果你已经了解了mysql的一些基本信息,请转到注射部分
第二部分:Injecting to Steal Data
在这部分中,我们将会讨论到myslq环境下的sql注射脚本攻击的每一步.下面请跟我一步一步来.
2.1节:判断注射漏洞


假设你得到了这样一个网址:http://site.com/script.php?id=1,在判断注射前有必要让你了解脚本是如何查询的,语句为:
Select title,data FROM news WHERE id =
这句话将返回相关id值的title和data信息.如果我们在id=1后面加一个单引号那将会怎么样呢?如果脚本过滤了sql关键字或者将id值转换成整型,或者采取了其它的一些预防措施来确保你无权插入sql查询语言,那么我们输入的id值将不能通过,结果将不会返回任何错误,页面还是会正常的加载,或者发出一个类似于"Attack Spotted, Your IP Address has been recorded"的警告.但是,假如脚本没有任何的过滤,并且能完好的插入到查询语句中,那么你将会得到类似于下面的一个错误提示:
"MySQL Syntax Error By '1'' In file script.php On Line 7."
那么你将会知道服务器没有对输入进行过滤来确保无任何的sql语句,也没有确保数据类型为整型.如果你得到了一个错误,那么你可以肯定这个页面存在sql注入漏洞.
不过要提醒的是并不是所有的网站都会返回一长串的错误,很多网站只会返回"INTERNAL ERROR"或者"ERROR"的错误,这样的错误并不会泄露有用的信息.但是你可以比较确定的是它存在注入漏洞.为了确定到底存在注入漏洞否,继续看下一步.如果在下一步中的所有可能性都排除了,那么你很可能碰到的是其它类型的错误.

2.2节:如何闭合前面的语句

开始前先介绍一下"and"的用法.他允许你在查询时只返回and前后两个规则的行,例如:
Select user from users where password = 'pass123'
如果我们想要搜索密码为pass123且eamil为email@m.com的用户,那么我们需要这样写:
Select user from users where password = 'pass123' AND email = 'email@m.com'
这句话要求服务器检索同时满足用户名为pass123和eamil为email@m.com的两个条件.
下面再介绍一下OR.直接给出例子:
Select user from users where password = ‘pass123’ OR email = 'email@m.com'
这句话要求服务器检索出条件满足password = 'pass123'或者
email = 'email@m.com的两个条件中任何一个符合的结果.
现在假设你插入"and 1=1"到任何的语句中,它将载入任何1=1的条件.这对于攻击者来说是一种十分有用的方法,它将帮助我们判断如何闭合前面的语句,并且确定magic quotes模式是否打开.

2008/12/13 21:57
应用扩展 工具箱






可以查看帖子.
不可发帖.
不可回复.
不可编辑自己的帖子.
不可删除自己的帖子.
不可发起投票调查.
不可在投票调查中投票.
不可上传附件.
不可不经审核直接发帖.

[高级搜索]



系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号