’or 1=1# 初入SQL注入的万能语句

噢,终于知道CTF里面的那些SQL注入题里面,每题基本都有 id=1’ 这个东西,然后就是一串语句后面加个 #
现在终于理解了。至于这个东西为什么叫万能语句,继续看吧。

注:看懂本篇文章需要SQL的基础,以及基本的编程基础


在介绍之前,先介绍一下我们一般的登陆过程:
输入用户名:“username”
输入密码:“password”

但我们输入完了以后是怎么登陆进去的呢?每个程序都会有一些验证机制。说一种简单的,比如下面这种代码:

<?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>";
       }
?>

这就是一种验证的方式,name就是我们输入的用户名,pwd是我们输入的密码,这两个都是用来保存我们输入的东西的两个变量。

上面的代码就不解释太多了,只讲一个语句:

$sql="select * from users where username='$name' and password='$pwd'";

明显的,如果我们输入的是正确的用户名与密码,肯定就可以登陆进去,错的就不行。但是这个验证机制可以通过SQL语句来构造一个特殊的“字符串”通过验证。

比如我们再用户名中输入 ’or 1=1#,密码随便写。

我们把它带入到上面的那条语句中,就变成了

select * from users where username=’’ or 1=1#’ and password=balabala

我们分析下语义,在SQL语法中 # 是注释符,所以后面的语句都会杯注释掉,那么上面的语句就等价于

select * from users where username=’’ or 1=1

我们知道SQL语句中where相当于判断语句,并且是由 or 连接的,所以 username=’’ 和 1=1 中有一个为真就为真。1=1肯定为真,所以语句又等价于

select * from users

这个语句的作用是爆出表中的所有字段。

也就是说我们用 ‘or 1=1# 这么一个字符串就可以绕开登陆的密码,直接进入程序。当然这仅限于那些可以被注入的程序或者网页噢

猜你喜欢

转载自blog.csdn.net/weixin_41607190/article/details/82818804