2013年5月31日 星期五

VBA導論

Blog - Break Security

http://www.breaksec.com/?page_id=6002

starfoxlogo
29May2013

How I Hacked PayPal Users Reports System

29 May 2013,
 3
How I Hacked PayPal Users Reports System,     Hi Today, I’m going to tell you about how I was able to hack the [...]


16May2013

Spoof Facebook Apps”, Attack / Solution for Owner App

16 May 2013,
 8
Hi, For this post, I’ll be talking about how I spoof the content of any app on Facebook. I’m also going to talk about [...]


4May2013

How I Changed Your Facebook Password, CSRF PoC Video

4 May 2013,
 5
Hi, I Just wanted to share with you one of the highest CSRF bug I found during Facebook Bug Bounty Program PoC Video (Fixed [...]


2May2013

How I Hacked Instagram Accounts

2 May 2013,
 25
How I Hacked Instagram Accounts For this post, I’m going to show how I was able to hack into Instagram accounts via OAuth vulnerabilities [...]


17April2013

Stored XSS In Facebook Chat, Check In, Facebook Messenger

17 April 2013,
 15
A Few of My Favorite Facebook Stored XSS Findings Today, I’m going to share a few of my favorite Stored XSS Findings in Facebook [...]


1 2 3 

QSecurity月度安全评论(2013年4月):史上最大DDoS攻击、思科存漏洞、TP-Link路由器后门、Apple ID安全问题

http://www.infoq.com/cn/news/2013/05/qsecurity-monthly-report

QSecurity月度安全评论本月起恢复发布,InfoQ中文站联合360网站安全检测团队对互联网相关的安全问题进行月度复盘,旨在提高开发人员的安全意识,减少安全事故的发生。本期的安全事件如下:
1. 300Gbps!Spamhaus创造DDoS历史
3月26日,对Spamhaus的DDoS攻击流量超过了300Gbps!攻击流量吞没了整个网站。诸如Boing Boing和Register这样的媒体纷纷宣布互联网历史上最大规模DDoS攻击的到来。在接受BBC的采访时,Spamhuas的执行官Linford说,他们的团队正在竭尽全力恢复系统上线。“我们已经被连续打了一个礼拜了,”Linford说,“但是我们始终站在那里,没有倒下。你不能想象我们的工程师为此付出了多大的努力——类似这样的进攻可以吞噬掉所有的一切”。

2. 思科被指存技术漏洞 严重威胁我国金融信息安全
据哥伦比亚大学研究人员发布的调查报告显示,多年来思科始终存在网络安全隐患。比如其VoIP电话(网络电话)存在严重安全漏洞,黑客通过植入恶意代码便可窃取到思科VoIP电话的通话内容。对此,思科给出的安全防护解释也未能让研究人员满意,而这种难以克服的漏洞会给网络安全带来困扰。 从金融业情况来看,中国四大银行及各城市商业银行的数据中心全部采用思科设备,思科所占有的中国金融行业市场份额竟然高达70%以上。这一触目惊心的数据背后,在反思之余更显示出中国金融业信息安全的脆弱现状。
3. Facebook爆出新的OAuth漏洞
还记得上次Facebook的OAuth漏洞吗?该漏洞允许攻击者不需要与受害者有任何互动即可劫持账户。之后,Facebook安全团队修复了这个漏洞。 最近,Goldshlager绕过Facebook的补丁,再次攻破Facebook的OAuth的机制。他在一篇博客中记录了完整的入侵Facebook的过程。
4. TP-link被曝路由器存在后门漏洞
近日,TP-LINK路由器部分型号被曝存在一个有可能被攻击者利用,并且会对用户造成严重威胁的后门漏洞。建议采取紧急防护措施:1.关闭WAN管理接口,例如将WAN口远端管理IP设置为0.0.0.0,或者可信任IP;2.在LAN口设置中,只允许可信任的MAC地址访问管理界面。
5. 第三方公司追踪用户cookie收集用户隐私
第三方公司通过加放代码窃取用户cookie。一般情况下,用户电脑中的cookie只会被放置它的网站所读取,但这些第三方公司偷偷进行跟踪用户,通过各种手段获取的用户详细信息,更精准地投放广告。
6. 微软部分Xbox Live”高调”员工的账号遭遇黑客访问
微软3月22日确认,不少在职和前Xbox Live“高调”员工的账号遭遇了黑客的登陆访问。这是个黑客组织,先前也涉及了著名的“Swatting”DoS攻击事件,不久之前该组织还以欺骗SWAT特别行动小组的方式令警方作出对假报案的响应闯入记者Brian Krebs家中。微软在致媒体的声明中说:“我们意识到一组黑客正利用某些社会工程技术危害到部分高级Xbox LIVE账号,这些账号是在职和前职员持有的。”
7. Apple ID 可绕过安全提示问题直接修改密码漏洞
据The Verge网站报道,Apple ID登陆系统被曝有重大安全漏洞,任何拥有用户邮箱地址和生日信息的攻击者都可以重置Apple ID的密码。当然,那些开启两步认证的用户不会受到该漏洞的影响。The Verge网站已经获得了很详细的攻击步骤,只需更改URL地址即可完成。因为安全问题,具体的实施方法没有被公布出来。苹果也没有对这篇报道做出回应。担心自己Apple ID安全问题的用户可以登陆后更改生日信息。两步认证系统昨天正式推出,该系统能大大增加安全性。
8. 360网站检测团队发现OWASP开源WAF NAXSI绕过漏洞
该问题出现在naxsi_src/naxsi_utils.c代码中naxsi_unescape_uri函数,虽然NAXSI对nginx原代码做过处理仍然存在绕过漏洞。
9. 黑客利用Evernote账号控制服务器
黑客使用流行的笔记应用程序Evernote进行命令控制服务器,下达指令使感染的计算机安装恶意软件。TrendMicro发现恶意软件检测为“BKDR_VERNOT.A”试图使用Evernote命令与控制服务器进行通信。恶意软件通过一个可执行文件,安装恶意软件提供的动态链接库。然后安装程序捆绑成一个合法的正在运行的DLL进程。安装完成后,BKDR_VERNOT.A 会提供命令选项,如下载,执行和几种重命名文件的后门。然后,它从受感染的系统中收集信息,包括:其操作系统,时区,用户名,计算机名,登入记录及用户群组等详细信息。
10. 黑客用密码“root”入侵数十万台终端制作普查报告
2012年3月到12月,“卡尔纳”僵尸网络所控制的互联网终端的活跃程度,这42万台设备均遭遇同一名黑客非法侵入。此刻,在地球的某个角落,一名黑客的情绪有些不稳定。他既自豪又担忧,因为他做了件前无古人的事情,但却是非法的。2012年3月至12月,这名匿名的黑客用自己的方式非法入侵数十万台电脑,获取了世界互联网的抽样数据,并于近期发表一份结论报告。
11. 日本导航网站goo被黑客攻破10万会员账号泄露
4月9日消息,据国外媒体报道,日本导航网站goo,上周三传出遭黑客攻击的事件。黑客尝试以违法手段破解会员密码,被害情形在调查期间中不断扩大,截至4月4日已证实约10万会员帐号密码被破解,信用卡、银行帐户与个人资料都有泄露疑虑。经分析攻击log后发现,黑客主要使用字典攻击(dictionary attack)方式破解会员帐号密码,分批测试成对的帐号密码能否登入,如果不能就立刻送出下一组持续测试。之所以判定帐号密码不是从goo直接流出,是因为一部分文字中使用了goo服务中不允许使用的字符,证明黑客是利用从某处得来的其他网站帐号密码尝试登入goo。
12. 全球域名去年底达到2.52亿个
北京时间4月9日消息,根据最近Verisign公布的报告,2012年四季度全球域名注册量超2.5亿,总计全球达2.52亿个。“.com”域名占了大多数。到12月底时“.com”域名达1.062亿,“.net”域名达1490万台。在新注册的域名中“.com”和“.net”也占了大多数。2012年四季度,“.com”和“.net”注册量达800万,上年同期为790万。“.com”和“.net”网站中约21%是单页网站,15%只是注册了但没有指向网页。除了“.com”和“.net”两大域名,国家顶级域名量环比增长5%,同比增长21.6%,总量达1.102亿。中国国家级域名占了增长的大多数。中国已经是第七大顶级域名。前七大顶级域名分别为:.com、.de(德国)、.net、.tk(南太平洋岛国托克劳Tokelau)、.uk(英国)、.org.cn(中国)、.info、.nl(荷兰)、.ru(俄罗斯)。最让人惊奇的可能是.tk域名,该域名可以自由免费注册,它被钓鱼网站大量利用。
13. 我国将立法禁止电信互联网企业泄露用户信息
日前,根据工信部的公告,我国将出台相关法规,禁止电信和互联网企业泄露用户信息,这样的话,困扰广大用户的个人信息泄露问题有望逐步解决,相关责任人将可得到严惩。
14. 黑客通过Java 0day漏洞偷盗比特币
美国东部时间4月10日晚上,一位名为Mt.Gox的用户被人利用Java漏洞盗走了34比特币,虽然数量不多,但它的价值也相当于5千美元(根据目前的比特币美元兑换率)。他在比特币论坛上描述了整个过程,这种入侵方法非常典型:有人首先在聊天窗口发布了链接,声称 Mt.Gox将宣布交易litecoins(另一种受欢迎的数字货币),这个链接当然是恶意链接,它先载入Java applet,利用Java 0day漏洞进行跨站脚本注入攻击,它会下载恶意程序(AdobeUpdate-Setup1.84.exe)然后自动执行,整个攻击专为Mt.Gox(最大的比特币交易平台)用户定制,它记录了所有的密码,登录进比特币钱包,窃取比特币
15. 黑客演示通过Android手机遥控劫持飞机
飞行员Hugo Teso本身即精通IT技术也是一名飞行员,他将自己的这两种兴趣结合到了一起,结果他发现航空安全系统和通信协议的安全非常让人担忧。他在Hack In The Box Conference 这个会议中演示了如何使用一台Android设备成功遥控劫持一架飞机。

比特幣未來如何?賺了錢再說

http://big5.ycwb.com/money/2013-05/19/content_4465181.htm

比特幣是什麼?

比特幣是一種由開源軟件產生的電子貨幣,不依靠特定貨幣機構發行,而是通過特定算法計算產生,限量生產2100萬個,無法通過人為制造大量生產,因此有人認為比特幣能夠保值。隨此而產生了比特幣交易平台,在三年間比特幣價值翻了上千倍,目前1個比特幣可以兌換約688元人民幣,這個價格24小時都在變化中。

比特幣日線圖

比特幣(Bitcoin)2010年首次公開交易時,才0.03美元,但如今身價暴漲了數千倍,達到上百美元。近年來,比特幣逐漸成為全球最熱門的投資產品之一。日前記者發現,淘寶上已有店家表示接受比特幣支付。從原來最初是極客們的玩具,到後來展現貨幣特性,再到如今逐漸被人們炒賣,它的未來是什麼,仍然很少人能準確定位。但盡管如此,隨著比特幣的走熱,圍繞比特幣而出現的產業鏈已經逐漸成型。

目前比特幣支付多為噱頭

近日,新快報記者在淘寶搜索中發現,包含“比特幣”關鍵詞的1000多件寶貝中,與“比特幣付款”和“比特幣支付”相關的實物寶貝共有165件,產品種類五花八門,包括數碼產品、食品、服裝、家居用品、化妝品等數十個種類,有iPhone、手機殼、書包、鞋、牛仔褲、堅果等,都接受除人民幣支付外的第二種方式———比特幣支付。

“支持比特幣付款為給消費者方便,”一位線上商城的賣家告訴新快報記者,但目前用比特幣購物的人其實很少。他介紹,如果用比特幣付款,按當日的比特幣與人民幣的匯率折算後,賣家直接將相應的比特幣金額打入店家的電子錢包,然後由店家發貨。“當然,前提是你要相信我會發貨,才會支付比特幣,”店主坦言,目前使用比特幣支付沒有可靠的第三方平台保證,這筆生意確是要建立在雙方互信的基礎上。

在北京的創業咖啡館車庫咖啡,是比特幣愛好者的聚集地之一,也已接受比特幣支付。雖然反響不錯,但該咖啡館相關負責人黃芬坦言,支持比特幣付款只是個巧合。“店內常客有比特幣愛好者,第一次有人來問能不能用比特幣付款時,比特幣愛好者說他們願意收”,黃芬表示,咖啡館收取的比特幣都直接轉入一個比特幣愛好者的電子錢包,他會馬上支付現金給店里,咖啡館不承擔任何風險。“比特幣敏感、復雜,事實上我們店不存比特幣,也沒有電子錢包。”

雅安地震後,壹基金收到二百余個比特幣的捐贈,總額約22萬元。壹基金傳播部姚先生表示,捐贈具體操作是愛好者們匯集齊比特幣後,統一兌換成人民幣再捐贈給壹基金。壹基金客服工作人員說,目前壹基金也沒有電子錢包可直接接受比特幣捐贈。

2

能否成為流通貨幣難定論

前電子現金系統顧問和數字貨幣先驅斯蒂芬•布蘭斯認為,比特幣的基礎結構就像“金字塔式傳銷”,他說︰“我認為最大的難題是信任問題,它沒有任何支撐,不是法定貨幣。”

2008年比特幣之父中本聰公開比特幣構想時,正當政府和銀行信用降入谷底,經濟管理體系遭到各方質疑。他表示,比特幣由于沒有中央發行機構,不受政治和金融的保障,依賴于獨特的算法,所有的一切都是基于參與者,這便解決了人們對機構不信任的問題。而如今,可以解決信任問題的比特幣卻同時也接受著另一種信任問題的考驗。

“比特幣成為能夠被普遍使用的支付貨幣,還有很長的路要走。”比特幣經濟圈中的資深人物李笑來說,比特幣從一個開源軟件開始至今不過短短4年,仍有很多不足,“現在還看不出究竟什麼時候能被普遍使用———這場社會實驗不失敗就已經謝天謝地了。”

事實上,比特幣因被控制了極限數量,屬于通縮貨幣,比特幣的量是無法增加的,當消費規模增大,必然會導致單價上升。理論上會越來越值錢的比特幣,更不會有人願意輕易的將其支付出去。

3

持幣者多看中其增值可能

李笑來坦言,收購比特幣的人無論是國內的,還是國外的,他們之中的絕大多數是投機者,看中比特幣瘋狂增值的可能性。

2010年交易時,比特幣價值0.03美元,到今天身價117美元,三年間翻了近3900倍,增速趕超任何投資產品,瘋狂的利益也讓投資者們趨之若鶩。仍在溫州讀大學的王磊今年初接觸比特幣,3月時加入投資大軍,他說︰“我現在同時加了七八個群,每天都跟人分析比特幣走勢。”他還開通了一個名為“比特幣分析”的微博,吸引不少愛好者。據王磊透露,4月開始國內玩比特幣的人暴增,大部分都是為投資賺快錢,“有些大戶幾百萬地買,一天至少賺3%”,手里有比特幣的人都認為還會漲。

按照中本聰的設計,比特幣限量2100萬個,以目前“挖礦”生產的速度計算,預計2140年所有的比特幣將挖掘完畢。圈內人推測,在此之前比特幣的價值仍會有很大上升空間。

不過,國內最大的比特幣交易平台———比特幣中國交易平台已經作出了風險提示︰“比特幣的交易有極高的風險,它沒有像中國股市那樣的漲跌停限制,同時交易是24小時開放的。比特幣由于籌碼較少,價格易受到莊家控制,有可能出現一天價格漲幾倍的情況,同時也可能出現一天內價格跌去一半的情況!入市須謹慎,一定注意控制好風險!”

據比特幣交易平台數據顯示,今年初時一個比特幣兌換人民幣100元至200元,3月開始比特幣身價飆升,兩起兩落,從1550元高位,急走而下至432元,反彈後曾回到918元,現在又暴跌回688元左右。李笑來認為,在未來的價格動蕩之中,他們中的絕大部分,可能會像之前的絕大部分投機者一樣,有資本有能力挺到最後的,少之又少。

投機性背離設計者初衷

“比特幣現狀已違背了中本聰的初衷。”一位持續關注比特幣的程序員分析,中本聰設計比特幣的重點開始很明確———保值的硬通貨︰依靠巧妙的算法,不需要政治和金融的保障,已限定的發行量保證不會出現通脹悲劇。但投機的出現,導致比特幣價格極其不穩定。

2010年12月時,有比特幣經濟圈內人意圖勸說維基解密接受比特幣捐贈,中本聰在論壇里公開反對︰“我呼吁維基解密不要接受比特幣,它還是一個萌芽階段的小型測試社區。在這個階段,如果不能妥善處理,只會毀了比特幣。”當年12月12日中本聰在論壇上發布最後一個關于比特幣軟件更新帖子後,徹底消失在公眾的視線中。

李笑來表示,他目前公開持有大量比特幣,從未大量拋售,他認為比特幣是保值的硬通貨,“比特幣的應用場景,早晚會像今天的黃金一樣”。

如何使用比特幣?

小黎是個網店店主,他店內寶貝“支持比特幣付款”;小倩來到小黎店里要用比特幣付款買東西。

電子錢包和地址

小黎和小倩的電子錢包都存在電腦上

電子錢包提供路徑,通到幾個不同的地址的文件

一個地址就是一串字母與數字,如︰1QCXRuoxWo5bYa9NxhaVBArBQYHatHJrU3

每一個地址都存有單獨一定量的比特幣

創建一個新的地址

小黎創建了一個新地址以接收小倩 支付的比特幣

付款

密鑰的使用︰小黎創建一個新的地址後,會產生一對密鑰︰公鑰和私鑰。當你使用只有自己知道的私鑰有交易,大眾就可以通過公鑰來證實這條交易。小黎用新的比特幣地址公開獨有的公鑰,相應的私鑰存在他自己的錢包里面。公鑰允許任何人來證實由私鑰發布的信息是否有效。

小倩通過比特幣客戶端轉一定量的比特幣到小黎的地址。

私人密鑰

小倩的電子錢包擁有她每一個地址的私鑰,比特幣客戶端通過小倩的私鑰確認她的轉賬交易要求。

網上任何人現在都可以用公鑰來證實這個交易要求確實是來自于合法的賬戶擁有者。

公共密鑰

比特幣的產生︰小林、小雲、小陳是比特幣礦工

他們用電腦將過去10分鐘的交易捆綁放入一個新的“礦池”。

礦工的電腦是用來計算密碼散列函數的。每成功完成一個“礦池”內的數列函數,就可以得到50個新生產的比特幣。

(圖片來源︰JOSHUA J.ROMERO,BRANDON PALACIO&KARLSSONWILKER INC.)

這些人已經在賺錢了!

挖礦機售價高達上萬元

現階段,獲得比特幣的方法有兩種,一種是在交易平台上支付美元、人民幣等購買比特幣;另一種是通過用自己的電腦“挖礦”來獲取。其中後者因為不用付出真金白銀卻多了收獲財富的機會,因此熱衷者們對此樂此不疲。

所謂“挖礦”,是用電腦搜尋64位數字,通過反復解密,並與其他采礦者相互競爭,為比特幣網絡提供所需的數據。如果用戶的電腦成功地創造出一組數字,那麼就將會獲得比特幣的獎勵。可以說,誰的個人電腦的運算能力貢獻越高,誰就越有機會獲新產生的比特幣,因此專業的“礦機”越來越多出現。

有極客告訴記者,所謂“礦機”,其實就是砍掉了一切不需要的功能、能以最大功率來計算的電腦裸機,外形相當粗獷。

記者從淘寶上發現,已有各種專業比特幣挖礦機出售,按照運算速度不同,售價從幾百元到幾萬元不等。如一種8核礦機,售價高達13800元。隨著越來越多人投身到“挖礦”行列,制造挖礦機的人也大賺一把。據央視報道,一位網名叫南瓜張的博士改裝了一台運算速度遠遠超過一般顯卡挖礦機的機器。今年以來他已賣了600台,按當時4萬元人民幣一台計算,已經賺了2400萬元人民幣。

交易平台已日進斗金

目前,全球比較大的比特幣交易平台有Mt.Gox,只需要完成注冊,就可以在這個平台上自由買入/賣出比特幣。Mt.Gox總部位于東京,由兩名法國人運作,處理了全球約80%的比特幣-美元交易。在中國,目前比較活躍的比特幣交易平台有“btcchina.com(比特幣中國交易平台)”以及“fxbtc.com”。

記者發現,除了挖礦機以外,比特幣交易網站也是日進斗金。

根據比特中國交易平台的費率說明,其平台上買入和賣出交易手續費費率分別為0.6%,目前為推廣優惠期,費率為0.3%。同時,支持財付通和支付寶的充值和提現服務。其中,財付通和支付寶手動充值費率為0.5%而財付通手動提現費率為0.5%;支付寶手動提現費率1%。

截至昨日上午9:15,比特中國交易平台最新報價顯示,每個比特幣兌換人民幣688元,成交量(24小時成交量)為3340.239個,按0.3%手續費計算,在24小時以內該平台的交易手續費收入將近69萬元人民幣。

“就像我們常說的‘雁過拔毛’一樣,隨著比特幣越來越向社會流通,比特幣第三方支付平台的發展前景應該被看好的。而且從最本質的意義上來看,一切促進流通(無論是信息,還是金錢)的服務,都是有基礎本質意義的。”李笑來說。

值得一提的是,比特幣交易平台已經成功吸引投資機構的關注。比特幣兌換網站Coinbase近日獲得了500萬美元的A輪融資,由國際頂級創業投資基金Union Square 領投,成為第一個完成A輪融資的比特幣公司。據悉,該公司從去年年底開始快速發展,目前注冊用戶13萬,平均日交易比特幣已經接近1萬個,日交易額接近100萬美元,4月份交易額超過1500萬美元。

比特基金正在籌建中

雖然目前認知比特幣的人依然很少,但記者了解到,比特幣的出現已成為一些投資人尋求資產增值的渠道之一。

李笑來透露,他正籌建一個比特基金,第一期資金規模暫定為2000萬元人民幣。“這個基金的投資方向很簡單,就是一切優秀團隊在做的與比特幣相關的項目。為了保證投資人的利益,我們暫時無法公開我們正在做的具體事情。”李笑來說,這個基金絕對不參與比特幣兌換投機相關的業務以及與山寨幣相關的任何項目,也不參與與當地法律法規相沖突的業務。李笑來坦言,這個基金項目鎖定期四年,相對較長,風險較大。

安全

黑客攻擊可能讓你“一無所有”

理論上講,只要全球網絡不癱瘓,你的賬戶不被木馬攻破,比特幣的工作原理本身無懈可擊。原因是,比特幣的設計原理等于給了兩把加密鑰匙,行內通常稱之為“公鑰”和“密鑰”(見圖)。

不過,這些設計最大的安全隱患來自于黑客的攻擊。2011年6月初,黑客攻破Dropbox獲取了大量的用戶賬號,並獲得了用戶存在Dropbox的比特幣錢包。當月19日Mt.Gox被黑客攻破,6萬個賬號丟失,生成大量兌換價為0.01美元/BTC的訂單。李笑來存在Mt.Gox的40多個比特幣亦在其中丟失。另一起比特幣最大失竊案發生在一台linode虛擬機上。2012年3月1日,黑客在這台虛擬機上偷走了大約5萬個比特幣。每隔一段時間,全球範圍就會發生一次黑客攻擊事件。

不過,李笑來認為比特幣儲存的安全風險,與現實中貨幣失竊情況類似,重點在于用戶自身的安全防範。

三招防範信息泄露

1.把比特幣埋到“墳墓”中,即把比特幣文件存入一台永遠不使用的電腦中,就如同把現實貨幣埋藏在地下一樣。

2.不少極客自己設計了離線硬件錢包,相當于一個加密的USB存儲器,只有當硬件錢包與電腦連接時,才能完成交易。私鑰存儲與數字簽名均在硬件錢包上進行,惡意軟件根本沒機會將交易對象重定位到另一個地址,也沒法記錄你在鍵盤上輸入的口令。

3.用戶最好能夠在每一次交易時都使用新的地址。這樣就沒人知道哪個地址是誰的,匿名交易更能受到保護,不容易被人肉出來。

動態

美國國土安全局查封比特幣交易賬戶

據外媒報道,最近美國國土安全局凍結了全球最大的比特幣交易所Mt. Gox所擁有的兩個銀行賬戶,這意味著美國政府對這種虛擬貨幣的監管走出實質性的一步 。

報道稱,除了關閉徹查Mt. Gox 在富國銀行的交易往來內容之外,美國政府還關閉了其設在網絡支付平台Dwolla上的賬戶。此前許多美國比特幣用戶都使用Dwolla向Mt Gox匯款。而業內認為,比特幣最近的暴漲暴跌才是讓它真正獲得市場和監管機構關注的原因。

2013年5月30日 星期四

精進你的程式碼 - 從取得用戶端 IP 的函式談起

http://www.jaceju.net/blog/archives/1913/

我想多數從事程式開發的朋友,都曾經在遇到問題時,直接上相關的論壇去詢問前輩,或是想辦法去找尋有沒有人碰過同樣的問題。而幸運的是,通常在網路上也可以找到很多前人所提供的解決方案,甚至有寫好的程式碼供後人參考。 但是很多人都是直接把這些程式碼直接複製過來使用,很少會去探討其中的原理。只要能解決問題,有誰會去在乎程式碼到底是圓是扁呢?然而這就是許多程式開發者無法精進自己能力的主要原因之一。

當然我本身也是曾經是這種人,在不瞭解原理的狀況下,對於能夠運作的程式碼,也曾經抱持著能不改就別改的心態。但是在技術這條路上,如果一直用這種態度去處理問題,那麼跟沒有思考能力的機器人又有什麼兩樣呢? 來吧!我們就從一個最常見的問題開始,一起來瞭解怎樣才能寫出一個所謂「好」的程式碼。

如何取得用戶端 IP ?

大部份從事 Web 開發的朋友,一定都會遇到需要取得用戶端 IP 的狀況。而在 PHP 中,透過 Google 去搜尋的話,也可以找到很多解決方案。 以下的程式碼應該是最常見的解法:
1
2
3
4
function get_client_ip()
{
return $_SERVER['REMOTE_ADDR'];
}
然而這個方法有個問題,那就是 $SERVER['REMOTE_ADDR'] 有可能不是真實的用戶端 IP 。 原因是用戶可能是在防火牆之後,也可能是透過 Proxy 上網,而使得 $SERVER['REMOTE_ADDR'] 的值可能不是用戶真實的 IP ;總而言之,我們並不能完全相信 $_SERVER['REMOTE_ADDR'] 所回傳的值。 那該怎麼辦呢?網路上又有了這樣的解決方案:
1
2
3
4
5
6
7
8
9
10
11
function get_client_ip()
{
if ($_SERVER['HTTP_CLIENT_IP']) { // check ip from share internet
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif ($_SERVER['HTTP_X_FORWARDED_FOR']) { // to check ip is pass from proxy
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
其中 HTTP_CLIENT_IP 這個 HTTP Header 表示用戶可能是在防火牆之後,或是在透過 IP 分享器來上網;而 HTTP_X_FORWARDED_FOR 則表示用戶可能是透過 Proxy 過來的。這兩個 HTTP Headers 都會將用戶真實的 IP 記錄下來,轉交給 Web Server 處理。 而在這兩個 HTTP Headers 都沒有的狀況下,我們就只好選擇 $_SERVER['REMOTE_ADDR'] 這個一定會有的值,因為它可能就是用戶真實的 IP 了。

PHP 嚴格開發模式

一般在開發時,我們都會把 PHP 設定成嚴格開發模式來讓程式儘可能不要有基本的錯誤發生,像是變數未定義就使用,陣列索引不存在等等,以確保我們的程式在任何設定下都可以順利執行。 設定嚴格開發模式的方法如下:
1
error_reporting(E_ALL | E_STRICT);
身為一個合格的 PHP 開發人員所開發出來的程式,至少要在這種嚴格的環境中執行,而不會發生基本的錯誤。 然而在打開 PHP 嚴格開發模式後,前面的範例在 PHP 嚴格開發模式下可能會出現 “Undefined index: HTTP_CLIENT_IP in xxx.php on line xx” 的警告訊息,這是因為 HTTP_CLIENT_IP 及 HTTP_X_FORWARDED_FOR 這兩個 HTTP Headers 其實是有可能不會設定在 $SERVER 中的。 可是我們不是有判斷這兩個 HTTP Headers 的值是否存在嗎?是的,只是我們是判斷它們的「值」是否存在,而不是判斷它們是否存在於 $SERVER 陣列之中。正確的方法是要以 empty 敘述來判斷這兩個 HTTP Headers 的索引是否存在於 $_SERVER 陣列裡:
1
2
3
4
5
6
7
8
9
10
11
function get_client_ip()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) { // check ip from share internet
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // to check ip is pass from proxy
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
註:至於為什麼 $_SERVER 中有可能不會包含 HTTP_CLIENT_IP 及 HTTP_X_FORWARDED_FOR 這兩個 HTTP Headers 呢?這其實跟 Web/Proxy Server 與網路設備的運作方式有關,這裡就不再深入討論。

其他有用的 HTTP Headers

事實上,除了 HTTP_CLIENT_IP 與 HTTP_X_FORWARDED_FOR 之外,還有其實可能會是用戶實際 IP 的 HTTP Headers ,分別是:
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED
因此我們就必須得再多判斷這些 HTTP Headers :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function get_client_ip()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED'])) {
$ip = $_SERVER['HTTP_X_FORWARDED'];
} elseif (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_FORWARDED_FOR'];
} elseif (!empty($_SERVER['HTTP_FORWARDED'])) {
$ip = $_SERVER['HTTP_FORWARDED'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
但現實上它們的值還是有可能並非用戶實際的 IP ,因此僅供參考用。
註:很可惜的是,我還沒找到這些 HTTP Headers 的完整解釋,只能從字面上去猜測。如果大家有找到它們所代表的意義,還請不吝告知。

判斷是否為合法的 IP

基於從用戶端所傳過來的值都是不可信任的原則,我們還是要對上述的這些 IP 做合法性驗證;在 PHP 5.2 之後,我們可以透過 filter_var 方法來處理:
1
2
3
4
5
6
7
8
function validate_ip($ip)
{
return (bool) filter_var($ip, FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4 |
FILTER_FLAG_NO_PRIV_RANGE |
FILTER_FLAG_NO_RES_RANGE
);
}
其中 FILTER_VALIDATE_IP 表示我們要過濾的是 IP 值,而 FILTER_FLAG_* 的意義可以參考 Filter flagsfilter_var 函式會回傳驗證過後的值,如果驗證不過,就回傳 false 。因此我們就可以改寫我們的 get_client_ip 函式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function get_client_ip()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && validate_ipSERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED'])) {
return $_SERVER['HTTP_X_FORWARDED'];
}
if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
}
if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR'])) {
return $_SERVER['HTTP_FORWARDED_FOR'];
}
if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED'])) {
return $_SERVER['HTTP_FORWARDED'];
}
return $_SERVER['REMOTE_ADDR'];
}
這裡另外改寫的部份就是直接把驗證無誤的 IP 值回傳給函式呼叫者,這樣一來我們就不需要再加上一個暫存變數 $ip 了。
註:也許有人會對一個函式中有多個 return 出口感到不舒服,但在這裡確實是個避免後續程式繼續執行的好方法,這在重構中稱為 Guard Clauses

