引言:网络安全问题一直存在,作为计算机网络课程的基础内容,Xss攻击肯定要拿出来吊打吊打
本次试验内容为:设计一套XSS攻防流程
1.要求
自行查阅XSS攻击相关信息
自行编写前端
设置攻击代码
对攻击代码进行防御
2.使用软件
3.代码及实验演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| <html> <body> <body background="bg.jpg"> <body style="color:white"> </body> XSS攻防演练: <br><br> 第一阶段.不抵御任何攻击<br> <input type="text" id="text1"> <button onclick = "get1()">获取输入内容</button> <script> function get1() { var text = document.getElementById("text1").value; document.write(text) } </script> <br> <br> <br> 第二阶段.通过过滤字段实现初级XSS攻击抵御 <br> <input type="text" id="text2"> <button onclick="get2()">获取输入内容</button><br> <script> function get2(){ var reg = /<[\s\S]*s[\s\S]*c[\s\S]*r[\s\S]*i[\s\S]*p[\s\S]*t[\s\S]*>[\s\S]*/i; var text = document.getElementById("text2").value; var newText = text.replace(reg,''); document.write(newText); } </script> <br> <br> 第三阶段.通过替换中框实现对XSS攻击抵御 <br> <input type="text" id="text3"> <button onclick="get3()">获取输入内容</button><br> <script> function get3(){ var text = document.getElementById("text3").value; var newText = text.replace(/</g,"<"); document.write(newText); } </script> <br> <br> 第四阶段.通过浏览器内部转换器对输入内容中特定信息进行编码 <br> <input type="text" id="text4"> <button onclick="get4()">获取输入内容</button><br> <script> function HTMLEncode(html) { var temp = document.createElement("div"); (temp.textContent != null) ? (temp.textContent = html) : (temp.innerText = html); var output = temp.innerHTML; temp = null; return output; } function get4(){ var text = HTMLEncode(document.getElementById("text4").value); document.write(text); } </script> </html>
|
第一阶段:
编码生成一个输入框,一个确认按钮,在输入框中输入信息后通过点击“获取输入内容”键跳转页面获得输入的内容。代码演示如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <input type=”text” id=”text1″>
<button onclick = “get1()”>获取输入内容</button>
<script>
function get1() {
var text = document.getElementById(“text1”).value;
document.write(text)
}
</script> </input>
|
该代码对输入内容不设任何防护,过于“相信”输入者的输入信息,通过使用
1
| <script>alert('XSS')</script&>
|
之类的攻击代码可轻易攻破此类不设防御输入框。
总结:无任何防御,极易遭受攻击:
第二阶段:
编码生成一个输入框,一个确认按钮,在输入框中输入信息后通过点击“获取输入内容”键跳转页面获得输入的内容。同时的进行初级防御,通过过滤字段实现对XSS攻击的抵御,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <input type=”text” id=”text2″>
<button onclick=”get2()”>获取输入内容</button><br>
<script>
function get2(){
var reg = /<[\s\S]*s[\s\S]*c[\s\S]*r[\s\S]*i[\s\S]*p[\s\S]*t[\s\S]*>[\s\S]*/i;
var text = document.getElementById(“text2”).value;
var newText = text.replace(reg,”);
document.write(newText);
}
</script> </input>
|
该代码通过对
相同字符进行替换为空的方式以实现破坏运行条件,对诸如
1
| <script>alert(‘XSS’)</script&>
|
之类的攻击起到效果,然而转换思路的话使用其他的函数的攻击仍然没有效果,比如:
1
| <img src=x onerror=alert(‘XSS’)>。
|
总结:初级防御对通过使用其他函数达到效果的无效.
第三阶段:编码生成一个输入框,一个确认按钮,在输入框中输入信息后通过点击“获取输入内容”键跳转页面获得输入的内容。同时使用replace函数通过将尖头框转换为<和>的形式让函数无效化,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <input type=”text” id=”text3″>
<button onclick=”get3()”>获取输入内容</button><br>
<script>
function get3(){
var text = document.getElementById(“text3”).value;
var newText = text.replace(/</g,”<”);
document.write(newText);
}
</script>
|
该代码的效果是显而易见的,常见的攻击类型对它均无效,通过替换少量字符来抵御攻击起效率也是很高的。然而该代码对于Dom攻击的攻击方法仍然没辙也因此,衍生出第四种解决方案,即通过浏览器自带转码器对输入内容进行转码达到破坏运行条件的目的。
第四阶段代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <input type=”text” id=”text4″>
<button onclick=”get4()”>获取输入内容</button><br>
<script>
function HTMLEncode(html) {
var temp = document.createElement(“div”);
(temp.textContent != null) ? (temp.textContent = html) : (temp.innerText = html);
var output = temp.innerHTML;
temp = null;
return output;
}
function get4(){
var text = HTMLEncode(document.getElementById(“text4”).value);
document.write(text);
}
</script>
|
此类方法能对大部分攻击起效果,然而从效率上看比替换<>为<和>要差得多,在不考虑时间成本的基础上改方法最为合适,不过对于设计隐私信息如cookie还是需要开启Http Only cookie进行防护。
4.总结:
防人之心不可无,以上的方法仍不是完美的,希望有高人能够给我提出更多改进方法~.~