0x01 鏈接的構成
0x02 瀏覽器算如何對url進行解析的
0x03 鏈接真的只能是這樣固定的格式么?
0x04 鏈接真的是你看到的那樣么?
鏈接真的只能固定成我們常用的格式么?
不知道有多少人思考過這個問題!我們經常輸入的格式一般都是www.xxxx.com!
或者再加上協議名 http https 端口以及路徑什么的 或者再加上賬號密碼!如下圖: ?
第一部分:協議名(以單個冒號結束)
第二部分:用戶信息 也就是賬號密碼!(登陸ftp時常用)
第三部分:主機名(也就是域名)
第四部分:端口
第五部分:查詢,這里有個bug。。。 應該是?號后的內容才是查詢!
第六部分:片段ID(是不會發送到服務器的!)
我們都知道我們訪問一個網站是帶有協議的比如http ftp https 等等!
首先瀏覽器會提取我們鏈接中的協議名,它是如何提取的呢?
(以下為copy web之困上的內容 他寫的比較詳細!)
他會查找第一個 :
號在哪,如何找到了 那么:
號左邊的便是協議名!如果獲得的協議名中出現了不該有的字符,那么認為這可能就是個相對的url 獲得的并不是協議名!
字符串 //
應該算跟在協議名后面的 如果發現有該字符 則會跳過該字符 如果沒有找到便不管了!所以 http:baidu.com 也是可以訪問的! 瀏覽器中還可以用反斜杠來代替正斜桿 \\
代替 //
firefox除外!
依次掃描url,如果這三個符號中 哪個先出現便以哪個為準來截取
/(正斜杠)
?(問號)
#(井號)
從url里提取出來的信息,就算授權部分信息!
除了IE跟safari其他瀏覽器還接受 ;(分號)也算授權信息部分中可接受的分隔符!
(1)定位登陸信息,如果有的話:
授權部分信息提取出來后,在截取出來的信息里再來查找 @ 如果找到了 那么他前面的部分便是登陸信息!登陸信息再查找 : (冒號) 冒號前面的便是賬號 后面便是密碼!
(2)提取目標地址
授權信息部分剩下的便是目標地址了 第一個冒號分開的就算主機名跟端口!用方括號括起來的就是ipv6地址,這也是個特例!
結合以上信息 我們分析下以下鏈接:
ftp://admin:[email protected]:21
這樣的鏈接我經常用來登陸ftp!這樣便會以admin的身份 密碼為:admin
ftp協議去登陸主機192.168.1.100,端口號是21端口!
如果授權部分的結尾跟著一個正斜桿,某些場景里,跟著一個反斜杠或者分號,就像之前提到的,依次掃描下一個? # 或字符串結尾符,那個先出現便以哪個為準!截取出來的部分就是路徑信息!最后根據unix路徑語義進行規范化整理!
如果在上一條解析里,后面跟著的是一個問號,便繼續掃描下一個 # 或到字符串結尾,哪個先出現便以哪個為準!中間的部分便是查詢字符串。
如果成功解析完上一條信息,它最后還跟著#號 那么從這個符號到字符串的結尾便算片段ID了,片段ID是不會發送到服務器的!一般用來跳到A標簽的錨鏈接 或者用來js的 location.hash 取值 等等!
如果大家去年跟著wooyun的基友們一塊玩爛了基礎認證釣魚的話那么應該能回想起來!當時很多網站在插入圖片的地方都判斷了后綴名是不是圖片的后綴名jpg gif等等!但是hook不是gif 什么結尾的!當時的方法便是在hook后面加上#.jpg!這樣便可以成功的來釣魚了!原理也是一樣的!
下面我們拿幾個例子來解析一下:
http://xss1.com&[email protected]
這樣一個鏈接在普通用戶看來 是會認為訪問xss1.com的!
但是實際上是去往www.baidu.com 的!為什么呢?結合以上的知識我們分析一下!
首先 協議名提取出來了 然后獲得授權部分信息,? / # 都未出現 瀏覽器便無法獲得一個字符串來獲得主機地址![email protected] @符前面的便認為是登陸信息 并不會當做主機名來解析!所以現在xss1.com&action=test 已經被當做登陸信息了 現在唯一的主機名便只有www.baidu.com了!
而xss1.com&action=test在我們訪問網站的時候 被當做了登陸了信息去訪問www.baidu.com了!
http://xss1.com\@www.baidu.com
首先看下這個鏈接在chrome中的樣子:
很明顯的看到 這樣一個鏈接在chrome中是會去訪問xss1.com的!
現在我們來看下在firefox下的樣子:
會提示我們是否要用賬號為:xss1.com\的信息去訪問www.baidu.com!
這是為什么呢?瀏覽器差異 我們在之前也說了!
因為在除了firefox外,其他的瀏覽器都會把(反斜杠當做正斜杠來解析!)
而正斜杠的出現就代表授權信息部分結束了!因為提取授權部分信息是用 \ ? #
所以授權信息部分結束 那么前面的便當成了主機名!
而firefox是不會把\當成正斜杠的 [email protected] 便算登陸信息 后面的就是主機名!所以當用firefox去訪問這個鏈接時 才出現了 上圖中的提示!
http://xss1.com;.baidu.com/
由于機器沒有IE 就不上圖了吧!
微軟瀏覽器允許主機名稱中出現 ; (分號)并成功的解析到了這個地址!當然還需要baidu.com提前做了這樣的域名解析設置!
大多數其他瀏覽器會自動的把url糾正成http://xss1.com/;.baidu.com/
然后用戶就訪問到了xss1.com(safari除外,它會認為這個語法錯誤)
不知道有多少人想過這個問題,鏈接真的只能是這樣么!
通過上面的介紹后,相信大家應該會說No了!
我記得之前有篇文章講,xss加載鉤子的時候 http://
做黑名單內!于是那位兄弟便拆分了http://
var i='http';
var b='://';
這樣也是一種辦法 但是我們有沒有更好的辦法呢? 答案肯定是有的 //www.baidu.com 也是可以被加載的!
(當前網頁的協議是什么 加載這個鉤子便用什么協議來加載! 如在https協議的網頁中 這樣加載鉤子 那么默認就是https去加載鉤子了!)
到了這里,我們不得不思考 這樣能正常的打開一個網頁 我們還有什么方法來加載網頁?這時候我們可以fuzz一下!
如下圖:
可以看到//后面我們還能輸入tab,換行,/ @ \
等等!那我們來測試一下!構造如下鏈接去訪問一下!
\\/www.baidu.com
\\@www.baidu.com
\\[email protected]
\\\\\\\www.baidu.com
///////www.baidu.com
等等全部能正常的訪問到百度!大家可以自己試一下!最好的話寫在a 標簽 或者 img script里把!這樣更貼近我們平常所遇到的環境!
?
既然我們在文章的標題提到了猥瑣 這樣夠猥瑣?No 還不夠!這樣我們的連接始終還是帶著一定的特征!
www .com .net 什么的特征還在,既然說到猥瑣 我們就要更加猥瑣!比如下面這樣的一串字符串!
??o?? --> drops
?oo??? —> wooyun
??? —> org
最后拼湊 :
??o??.?oo???.o??
變成這樣也是能夠訪問的 大家可以試試!
那么這樣一段字符串是如何得來的呢?
我們可以通過http:/xsser.me/hf.html來fuzz!
在fuzz之前先給科普一下:
針對域名的編碼:Punycode
經過Punycode編碼后的域名是會被DNS服務器所識別的!
就拿中文域名來說,因為操作系統的核心都是英文組成,DNS服務器的解析也是由英文代碼交換,所以DNS服務器上并不支持直接的中文域名解析。 所有中文域名的解析都需要轉成punycode碼,然后由DNS解析punycode碼。最后我們成功的訪問到了我們要去網站!只不過今天我們這里punycode編碼的解析過程并不是由dns服務器來解析的 而是在瀏覽器訪問時就給解碼回來!
在drops中瞌睡龍的文章也提到過!
http://drops.wooyun.org/papers/146
說了這么多,開始把!(也順便講一下這個玩意應該怎么用)
首先我們算要測試url 所以要先把 Callback 中的 x.protocol 改成hostname!
然后再把hostname等于的值也改掉,改成我們要測試的主機名!(別帶上協議名)
比如drops.wooyun.org
然后再在exp里把A標簽的鏈接改成帶有協議名的主機名!(不帶的話不能訪問)
都設置好 如下圖:
下面的小參數可以使用默認的!參數都設置好了,現在我們要標識 我們要測試哪個字符,用:{chr} 代替該字符即可!
好,現在設置好后點擊Fuzzing 槍打出頭鳥 我們就先測d吧!
可以看到右邊的框里出現了一段數字,這段數字是ASCii碼每個字符以逗號分割!
我們可以使用工具把ASCii碼給轉換回來,不過我比較喜歡chrome 方便!
現在我們復制他們!然后丟chrome里把他們給還原回來!打開控制臺(F12)
輸入String.fromCharCode(ASCII碼) 回車便出來了!
好經過測試我們得出第一個字符 d 可以使用
Dd??????Dd
來代替!
這里我就不一一的fuzz給大家看了!我們貼出最后經過fuzz后的字符串吧!
http://??o??.?oo???.o??
大家可以復制 然后訪問一下!依然是能夠訪問的到的!
但是這里也局限于需要一個可以解析的中間件才能訪問!
如果curl的話就不行了!
為什么呢?很簡單因為沒解析 curl他不會去解析這個字符串!
而瀏覽器為什么能夠正常訪問 算因為他會對我們編碼后的值進行解析再訪問!
所以這點也算需要知道的!
可是這種情況我們在哪能用到呢?我們往下看!
如果在插入鉤子的時候或其他什么的時候,對方算基于黑名單過濾的www .com .org什么的,那么便可以用這種方式去繞過!
這里的思路大家就去擴散下 有什么更猥瑣的思路求交流!
再來個例子吧!
首先拿一個被騰訊認為是危險網站的紅X站
可以看到這個鏈接發出來是會被當做危險網站的!
現在我們對其中的一個字符fuzz!為什么是一個字符?
(因為你fuzz的字符多了 會被當成符號 讓騰訊認為這不是一個鏈接!然后就不 能一點就會打開網頁了 比如這樣。。。)
可以看到這樣帶的符號多了 讓騰訊這不是一個鏈接 就不會生成個超鏈接了!
所以我們一般只fuzz幾個字符便好了!
說干就干,我們來開始測試吧!
原鏈接:http://laohujijiqiao8.com
還是用 http://xsser.me/hf.html 來fuzz
經過fuzz 測試出來 http://laohujijiqiao8.com 的o 可以用以下的字符來代替! ?
O o o ? ? ? O o
現在我們來測試一下!
http://laohujijiqiao8.com
發出去 看還帶沒帶危險網站的標識!上圖: ?
現在已經沒有標識這是個危險網站的 并且還能夠正常打開!是不是已經達到我們的目的了呢?
之前用這種方式把一個藍色標示的網站弄成顯示為騰訊官網!鏈接如下:
http:[email protected]#
(ps:以前沒加#號時 還是藍色鏈接 但是加了#號就顯示為騰訊的官網了!)
因為前面的鏈接:www.qq.com 發送出去是會顯示為騰訊官方網站的!但是現在好像不行了!
有人在社區里發了這么個帖子:百度URL跳轉 繞過騰訊紅XX
可是我們真的需要要有url跳轉漏洞才能跳轉么?
No 任何網站都可以!如下:
http:[email protected]
把這段地址填入瀏覽器中 訪問會發現去了 www.qq.com了 而并不是平常大家所認為的www.baidu.com 這是為什么,我們可以看看此篇文章的開頭!
http:// 后面可以算userinfo 也就算用戶信息 賬號密碼什么的!
[email protected]! 所以我們這段鏈接為什么去qq.com 而不是去baidu.com [email protected] 讓瀏覽器認為www.baidu.com 算一段用戶信息 而后面的才算主機名 他要去訪問的地址!
所以我們有時候偽裝找不到跳轉漏洞也可以如此實現!
然而在chrome 跟firefox下 還可以這么寫:
http:[email protected]
協議名沒有// 也會被認為是http://
沒看過web之困或者之前沒接觸過data uri的基友們!可能看了上面這個小例子就會很驚嘆了 原來還可以這樣!
在web之困中還講了其實url地址是可以用進制來代替的!只不過算把ip地址給轉換成進制來訪問!
十進制 ---||||||> 十六進制 ---||||||> 八進制 然后在訪問時 指定協議然后加個0
http://0[八進制] 比如 115.239.210.26 首先用.分割數字 115 239 210 26 然后選擇10進制轉換16進制!
(要用0來表示前綴,可以是一個0也可以是多個0 跟XSS中多加幾個0來繞過過濾一樣!)
首先把這四段數字給 轉成 16 進制!結果:73 ef d2 1a 然后把 73efd21a 這十六進制一起轉換成8進制!
?
結果:16373751032
然后指定協議 http:// 用0表示前綴 加上結果 鏈接:
http://0016373751032
成功解析成我們原來的ip了!
結合最開始的一個例子:
http://xss1.com&[email protected]
后面還帶著www.baidu.com 太打眼了,現在把我們上面轉換后的地址加在后面 記得帶上0前綴!
http://xss1.com&[email protected]
這樣就不打眼了 看上去舒服多了 有木有?
既然解析回來了 那我們看看能不能用這個地址來加載一些資源比如圖片 js什么的!
?
可以看到成功加載了圖片!那應該也是加載js等等的!
相信有擴散性的基友們都有想法了,平時用來繞過一些限制等等!
具體的大家去實驗吧!web的世界 無窮大啊!