本文深入解析SQL注入攻击,包括其步骤、常见手法及实例演示。通过构造特殊的SQL语句,攻击者可以绕过验证,获取数据库敏感信息。文中以一个登录系统的例子,展示了如何利用SQL注入漏洞实现无密码登录,强调了输入数据过滤的重要性。
摘要生成于
,由 DeepSeek-R1 满血版支持,
二)、 构造SQL语句
SQL注入即是指
WEB应用程序
对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的
SQL语句
,在管理员不知情的情况下实现非法操作,以此来实现欺骗
数据库服务器
执行非授权的任意查询,从而进一步得到相应的数据信息。
一
、SQL注入步骤
一)、
寻找注入点,构造特殊的语句
传入SQL语句可控参数分为两类
1
、
数字类型
参数不用被引号括起来,如
?id=1
2、
其他类型
参数要被引号扩起来,如
?name="phone"
二)、
用户构造SQL语句
(如:
'or 1=1#;admin'#
(这个注入又称PHP的万能密码,是已知用户名的情况下,可绕过输入密码)以后再做解释)
1、
将SQL语句发送给DBMS数据库
2、
DBMS收到返回的结果,并将该请求解释成机器代码指令,执行必要得到操作
3、
DBMS接受返回结果,处理后,返回给用户
因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活)
二、SQL注入实例详解
一)、
准备工作
先演示通过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'),'ASei@test.com');
接下来登入界面的代码
<head><title>登录</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head><body ><form action="validate.php" method="post">
<fieldset ><legend>登录</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></tr></table></fieldset></form></body></html>
附上效果图:
当用户点击提交按钮的时候,将会把表单数据提交给validate页面,validate页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是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 >
注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。
登录成功的界面
登录失败的提示:
到这里,前期工作已经做好了,接下来将展开我们的重头戏:SQL注入
二)、
构造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
usrername
=
''
or
1=1
因为
1=1
永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:
select * from users
没错,该sql语句的作用是检索users表中的所有字段
上面是一种输入方法,这里再介绍一种注入的方法,这个方法又称PHP的万能密码
我们再已知用户名的条件下,可以不能密码即可登入,假设用户名:admin
构造语句:
select
*
from
users
where
username
=
'admin'
#
' and password=md5('')
select
*
from
users
where
username
=
'admin'
这样即可不输入密码登入上去的。
数据库就会错认为不用用户名既可以登入,绕过后台的验证,已到达注入的目的,
同样利用了SQL语法的漏洞。
1.输入域的值为数字型,用1=1,1=2法
若满足条件,则存在
SQL
注入
漏洞,程序没有对提交的整型参数的合法性做过滤或判断
2.输入域的值为字符型,用 ’1=1’, ’1=2’ 法
若满足条件,则存在
SQL
注入
漏洞,程序没有对提交的字符型参数的合法性做过滤或判断
3.输入域中的值为搜索型,用’and [查询条件] and ‘%’=’% 等
若满足条件,则存在SQ
下面以绕过某系统登录页面为例,介绍字符串内联
注入
。
场景① 假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在返回值验证通过。这种情况在用户名
输入框
输入’ OR 1 = 1 OR ‘1’ = '1,密码为空,则猜测可构造如下
SQL
语句绕过后台校验登录系统:
SELECT * FROM usertable WHERE
课程目标:讲解
SQL
注入
的原理、特点、危害,
SQL
注入
的攻击手法和My
SQL
注入
的常用函数,讲解相关工具,如何去防御
SQL
注入
。
任务目标:了解
SQL
注入
相关概念,掌握
SQL
注入
攻击手法,了解
SQL
注入
相关工具和防御方法。
A.
SQL
注入
概述
什么是
SQL
注入
所谓
SQL
注入
,就是通过
SQL
命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的
SQL
命令。具体来说,它是利用现有应用程序,将(恶意的)
SQL
命令
注入
到后台数据库引擎执行的能力,它可以通过在Web表单中输入
5、
sql
mapApi的使用
以前
注入
点满大街,一个单引号就可以判断出是否存在
注入
点。但是如今随着各大厂商越来越注重安全,各种过滤,各种waf,将
注入
隐藏的越来越深。那么作为白帽子,该如何判断是否存在
注入
!
这里附上我挖bat各大厂商时用的判断
注入
方法。下一期再分享如何过waf。