//连接数据库$coon = mysql_connect('localhost','root','root') or die('Connect Error '.mysql_error());mysql_select_db('sqlinjection',$coon) or die('Datebase Error '.mysql_error());
//构造查询语句$query="SELECT * FROM user WHERE username='".$_GET["username"]."' AND password='".$_GET["password"]."'";echo $query."<br/>";
//执行sql语句$result= mysql_query($query);
//echo $result;
//判断返回数据的数目$rowcount=mysql_num_rows($result);
//判断 如果数量大于1标示登录成功
//echo $rowcount;if($rowcount!=0){echo "OK";}else{echo "ERROR";}?>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>SQL injection test</title></head><body><form class="" action="test.php" method="GET"><input type="test" name="username" value=""><br/><input type="password" name="password" value=""><br/><input type="submit" name="sub" value="Login"></form></body>
</html>

首先我们先看一下测试代码,首先可以看到的是参数并没有进行相关的过滤,肯定会产生注入,但是今天我们讨论的是万能密码的问题。
     关于万能密码我们应该都知道,常见的万能密码包括:

1:"or "a"="a
2: ')or('a'='a
3:or 1=1--
4:'or 1=1--
5:a'or' 1=1--
6:"or 1=1--
7:'or'a'='a
8:"or"="a'='a
9:'or''='
10:'or'='or'
11:1 or '1'='1'=1
12:1 or '1'='1' or 1=1
13: 'OR 1=1%00

通过我们的测试代码可以发现,开发在验证登录的时候,只是将用户输入作为查询条件进行查询,然后mysql_num_rows函数进行判断返回数据的数量,如果返回的数量大于1证明数据库中存在该用户,然后允许登录,正常情况下执行的SQL语句为:

[AppleScript] 纯文本查看 复制代码

?

1

select * from user where username='admin' and password ='admin'

但是当我们提交 【' or '1'='1】时,由于程序并没有对特殊字符进行过滤,将用户输入的直接带入查询,最后执行的SQL语句为:

[AppleScript] 纯文本查看 复制代码

?

1

select * from user where username='admin' and password ='admin' or '1'='1'

这样SQL返回的值始终为1,就成功绕过了程序的验证。

关于修复:

[PHP] 纯文本查看 复制代码

?

1

2

3

4

5

6

7

8

9

$result=mysql_query($sql); //执行语句

  //echo $result;

  $results=mysql_fetch_assoc($result);

  if($results['username'] == $name && $results['password'] == $pass){

    echo "OK";

  }else{

    echo "NO";

  }

  }

以上代码对返回的数据与用户输入数据进行了比较验证,避免了万能密码的产生。

参数化查询如何解决掉了SQL注入

先看一段存在sql注入的代码:

[PHP] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<?php

  //数据库连接

  $mysqli=new mysqli('localhost','root','root','test');

  if ($mysqli->connect_errno) {

    die('ERROR:'.$mysqli->connect_errer);

  }

  //数据库查询操作

  if (!empty($_POST['sub'])) {

    //获取参数

    $user=$_POST['username'];

    $pass=md5($_POST['password']);

    //构造语句

    $sql="SELECT * FROM mysqli_test WHERE username='{$user}' AND password='{$pass}'";

    echo $sql;

    //执行语句

    $result=$mysqli->query($sql);

    //验证登录

    if($result && $result->num_rows>0){

      echo "<br /> OK";

    }else {

      echo "NO";

    }

  }

 ?>

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Login </title>

  </head>

  <body>

    <form action="prepare.php" method="post">

      username:<input type="text" name="username" value=""><br/>

      password:<input type="password" name="password" value=""><br/>

      <input type="submit" name="sub" value="Login">

    </form>

  </body>

</html>

