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。