HTTP_X_FORWARDED_FOR 可能的格式

前面的程式碼看起來很長對吧?沒關係,晚點我們會回頭過來處理它;現在要先來看看一個比較重要的問題。 根據 Wiki 對 X-Forwarded-For 這個 HTTP Header 的描述,它的格式有可能是:
1
client1, proxy1, proxy2
換句話說,我們必須對它預先以處理才能得到用戶的 IP ,方法是以 explode 來拆開每組 IP ,程式碼如下:
1
2
3
4
5
6
7
8
9
// 略
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
foreach (explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']) as $ip) {
$ip = trim($ip); // just to be safe
if (validate_ip($ip)) {
return $ip;
}
}
}
將上面的片段加到原有的程式碼後,整個函式就更顯得落落長;雖然可以用,但是如果這樣就滿足,那我們真的就只是程式碼轉貼手了。

精簡的寫法

接下來我們要想辦法把一長串的 if…elseif 簡化,也可以避免寫一堆的陣列元素。既然這些值都是在 $_SERVER 中,那麼我們就可以用迴圈來一一將它們代入:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function get_client_ip()
{
foreach (array(
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR') as $key) {
if (array_key_exists($key, $_SERVER)) {
// 處理 IP
}
}
return null;
}
相信這樣的轉換應該不難懂,這樣的程式碼雖然比不上其他程式語言的語法來的漂亮,但已經比我們原來的那段範例好看太多了。 至於怎麼處理 IP 呢?除了 HTTP_X_FORWARDED_FOR 需要以 explode 函式處理,其他的值應該都不需要處理呀?我們可以把它們放在一起嗎? 其實是可以的,我們可以把非 HTTP_X_FORWARDED_FOR 的其他值也用 explode 函式過個水,然後會得到只有一個元素的陣列;這樣一來,我們就不需要再用 if…else 判斷格式上的差異,直接都以陣列來處理即可。 最後完整的程式碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function get_client_ip()
{
foreach (array(
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR') as $key) {
if (array_key_exists($key, $_SERVER)) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
$ip = trim($ip);
if ((bool) filter_var($ip, FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4 |
FILTER_FLAG_NO_PRIV_RANGE |
FILTER_FLAG_NO_RES_RANGE)) {
return $ip;
}
}
}
}
return null;
}
跟前面的程式碼比起來,你是否也覺得最後的這段程式碼比較容易瞭解與維護呢?
註:其實最後這段程式碼也是網路上找得到的,而我在這裡只是讓大家瞭解為什麼高手要這樣精簡程式碼。

