設計模式之迭代模式
0x00 XSS(跨站指令碼)概述
Cross-Site Scripting 簡稱為“CSS”,為避免與前端疊成樣式表的縮寫"CSS"衝突,故又稱XSS。一般XSS可以分為如下幾種常見型別:
1.反射性XSS;
2.儲存型XSS;
3.DOM型XSS;
- 1
- 2
- 3
XSS漏洞一直被評估為web漏洞中危害較大的漏洞,在OWASP TOP10的排名中一直屬於前三的江湖地位。
XSS是一種發生在前端瀏覽器端的漏洞,所以其危害的物件也是前端使用者。
形成XSS漏洞的主要原因是程式對輸入和輸出沒有做合適的處理,導致“精心構造”的字元輸出在前端時被瀏覽器當作有效程式碼解析執行從而產生危害。因此在XSS漏洞的防範上,一般會採用“對輸入進行過濾”和“輸出進行轉義”的方式進行處理:
輸入過濾:對輸入進行過濾,不允許可能導致XSS攻擊的字元輸入;
輸出轉義:根據輸出點的位置對輸出到前端的內容進行適當轉義;
- 1
- 2
0x01 反射型xss(get)
直接輸入<script>alert('xss')</script>
,但是輸入一半的時候,發現字元框長度不夠了。
直接改前端程式碼,修改完成後,成功彈框。
0x02 反射性xss(post)
這個題弄的我有點蒙,一開始這個登陸框試了半天,發現沒XSS
,於是登陸後,發現又出一個框,原來敢情是在這裡進行XSS
…
這個地方讓他彈框還是比較簡單的,關鍵是這其實還是一個反射型的XSS
,雖然是用post
post
的表單。。。
0x04 儲存型xss
熟悉的留言板,直接提交語句就可以構造成功了,並且每次訪問都會有框出現。
0x05 DOM型xss
直接輸入<script>alert('xss')</script>
,但是發現並沒有彈框,審查原始碼。。。
發現輸入的值發生了一定的變化,仔細檢查後,發現還有一段JS
程式碼。
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//試試:'><img src="#" οnmοuseοver="alert('xss')">
//試試:' οnclick="alert('xss')">,閉合掉就行
- 1
- 2
- 3
- 4
- 5
- 6
從上面可以看出來,通過value
方式將text
的值賦值為str
,也就是框裡面的值,然後通過innerHTML
將標籤內的值取出來,比如<label id="lb1">this is a label</label>
,取出來的值就是this is a label
。所以結合前面的'
做一個閉合,像<script>
這種有前後標籤閉合的就不太方便用了,用提示裡面的onclick
來構造,' onclick=alert('xss')>
就可以了。
在審查元素中也可以看到對應的程式碼。
點選連結,即可成功彈窗。
0x06 DOM型xss-x
看起來和上一個很像,直接用onclick
來試試。
但是點選隨風
後,可以正常彈窗。
雖然成功彈框了,還是去學習JS
程式碼看和上一題有什麼區別。
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就讓往事都隨風,都隨風吧</a>";
}
//試試:'><img src="#" οnmοuseοver="alert('xss')">
//試試:' οnclick="alert('xss')">,閉合掉就行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
window.location.search
該屬性獲取頁面 URL 地址,window.location 物件所包含的屬性如下:
去控制檯測試了下結果。
然後通過var txss = decodeURIComponent(str.split("text=")[1]);
取出以text=
為分割的第二個元素,第一個元素是?
第二個元素就是我們輸入的值。
最後var xss = txss.replace(/\+/g,' ');
將+
刪除,這裡應該是過濾經過url
編碼過的空格
吧。
和上一題的區別在於,這裡的值是從URL
中獲取到的,就像反射型的XSS
一樣。
0x07 XSS盲打
這個並不是一種攻擊型別吧,只是一種場景,因為輸入的值在前端都顯示不出來,所以我們也不知道哪裡會有XSS,所以見框就插,這稱之為盲打。
所以接下來,我再框裡都輸入了惡意程式碼。
然後右上方有個提示,可以看到後臺的目錄。
訪問後臺,登陸成功後,就可以看到成功彈框。
0x08 xss之過濾
從標題就知道了會有過濾,這裡先輸入一些符號進行探測"'<>/
,結果發現符號似乎都沒有被過濾掉。
那直接使用<script>alert('xss')</script>
,但是發現script
似乎被過濾掉了。
先用大小寫,雙寫啥的試試。<sCRipt>alert('xss')</sCRipt>
大寫就直接成功了。
去伺服器上檢視php
程式碼:
$html = '';
if(isset($_GET['submit']) && $_GET['message'] != null){
//這裡會使用正則對<script進行替換為空,也就是過濾掉
$message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
if($message == 'yes'){
$html.="<p>那就去人民廣場一個人坐一會兒吧!</p>";
}else{
$html.="<p>別說這些'{$message}'的話,不要怕,就是幹!</p>";
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
這裡只是把script
進行了過濾,雙寫就繞不過了,但是沒有區分大小寫。
0x09 xss之htmlspecialchars
明顯做了元素實體符號的處理,先隨便輸入,看看結果。
這裡看到已經被處理過了,上面的情況也很奇怪,輸入的程式碼前半段沒有被轉義為實體。。。
還是先來了解下htmlspecialchars
吧。htmlspecialchars()
函式把一些預定義的字元轉換為 HTML 實體,下列都是預定義字元。
& (和號) 成為 &
" (雙引號) 成為 "
' (單引號) 成為 '
< (小於) 成為 <
> (大於) 成為 >
- 1
- 2
- 3
- 4
- 5
語法htmlspecialchars(string,quotestyle,character-set)
這裡要注意,預設情況的編碼是不會將'
進行編碼的,嘗試著利用這一點去試試構造onclick=alert('xss')
發現和想象中有點不一樣,研究了好一會,這裡應該是後端php
在處理時會將'
當作一個分割符來看待,所以在前面加上一個' onclick=alert('xss')
再來看。
發現前面的已經閉合上了,後面還多出了一個'
,那乾脆在alert
前面再加一個'
形成'onclick='alert('xss')
。
發現還是不太行,這樣會把'alert('
當作onclick
的值的,最後直接用雙引號替換掉'xss'
中的單引號,構造語句' onclick='alert("xss")
成功閉合,並且彈窗,不過這裡雙引號居然也沒有被轉義,查了後臺php
,確實是預設的編碼風格,有點奇怪,當然如果被轉義這裡也可以彈整形類的嘛,影響不大,經過了大量測試,應該是被當作字串處理了,所以就沒有被當作標籤進行轉義。
0x10 xss之href輸出
這個試了老半天沒有成功繞過,感覺應該是都被轉義了,於是找了個沒有這些符號的XSS
攻擊程式碼javascript:alert('XSS');
成功彈窗。
這裡感覺應用起來的話,也可以直接用http
指到其他有攻擊程式碼的網站上。這裡有點小搞笑,輸入www.baidu.com
。。。
還是去看下原始碼吧,感覺就是自己點背,哈哈。
$html='';
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>叫你輸入個url,你咋不聽?</p>";
}
if($_GET['message'] == 'www.baidu.com'){
$html.="<p class='notice'>我靠,我真想不到你是這樣的一個人</p>";
}else {
//輸出在a標籤的href屬性裡面,可以使用javascript協議來執行js
//防禦:只允許http,https,其次在進行htmlspecialchars處理
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
$html.="<a href='{$message}'> 閣下自己輸入的url還請自己點一下吧</a>";
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
0x11 xss之js輸出
測試了半天,只有一句話。
查了下前端程式碼。
發現有個fromjs
,搜尋了下,發現一段JS
程式碼,具體的可以看https://baynk.blog.csdn.net/article/details/103122459
。
<script>
$ms='1';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac確實厲害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('無論如何不要放棄心中所愛..')
}
}
</script>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
輸入tmac
,好了。嘻嘻