
Web安全SQL注入
简介:
在开发网站时,出于安全原因常见sql注入语句,您需要过滤从页面传递的字符. 通常,用户可以通过以下界面调用的内容: URL地址栏,登录界面,留言板,搜索框等. 这通常使黑客有机会. 至少,数据会受到威胁,而其他时候服务器会被关闭.
1,SQL注入步骤
a)寻找注入点并构建特殊句子
传入SQL语句的可控制参数分为两类
1. 数字类型,参数不需要用引号引起来,例如? id = 1
2. 对于其他类型,参数必须用引号引起来,例如?名称=“电话”
b)用户构造SQL语句(例如: “或1 = 1#; admin”#(此注入也称为PHP的通用密码,这是已知的用户名,您可以绕过输入密码))说明)
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查询语句,如下所示:
从用户名='marcofly'和密码= md5('test')的用户中选择*
很明显,用户名和密码与我们之前提供的相同,并且我们绝对可以成功登录. 但是,如果我们输入错误的用户名或密码怎么办?显然,我无法登录. 是的,通常是这样,但是对于具有SQL注入漏洞的网站,只要构建了特殊的“字符串”,您仍然可以成功登录.
例如: 在用户名输入框中输入: '或1 = 1#,然后随意输入密码. 此时的综合SQL查询语句为:
从用户名=''或1 = 1#'和密码= 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始终为true,即where子句始终为true,所以在进一步简化sql之后,它等效于以下select语句:
从用户中选择*
是的,此sql语句的目的是检索用户表中的所有字段

上面是输入法,这里是注入法,这种方法也被称为PHP的通用密码
如果我们知道用户名(假设用户名为admin),则可以不使用密码登录
施工说明:
select * from users where username='admin'#' and password=md5('')
等同于
select * from users where username='admin'
这样,您将无法输入密码登录.
会错误地认为您可以不使用用户名登录,从而绕过后台验证并达到注入目的.
还使用了SQL语法的漏洞.
看到它. 构造的SQL语句具有如此可怕的破坏力. 相信看到这一点之后,您就会对SQL注入有了一个合理的理解〜
是的,SQL注入是如此简单. 但是,根据实际情况构造灵活的SQL语句并不是那么容易. 有了基础之后,就可以自己进行探索.
您是否考虑过管理员是否将通过后台登录窗口提交的数据过滤掉以用于特殊字符?在这种情况下,我们的通用用户名'或1 = 1#将不可用. 但这并不意味着我们没有对策. 有必要知道,用户与进行交互的方式不止一种.
当我刚开始学习这种SQL注入时常见sql注入语句,我很困惑,因为我的不是很好学,所以我读了大哥的解释
在我对SQL注入有更直观的理解之前,我已经添加了一些自己的观点.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-187157-1.html
谁叫你们囤货的活该
去不了只能舔屏了