心得

在取得用戶實際 IP 這個很常見的功能中,其實也蘊涵了很重要的網路知識,雖然不見得我們能完全瞭解這些 HTTP Headers 的由來與運作方式,但至少也要知道為什麼要把它們加進來的原因。 而在語法上的重構,也是我們程式精進上一個很重要的技能;它能反映出你是否真正瞭解這門程式語言,並且知道該怎麼善用它們來增加你工作上的效率。 手邊擁有的工具越多,就更應該熟悉它們;這樣才能適其位盡所能,發揮它們真正的價值。

andbook - Android 编程

对于一个 Android 应用程序有四种构成部分
� Activity
� Intent Receiver
� Service
� Content Provider

不是每一个的应用程序都需要所有这四个部分,但是你的应用程序将会用这些的
组合来编写。
一旦你决定了你应用程序需要哪些组件,你应该在一个名叫 Android Manifest.xml
文件中列出它们。这是一个 XML 文件,在里面声明你应用程序组件和它们的功
能和需求是什么。我们将马上讨论,Android Manifest.xml 负责什么作用。

Activity
Activity 是 Android 四个构建模块中最普通的一个。一个 Acitivity 通常在你应用
程序中是一个单独的屏幕。每一个 Activity 是被实现作为一个继承于 Activity 基
类的单独的类。你的 Class 将要显示一个由 View 和响应事件组成的用户界面。
多数应用程序由多个屏幕组成。例如:一个文本消息发送程序可能有一个显示
要发送信息的联系人列表的屏幕,有一个给选中的联系人编辑短信的屏幕,并
且另外的屏幕显示以前信息或是更改设置。每一个这些屏幕应该作为一个
Activity 被实现。移动到另外的屏幕上是通过启动一个新的 Activity 来完成。由
于一些原因,一个 Activity 可能会向先前的 Activity 返回一个值——例如:一个
让用户选择一个 Photo 的 Activity 将会返回选中的 photo 到 caller 应用程序上。
当一个新的屏幕开启,先前的屏幕被暂停并且压入历史堆栈。用户可以向后导航
返回到在历史记录中先前打开的屏幕。当它们遗留不适当时,屏幕也可以选择从
历史堆栈中删除。Andriod 为每一个从 Home 屏幕上运行的每一个应用程序保留
历史堆栈。

