’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# 這麼一個字串就可以繞開登陸的密碼,直接進入程式。當然這僅限於那些可以被注入的程式或者網頁噢