Cross Site Scripting
反射型(不持久型)(中危)
一次性,不会存储在数据库里
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
?>
存储型(高危)
存储在数据库中,每次打开都会执行代码
DOM XSS
不与后台服务器产生数据交互,通过前端的dom(Document Object Model)节点形成的XSS漏洞。
' onclick="alert(123)">
常用测试语句
<script>alert(1)</script>
<img src=x onerror=alert(1) />
<svg onload=alert(1) />
<a href=javascript:alert(1) />
xss测试工具:XSSER
sudo atp-get install xsser
xsser -u "http://10.10.10.137/dvwa/vulnerabilities/xss_r/?name=XSS" --cookie "security=low; security=low; PHPSESSID=8f91af9ebda06bd2af89558a7758e9a2"
[+] Target: http://10.10.10.137/dvwa/vulnerabilities/xss_r/?name=XSS
[+] Vector: [ name ]
[!] Method: URL
[*] Hash: 771d45d2a33569793b37527f3552a58f
[*] Payload: http://10.10.10.137/dvwa/vulnerabilities/xss_r/?name=%22%3E771d45d2a33569793b37527f3552a58f
[!] Vulnerable: [IE7.0|IE6.0|NS8.1-IE] [NS8.1-G|FF2.0] [O9.02]
[!] Status: XSS FOUND! [WITHOUT --reverse-check VALIDATION!]
XSS防御
-
过滤特殊字符:<、>、’、" 在PHP语言中提供了htmlspecialchars()、htmlentities()函数可以把一些字符转换为HTML实体 & --> & " --> " ’ --> ' < --> < > --> > <?php
@html = $_GET('xss');
if(&html){
echo htmlspecialchars(&html);
}
?>
除此之外,Java语言中提供了 OWASP ESAPI专门用来防御安全漏洞,其中包括XSS的防御:
-
HTML编码: String str = ESAPI.encoder().encodeFOrHTML(String input);
这个接口采用的编码器是HTMLEntityCodec。如果是空格,字母或者是数字,就不编码,如果有特殊字符就替换为HTML实体(规则与PHP相同) OWASP还有专门应对HTML属性的编码操作,其接口如下: String str = ESAPI.encoder().encodeFORHTMLAttribute(Sting input);
-
CSS编码 接口如下: String str = ESAPI.encoder().encodeForCSS(String input);
CSS编码器是CSSCocec,编码原理是通过反斜杠(\)加上十六进制进行编码 -
JavaScript编码 接口如下: String str = ESAPI.encoder().encodeForJavaScript(Sting input);
-
HttpOnly HttpOnly对XSS漏洞不起作用,主要目的是解决Cookie劫持问题 JavaScript将不能获取带有HttpOnly属性的Cookie。
|