Intent 和 Intent Filter
Android 使用一个名叫 Intent 的特殊类来让应用程序从一个屏幕移动到另一个屏
幕。Intent 描述了一个应用程序想要干什么。Intent 数据结构的两个最重要的部
分是:要响应的 action 和 data。典型的 action 值是 M AIN (应用程序的入口), VIEW 、
PICK、EDIT ,等等。Data 表示成一个统一资源定界符(URI). 例如:要在浏览器
中查看一个网站,你将创建一个带有 VIEW action 的 Intent 和设置了网站 URI 的
data 。

Intent Receiver
当你想要在你的应用程序中编码来执行对外部事件的响应,你可以使用一个
IntentReceiver 。例如:当电话响铃,或当数据网络可用时,或当午夜时。虽然
IntentReceiver 不显示一个 UI,但它们也许会显示一个通知来提醒用户是否有令
人感兴趣的事件发生。IntentReceiver 也是在 Android Manifest.xml 中被注册,但
你也可以在代码中使用"Context.register Receiver( )"来注册它们。它的
IntentReceiver 被调用时,你的程序不是非得运行的;假如必要时,当一个
IntentReceiver 被触发时,系统将会调用你的应用程序。通过使用
"Context.broadcastIntent()",应用程序也能发送它们自己的"I ntent Broadcast"给别
的应用程序

