吴语恒,田一朵,郜银河
在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符。通常,用户可以通过以下接口调用数据库的内容:url地址栏、登陆界面、留言板、搜索框等。这往往给骇客留下了可乘之机。轻则数据遭到泄露,重则服务器被拿下。
一、sql注入的步骤
a) 寻找注入点(如:登录界面、留言板等)
b) 用户自己构造sql语句(如:' or 1=1#,后面会讲解)
c) 将sql语句发送给数据库管理系统(dbms)
d) dbms接收请求,并将该请求解释成机器代码指令,执行必要的存取操作
e) dbms接受返回的结果,并处理,返回给用户
因为用户构造了特殊的sql语句,必定返回特殊的结果(只要你的sql语句够灵活的话)。
下面,我通过一个实例具体来演示下sql注入
二、sql注入实例详解(以上测试均假设服务器未开启magic_quote_gpc)
1) 前期准备工作
先来演示通过sql注入漏洞,登入后台管理员界面
首先,创建一张试验用的数据表:
`id`int(11) not null auto_increment,
`username`varchar(64) not null,
`password`varchar(64) not null,
`email`varchar(64) not null,
primarykey (`id`),
uniquekey `username` (`username`)
)engine=myisam auto_increment=3 default charset=latin1;
添加一条记录用于测试:
values('marcofly',md5('test'),'marcofly@test.com');
当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是sql漏洞所在)
代码如下:
<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' andpassword='$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>
2) 构造sql语句
填好正确的用户名(marcofly)和密码(test)后,点击提交,将会返回给我们“欢迎管理员”的界面。
因为根据我们提交的用户名和密码被合成到sql查询语句当中之后是这样的:
比如:在用户名输入框中输入:' or 1=1#,密码随便输入,这时候的合成后的sql查询语句为:
语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
php的instanceof和判断闭包Closure操作示例
php数组函数array_push()、array_pop()及array_shift()简单用法示例
yii2.0框架实现上传excel文件后导入到数据库的方法示例
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
网友评论