1. 程式人生 > >’or 1=1# 初入SQL注入的萬能語句

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