安全之sql注入攻击

下面给您介绍下sql的漏洞(演示一个登陆的的页面):
<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>
<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'";  
    (亲们,这条sql语句就存在这严重的错误,下面有详细的解决方案)
$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注入常见问题

        首先说一下 ‘OR’ , 大家肯定都知道 ‘或者的意思’ , 那么大家知道 ‘   OR '1' = '1'  ’ 是什么意思吗 ,接下来将演示SQL注入 , 先看一下登录背后的一些sql语句吧 , 向下看 , 这是我编写的一些登录sql语句!

  
填好正确的用户名(tarena)和密码(admin)后,点击提交,将会返回给我们“欢迎管理员”的界面。
  因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:
      select * from users where username='tarena' and password=md5('admin')
  很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有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#)能够登录!看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~
    重点:一定要试试这个sql语句,(不知道 this is sql 结果的人 , 将来肯定吃大亏);
    ·  总结:如果sql语句后添加‘   OR '1' = '1'  ’  将不再比对密码  , 因为 ‘ 1 ’ 永远为真,所以不会再去比对你的密码啦 , 这是的结果就是查到用户名为admin的单条用户信息啦!!!
select * from users where username='admin' or 1=1#' and password=md5('admin123');   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章