Service
一个 service 是长期存活并且运行时不带 UI 的编码。这个 Service 的好例子是
Media Player 从一个播放列表中播放歌曲。在一个 Media Player 应用程序中,可
能有一个或更多的 Activity,这些 Activity 允许用户选择歌曲和开始播放歌曲。
然而,音乐回放本身不应该被一个 Activity 处理,因为用户将期望在导航到一个
新的屏幕后音乐保持播放。这种情况中,Media Player Activity 应该使用
"Context.startServer()" 来启动一个服务在后台运行来保持音乐继续播放。接下来
系统将保持音乐回放 Service 运行,直到这个 Service 被停止。(通过阅读 Androi d
应用程序生命周期,你可以学到更多关于先前给出的系统中的 Service 。的信息 。)
记住,你可以使用"Context.bindSer ver()" 方法来连接一个 Service (如果还没有运
行,并开启它)。当连接到一个 Service ,你可以通过一个 Service 显露出来的
Interface 来和它通信。对于音乐 Service ,这可能允许你暂停、倒回,等等。

Content Provider
应用程序可以把他们的数据存储到文件中,一个 SQLite 数据库中,设置中,或
是任何其他的有意义结构中。如果你想要你的应用程序的数据和其他应用程序共
享,一个 Content Provider 是有用的。一个 Content Provider 是一个类,它实现了
方法的一个标准设置来让其他应用程序存储和恢复被 Content Provider 处理的数
据类型。


