|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你的确对PHP有兴趣,那么选择教材也是很重要的。 题记:任务需求,得好好补习下关于WEB平安方面的相干常识,故撰此文,权当总结,别无它意。读这篇文章,我假定读者有过写SQL语句的履历,或能看得懂SQL语句
早在02年,国外关于SQL注入破绽的手艺文章已良多,而国际在05年摆布才入手下手的。
现在,谈SQL注入破绽是不是已经是时过境迁,国际大巨细小的网站都已补上破绽。但,百密必有一疏,入侵是偶尔的,但平安相对不是必定的。
前些天,网上传得沸沸扬扬的“拖库”事务给咱们敲响了平安警钟。
在开辟网站的时分,出于平安思索,需求过滤从页面传递过去的字符。凡是,用户可以经由过程以下接口挪用数据库的内容:URL地址栏、上岸界面、留言板、搜刮框等。这常常给骇客留下了无隙可乘。轻则数据遭到泄漏,重则办事器被拿下。
如今,良多网站开辟人员知其但是不知其所以然,小弟也是,所以赶忙恶补下,总结如进修内容。但愿对初学者可以起到抛砖引玉的感化。
1、SQL注入的步调
a) 寻觅注入点(如:登录界面、留言板等)
b) 用户本人机关SQL语句(如:’ or 1=1#,前面会解说)
c) 将sql语句发送给数据库办理体系(DBMS)
d) DBMS吸收恳求,并将该恳求注释成机械代码指令,履行需要的存取操作
e) DBMS承受前往的了局,并处置,前往给用户
由于用户机关了特别的SQL语句,一定前往特别的了局(只需你的SQL语句够天真的话)。
上面,我经由过程一个实例详细来演示下SQL注入
2、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#就没法利用了。但这并非说咱们就毫无对策,要晓得用户和数据库打交道的路子不止这一条。
PHP和HTML混合编程应该不成问题,在这期间,你完全可以让PHP给你算算 一加一等于几,然后在浏览器输出,不要觉得幼稚,这的确是跟阿波罗登月一样,你打的是一小段代码,但是对于你的编程之路,可是迈出了一大步啊!兴奋吧?但是不得不再给你泼点冷水,您还是菜鸟一个。 |
|