噢,终于知道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#
这么一个字符串就可以绕开登陆的密码,直接进入程序。当然这仅限于那些可以被注入的程序或者网页噢