参数没有进行任何过滤 而且查询后没有对数据进行验证,看到这我们应该想到万能密码(http://bbs.ichunqiu.com/thread-10851-1-1.html)
正常的查询如图

我们用万能密码尝试登录,我们可以看到红线之后的所有数据已经被注释掉,只有之前的语句被mysql所执行,同时后边的and 1=1返回永远为1,从而造成万能密码

下面看一下我们修改为预置参数查询后的代码:

[PHP] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

<?php

  //数据库连接

  $mysqli=new mysqli('localhost','root','root','test');

  if ($mysqli->connect_errno) {

    die('ERROR:'.$mysqli->connect_errer);

  }

  //---------------------------------------参数化查询

  if (!empty($_POST['sub'])) {

      //获取参数

      $user=$_POST['username'];

      $pass=md5($_POST['password']);

      //构造语句

      $sql="SELECT * FROM mysqli_test WHERE username=? AND password=?";

      //准备执行sql语句

      $mysqli_stmt=$mysqli->prepare($sql);

      //传递参数

      $mysqli_stmt->bind_param('ss',$user,$pass);

      //执行语句 验证登录

      if ($mysqli_stmt->execute()) {

        //获取结果集 返回行数

        $mysqli_stmt->store_result();

        //验证登录

        if ($mysqli_stmt->num_rows>0) {

          echo "OK";

        }else {

          echo "NO";

        }

      }else {

          //  打印错误

          echo $mysqli_stmt->error;

      }

  }

 ?>

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Login </title>

  </head>

  <body>

    <form action="prepare.php" method="post">

      username:<input type="text" name="username" value=""><br/>

      password:<input type="password" name="password" value=""><br/>

      <input type="submit" name="sub" value="Login">

    </form>

  </body>

</html>

我们正常登录  

我们看一下执行的语句(mysql日志)

我们再试一下万能密码  发现登录并没有成功

我们再看一下执行的语句

我们将将16进制转换一下

--------
我们将参数化查询与普通的查询对比一下

可以看到 参数化查询在真正执行之前会进行数据库预编译 放在缓存里面,当运行时动态地参数传递,即使参数里有敏感字符 数据库也会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令。

扫盲贴-万能密码的原理相关推荐

  1. web安全—万能密码登录(跳过密码验证)

    什么是万能密码登录呢,我们可以理解为绕过密码验证.通过构造语句来直接绕过登录的验证. 这里我们举dvwa的靶场为例子 我们打开靶场,看到一个登录页面,上面显示让我们输入用户密码,由于我们不知道他的账号 ...

  2. SQL手工注入原理万能密码及默认密码登陆后台

    SQL手工注入原理: 下面就是比较笨的方法了==    一个一个试 (* ̄rǒ ̄) 针对于.asp后缀网 + ?id_  在后面加入下面代码,返回正确那就是无注入点,反正就是有注入点 一.什么是SQL ...

  3. 【学术探讨】万能密码原理剖析

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏<网络安全入门到精通& ...

  4. 万能密码为什么能成功

    1.在用户名处输入"admin' or 1=1 -- ",输入任意密码 2.表单成功绕过,登陆成功 万能密码成功的原因: 万能密码的用户名和密码: admin or 1=1 或者1 ...

  5. sql注入之万能密码总结

    万能密码 万能密码原理 原验证登陆语句: SELECT * FROM admin WHERE Username= '".$username."' AND Password= '&q ...

  6. 1039家校通 万能密码绕过 CNVD-2020-31494

    1039家校通 万能密码绕过 CNVD-2020-31494 0X001前言 0X002 漏洞影响 0X003 漏洞原理 0X004 漏洞复现 0X041 空间搜索寻找目标 0X041 万能密码登陆 ...

  7. web后台常用的万能密码

    网站后台万能密码就是在用户名与密码处都写入下列字符,如果知道管理员帐号的话直接添帐号,效果会更好. 例如我们要利用第一条就是: 用户名:"or "a"="a 密 ...

  8. 台达s1变频器参数表_各大品牌变频器万能密码汇总

    西门子品牌 6SE70书本型变频器:设定密码打不开时,将P358和P359中数据改为相同即可. ABB品牌 ACS600变频器:在16.03参数中输入密码"23032",102.0 ...

  9. 新浪博客登录php发,PHP的万能密码登陆

    说实话如果一个网圣元奶粉站的前台都是注入漏洞圣元优博,那么凭经验,万能密圣元优博码进后台的几率基本上优聪百. 可是优聪. 可是有的人说对PHP的站如果是GPC魔术转换开启,就会对特殊符号转义,就彻底杜 ...

  10. 关于dvwa万能密码的问题解决

    本人在freebuf的文章:https://www.freebuf.com/vuls/264584.html 关于dvwa万能密码的问题解决 1.Brute Force下的结果及原因 1.1.结果 图 ...

最新文章

  1. 干货 | 转型人工智能,你需要掌握的八大神经网络
  2. 6/5 补瓷砖,购浴缸
  3. 【Spring】23、ApplicationContext ,ApplicationContextAware,Listener,Event 的关系解读
  4. 【Python基础入门系列】第05天:Python函数
  5. 用ByteArrayOutputStream解决IO流乱码问题
  6. LeetCode-326. Power of Three
  7. Wcf传递的参数实际不为空,但是接收时显示为空。
  8. springboot+jsp小说在线阅读系统-java原创文学网
  9. CareUEyes Pro(电脑防蓝光软件)官方中文版V2.1.0.0 | 超实用电脑护眼软件下载-学生白领必备护眼神器!!
  10. 域名指向 旧域名跳转到新域名
  11. cad中tk什么意思_cad图纸中各种字母是什么意思
  12. 软件测试入门知识,Linux系统基础教程——带你玩转Linux(五)
  13. Modular Arithmetic
  14. SSH 文件操作命令
  15. gpgpu_CPU与GPGPU
  16. 2017年杭州职称计算机培训,2017浙江职称计算机考试报名:杭州职称计算机报名入口...
  17. python中input是什么_Python中input函数的用法是什么?_后端开发
  18. 财路网每日原创推送:那些被滥用的区块链关键词
  19. 第一章 基础 (续 在IIS中寄宿服务)
  20. php读写excel文件

热门文章

  1. java基础面试题84道
  2. C4D插件X-Particles粒子特效(三)
  3. error:LNK2005
  4. java get请求中文_如何解决java中get请求中文乱码的问题
  5. Vmware虚拟机桥接模式设置
  6. 洛谷试炼场——题目单
  7. 《极客与团队》读书记录
  8. linux dmesg带时间戳,linux 时间戳转换/dmesg 时间转换
  9. 马斯克、脑机交互与人机融合
  10. java前后端分离,前端部署的方式