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

  • Post author:
  • Post category:其他


噢,终于知道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#

这么一个字符串就可以绕开登陆的密码,直接进入程序。当然这仅限于那些可以被注入的程序或者网页噢



版权声明:本文为weixin_41607190原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。