該漏洞是在傍晚時發現的,大概在晚上12點的時候被修復了。
事情的起因是我一同學在百度知道上看到一個很奇怪的,正文帶有連接的提問(這里),正常來說,這種情況是不可能出現的。
我條件反射的想到了:XSS漏洞。出於好奇,我決定探究這個漏洞。
通過查看源代碼,我馬上發現了問題的根源:未結束的<a>標簽。
<pre class="line q-content mt-10" accuse="qContent">幫我寫一個能提取<a href="http:// " 引號中超連接的表達式(只需要http打頭的即可,謝謝</pre>
我姑且猜測可以插入<a>標簽,於是嘗試插入<a href="http://www.baidu.com">a</a>,結果和我預想的差不多,被過濾了。
如果標簽不完整呢?沒用的,會被轉義。
到這里,回頭仔細想想,為什么之前的標簽沒被過濾,而后來寫的卻被過濾了?對比之前的和第二次嘗試,區別在於,第二次提交的<a>標簽href屬性的url地址是完整的,而之前的只有http://。
至此,我大概能猜到這個漏洞是怎么觸發的了:一個不完整的標簽 + href="http://"。
既然已經確定了怎么觸發漏洞,接下來就利用漏洞做一些出格的事看看。既然標簽可以被保留下來,就可以在屬性上做文章。於此同時,我的那個同學已經在嘗試使用style了。鏈接(已失效)
利用style="color:red"改變字體顏色
這時我不禁邪惡了下,打算做個出格點的,鏈接(已失效)
<div style="background-color: blue; color: red; font-size: 64px; font-weight: bold; width: 1024px; height: 1024px; position: fixed; left: 0; top: 0;" onclick="alert(1);" href="http://" 哈</pre>
如此,頁面已經面目全非了,並且添加了onclick事件。
好了,到此為止,如果別有用心,繼續探究的話,完全可以由此對整個百度知道頁面實施大規模的XSS攻擊。我很想向百度知道的后台開發組反饋這一漏洞,但卻沒能在百度知道的頁面上找到相應的渠道。是有那么個意見反饋區,但只是個貼吧,估計我在里面反饋只會被認為是瘋子。
最后,對漏洞的成因進行猜想。事實上已經很顯然了,只是一些邏輯錯誤。百度知道后台涉及有兩次過濾(在當前討論的問題中),第一次對url用<a>標簽包含起來,第二次將html特殊字符進行html實體化。百度知道的奇葩之處在於不是先進行html實體化,而是先處理url,當url處理出錯時,html實體化也相連出錯。