仓酷云

标题: PHP编程:使用SQL注入破绽登录后台 [打印本页]

作者: 飘灵儿    时间: 2015-2-3 23:32
标题: PHP编程:使用SQL注入破绽登录后台
你的确对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>
    附上后果图:
  
PHP编程:使用SQL注入破绽登录后台
登录/注册后可看大图

    当用户点击提交按钮的时分,将会把表双数据提交给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),不胜利,则给出友爱提醒信息。
    登录胜利的界面:
  
PHP编程:使用SQL注入破绽登录后台
登录/注册后可看大图

    登录掉败的提醒:
  
PHP编程:使用SQL注入破绽登录后台
登录/注册后可看大图

    到这里,后期任务已做好了,接上去将睁开咱们的重头戏: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给你算算 一加一等于几,然后在浏览器输出,不要觉得幼稚,这的确是跟阿波罗登月一样,你打的是一小段代码,但是对于你的编程之路,可是迈出了一大步啊!兴奋吧?但是不得不再给你泼点冷水,您还是菜鸟一个。
作者: 愤怒的大鸟    时间: 2015-2-4 01:59
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者: 柔情似水    时间: 2015-2-5 16:52
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 若相依    时间: 2015-2-12 23:04
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 海妖    时间: 2015-3-3 10:59
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 乐观    时间: 2015-3-9 04:54
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 蒙在股里    时间: 2015-3-13 01:07
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 第二个灵魂    时间: 2015-3-17 16:08
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 仓酷云    时间: 2015-3-20 21:46
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 金色的骷髅    时间: 2015-3-27 20:09
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者: 再现理想    时间: 2015-3-28 21:57
当然这种网站的会员费就几十块钱。
作者: 谁可相欹    时间: 2015-4-4 02:36
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 再见西城    时间: 2015-4-10 17:34
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 精灵巫婆    时间: 2015-4-15 03:53
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 只想知道    时间: 2015-4-16 00:11
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者: 飘飘悠悠    时间: 2015-4-17 20:40
爱上php,他也会爱上你。
作者: 莫相离    时间: 2015-5-8 16:43
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: admin    时间: 2015-6-28 22:04
当然这种网站的会员费就几十块钱。
作者: 灵魂腐蚀    时间: 2015-7-2 01:59
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 变相怪杰    时间: 2015-7-8 22:22
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 简单生活    时间: 2015-7-15 08:45
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2