Advanced Android Exploitation with AFE使用教學

參考自http://dms-homework.blogspot.com/2013/04/attacking-angry-birds-advanced-android.html

Android Framework for Exploitation is an open-source project which we have
developed in order to create security research, check for app based and platform
based vulnerabilities, as well as write plugins for it and share with the community.

It could be classified into 5 different parts :
§  Malware Creator (Creation of malware and botnet modules. Also used to inject
malicious codes into legitimate applications)
§  Listener (Python listener to listen to and show incoming data from the
phone/emulator)
§  Exploiter (Used to exploit various vulnerabilities in applications and platform)
§  Stealer (To steal information from the phone including contacts, call logs, text
messages, files from the SD Card and many more)
§  Crypter (To make already detected malware samples, undetectable by the
anti-malwares)

Creating Malwares with AFE
The Malware Creator is responsible for creating the malicious applications, with
whatever functionality you wish for. There is a pre-defined template in it consisting
of already made files required in the application – including AndroidManifest.xml,
MainActivity.java, Services.java, Strings.xml and Main.xml.

Strings.xml file in the pre-defined malware will be modified once we set our local
IP.
Since, we need everything to be carried out in the background, we will be using
Services.java (which is a service instead of an activity) to run all our malicious
codes.
The services.java could be started from the MainActivity in the following way:
startService(new Intent(getApplicationContext(),
myservice.class));


