在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符。通常,用户可以通过以下接口调用数据库的内容:URL地址栏、登陆界面、留言板、搜索框等。这往往给骇客留下了可乘之机。轻则数据遭到泄露,重则服务器被拿下。
现在,很多网站开发人员知其然而不知其所以然,小弟也是,所以赶紧恶补下,总结如学习内容。希望对初学者能够起到抛砖引玉的作用。
一、SQL注入的步骤
a) 寻找注入点(如:登录界面、留言板等)
b) 用户自己构造SQL语句(如:’ or 1=1#,后面会讲解)
c) 将sql语句发送给数据库管理系统(DBMS)
d) DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作
e) DBMS接受返回的结果,并处理,返回给用户
因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活的话)。
下面,我通过一个实例具体来演示下SQL注入
二、SQL注入实例详解(以上测试均假设服务器未开启magic_quote_gpc)
1) 前期准备工作
先来演示通过SQL注入漏洞,登入后台管理员界面
首先,创建一张试验用的数据表:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL,
`password` varchar(64) NOT NULL,
`email` varchar(64) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
添加一条记录用于测试:
INSERT INTO users (username,password,email)
VALUES('MarcoFly',md5('test'),'marcofly@test.com');
接下来,贴上登录界面的源代码:
<html>
<head>
<title>Sql注入演示</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body >
<form action="validate.php" method="post">
<fieldset >
<legend>Sql注入演示</legend>
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)
代码如下:
<html>
<head>
<title>登录验证</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<?php
$conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");;
mysql_select_db("injection",$conn) or die("您要选择的数据库不存在");
$name=$_POST['username'];
$pwd=$_POST['password'];
$sql="select * from users where username='$name' and password='$pwd'";
$query=mysql_query($sql);
$arr=mysql_fetch_array($query);
if(is_array($arr)){
header("Location:manager.php");
}else{
echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>";
}
?>
</body>
</html>
注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。
代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。
登录成功的界面: 登陆成功;
登录失败的提示: 你输入的用户名或密码不正确!
到这里,前期工作已经做好了,接下来将展开我们的重头戏:SQL注入
2) 构造SQL语句
填好正确的用户名(marcofly)和密码(test)后,点击提交,将会返回给我们“欢迎管理员”的界面。
因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:
select * from users where username='marcofly' and password=md5('test')
很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。
比如:在用户名输入框中输入:’ or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:
select * from users where username='' or 1=1#' and password=md5('')
语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:
select * from users where username='' or 1=1#' and password=md5('')
等价于
select * from users where username='' or 1=1
因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:
select * from users
没错,该sql语句的作用是检索users表中的所有字段
小技巧:如果不知道’ or 1=1#中的单引号的作用,可以自己echo 下sql语句,就一目了然了。
看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~
没错,SQL注入就是这么容易。但是,要根据实际情况构造灵活的sql语句却不是那么容易的。有了基础之后,自己再去慢慢摸索吧。
有没有想过,如果经由后台登录窗口提交的数据都被管理员过滤掉特殊字符之后呢?这样的话,我们的万能用户名’ or 1=1#就无法使用了。但这并不是说我们就毫无对策,要知道用户和数据库打交道的途径不止这一条。
分享到:
相关推荐
### SQL注入攻击实验报告知识点详解 #### 一、实验背景及目的 - **实验背景**:随着互联网技术的发展,Web应用程序越来越广泛地应用于各种场景之中。然而,由于开发者对安全性的忽视,使得许多Web应用程序存在安全...
SQL注入攻击与防御技术白皮书.pdf 本文档主要介绍了SQL注入攻击的原理、方式、危害及防御措施,旨在帮助读者更好地理解和防御这种常见的数据库漏洞攻击方式。 1.SQL注入攻击简介 SQL注入攻击是一种针对数据库的...
SQL注入攻击是一种已经长期存在,但近年来日益增长的安全威胁,《安全技术经典译丛:SQL注入攻击与防御(第2版)》致力于深入探讨SQL注入问题。 《安全技术经典译丛:SQL注入攻击与防御(第2版)》前一版荣获2009...
### SQL注入攻击与防御知识点详解 #### 一、SQL注入概述 SQL注入是一种常见的Web应用程序安全漏洞,攻击者通过在应用程序的输入字段中插入恶意SQL语句,利用这些语句来操控数据库执行非授权操作。这种攻击方式可以...
SQL注入是Internet上最危险、最有名的安全漏洞之一,《SQL注入攻击与防御》是目前唯一一本专门致力于讲解SQL威胁的图书。《SQL注入攻击与防御》作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的...
主要内容: ·发现、确认和自动发现SQL注入漏洞 ·通过SQL注入利用漏洞 ·在代码中发现SQL注入的方法和技巧 ·利用操作系统的漏洞 ·在代码层和平台层防御SQL注入攻击 ·确定是否已经遭到SQL注入攻击
由于Web应用广泛依赖数据库存储和处理数据,所以它们对SQL注入攻击尤为脆弱。 随着Web应用的普及和互联网技术的发展,SQL注入攻击变得越来越复杂和隐蔽。攻击者不断开发出新的攻击工具和技术,对网站管理员和开发...
SQL注入攻击是网络安全领域中一个严重的问题,它利用了应用程序对用户输入数据处理的不当,使得攻击者能够执行恶意的SQL(结构化查询语言)命令,从而获取、修改、删除数据库中的敏感信息,甚至完全控制数据库系统。...
《SQL注入攻击与防御 第2版》是一本深入探讨网络安全领域中SQL注入问题的专业书籍。SQL注入是网络攻击的一种常见手法,它利用了应用程序对用户输入数据处理的不当,允许攻击者通过输入恶意的SQL代码来操纵数据库,...
SQL 注入攻击防御指南 如何发现并防御自动 SQL 注入攻击 研究员开发新的技术来防御 SQL 注入攻击 如何斩断 SQL 注入式攻击的疯狂魔掌? Fuzzing tool 帮助 Oracle DBA 删除 SQL 注入错误 Web 安全...
SQL注入攻击是一种常见的网络安全威胁,它利用了应用程序处理用户输入数据时的不足,使得攻击者能够向数据库发送恶意SQL语句,从而获取、修改、删除敏感数据或控制系统。以下是对SQL注入攻击测试方法的详细介绍: ...
标题《基于MySQL的SQL注入攻击》所涉及的知识点主要围绕SQL注入攻击的原理、防御以及在基于MySQL数据库环境下实施的攻击案例。具体来看,可以分为以下几个方面: 1. SQL注入的定义与工作原理:SQL注入攻击是一种...
SQL注入攻击是一种网络攻击技术,攻击者通过在Web表单输入或URL查询字符串中插入恶意SQL代码片段,试图操纵后端数据库执行非法的数据库操作。这种攻击方式可以用来窃取数据、修改数据库中的数据、执行管理操作(比如...
本文针对SQL注入攻击及其防范措施展开了详细讨论,以下是对文档内容的知识点梳理: 1. SQL注入攻击的定义与原理 SQL注入攻击是一种常见的网络攻击技术,攻击者利用网站应用程序对用户输入数据的合法性判断不足,向...
### 基于MySQL的SQL注入攻击:深入解析与防范策略 #### 一、SQL注入概念及危害 SQL注入(SQL Injection,简称SQLi)是一种常见的网络安全攻击方式,攻击者通过将恶意SQL代码插入到应用程序的输入字段中,利用应用...
### SQL注入攻击原理分析 #### 一、SQL注入概述 SQL注入是一种常见的网络安全攻击方式,攻击者通过在Web应用程序接收的输入数据中插入恶意SQL语句来操纵后端数据库系统,以此达到非法获取数据或者控制数据库的目的...