Once you set your reverse IP (same as LHOST), you’ll have the option of Stealer.
There are 3-predefined stealers, and you can add more yourself. The 3 already
existing ones include –
•  Call Logs
•  Contacts
•  Messages
We will be using Content providers to steal all call logs, contacts and messages.
Once we have all the three name value pairs (call logs, contacts and messages), we
will set up a HTTP connection to upload the data, or use the built-in python
listener, which will automatically be started once you finish creating your malware.
以上資料是複製自afe_manual.pdf

首先把壓縮包解壓至BT5 VM中,我是放到桌面上,另外需要安裝android SDK,請自行自google下載,所以我的桌面像這樣
在shell中執行ant,未安裝,所以先安裝ant
apt-get install ant1.8
ant是用來編譯android的專案,方式如下
android update project -p project-path --name xysecv3 --target 1
在專案目錄中執行ant debug
由於android並未在預設路徑中,所以path中要加進去
export PATH=$PATH:~/Desktop/adt-bundle-linux-x86-20130219/sdk/tools
還要設定為可執行
chmod -R 755 ~/Desktop/adt-bundle-linux-x86-20130219

接下來修改專案中程式碼
裡面是跟程式回連主機資訊有關,把它都改成你的主機域名,在你的主機上必須有http伺服器,用來處理回連的資訊
另外在主程式中用來處理傳送那些資訊的函數

(1,1,1)分別表示傳送通訊錄、通話紀錄及簡訊內容
修改好了就可以開始編譯了



下一步是上傳至android裝置,並進行安裝及啟動,相關指令如下
adb install xysecv3-debug.apk (安裝)
adb uninstall com.xysecv3 (反安裝)
adb shell am start -n com.xysecv3/.Xysecv3Activity(啟動)
請先在裝置上開啟debug模式,然後用USB連到主機上
adb也要加到PATH
export PATH=$PATH:~/Desktop/adt-bundle-linux-x86-20130219/sdk/platform-tools
 
 
 

用bitcoin買了一個hosting

挖了一些幣,自然是要拿來花用,不然到時崩盤就欲哭無淚了,上網找了收受的web hosting service
http://www.orangewebsite.com/bitcoin.php
http://www.bitcoin-hosting.com/?page_id=5


比較了一下,bitcoin-hosting真是超便宜的,於是就直接買了,交易是透過https://payment.mtgox.com完成的

中間有一點小插曲,由於我沒有mt.gox的帳號(懶得申請),所以用standard bitcoin payment,這可能有一點風險,因為這樣是直接轉帳到對方,有可能肉包子打狗,反正幣也是挖來的,就小賭一下
在正常情況下,當交易完成時,會自動跳轉到對方網站去做一些hosting的設定,結果並沒有,我是不是被騙了?
於是發揮破英文,開始寫信給雙方的客服,mtgox是馬上有處理,可是由於是直接交易,他們也無能為力,經過漫長的等待,bitcoin-hosting終於回信了,說他們處理交易的程式出了問題所以...,只好用人工處理,雖然等待了一段時間,最後我終於進到c-panel了





所以,比特幣還真是好用,如果大家都有信用的話。









2013年5月29日 星期三

2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)

http://www.slideshare.net/yftzeng/jsdc-2013frontendengineeringsecurity




2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)

by on May 18, 2013

  • 1,947 views
Talk about security for front-end engineering, including front-end JS protection, DOM-based XSS, ClickJacking, MITM, and front-end MVC problems.