1.什么是跨站脚本攻击?
跨站脚本( Cross-site Scripting )攻击,攻击者通过网站注入点注入客户端可执行解析的payload (脚本代码),当用户访问网页时,恶意payload自动加载并执行,以达到攻击者目的(窃取cookie、恶意传播、钓鱼欺骗等)。为了避免与HTML语言中的CSS相混淆,通常称它为"XSS"。
2.危害?
- 获取用户信息;(如浏览器信息、ip地址、cookie信息等)
- 钓鱼; (利用xss漏洞构造出一个登录框,骗取用户账户密码,提示登录过期,模拟一个网站的登录框,将用户名、密码发送到攻击者服务器)
- 注入木马或广告链接;(有些在主站注入非法网站的链接,对公司的声誉有一定的影响)
- 后台增删改网站数据等操作;(配合CSRF漏洞,骗取用户点击,利用js模拟浏览器发包)
- xss蠕虫(微博蠕虫:只要看过某人的微博就是自动关注某人;贴吧蠕虫:看过某个帖子就是自动回复这个帖子)
3. XSS 种类
3.1反射型xss
特点:仅执行一次,非持久型;参数型跨站脚本。主要存在于攻击者将恶意脚本附加到url的参数中,发送给受害者,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。
攻击流程:
攻击者→发现存在反射型xss的url
→根据输出点环境构造xss代码
→进行编码、缩短(可有可无,仅为了增加迷惑性)
→发送给受害者
→受害者点开链接,xss代码执行
→完成攻击者代码功能。
- 反射型xss利用场景见框就插,改url参数
- 经典测试
<script> alert('hack')</script>
- 大写绕过
<SCRIPT>alert('hack')</SCRIPT>
- 双写绕过
<scr<script>ipt>alert("xss")</script>
- 其他标签
<img src=1 onerror=alert('hack') />
- xss.php 测试例子
<html>
<head>
<title>XSS_result</title>
</head>
<body>
<form action="" method="get">
please input your name :</br>
<input type="text" name="name" value=""></input>
<input type= "submit" value="submit"></input>
</form>
<?php
if (array_key_exists( "name" , $_REQUEST) && $_REQUEST['name'] != NULL){
$name= $_REQUEST['name'];
//str_replace()直接替换函数;区分大小写
// $name = str_replace( '<script>','' , $name);
// preg_replace() 正则替换(i表示忽视大小写)
// $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', "", $name );
//htmlspecialchars(string):
//把预定义的字符“<" (小于)、">” (大于)、&'、”转换为HTML实体,
//防止浏览器将其作为HTML元素
//$name = htmlspecialchars($name);
echo 'welcome : '.$name;
}
?>
</body>
</html>
3.2 存储型xss
特点:持久型。
主要存在于攻击者将恶意脚本存储到服务器数据库中,当用户访问包含恶意相关数据的页面时,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。
trim(string[, charlist]):
//函数移除字符串两侧的空白字符或预定义字符(\t. \n. \xOB、 \r)
stripslashes(string):
//移除字符串中的反斜杠
mysqli_real_escape_string(connection, string) :
//对字符串中sql的特殊符号(\x00,\n,\r,),',",\x1a)进行转义
strip_tags(string, allow)
//函数剥去字符串中的HTML、 XML以及PHP的标签;
addslashes(string)
//返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串;还有最后一道
htmlspecialchars()//函数。
3.3 DOM型xss
特点:通过JavaScript操作document,实现dom树的重构。主要存在于用户能修改页面的dom,造成客户端payload在浏览器中执行。
url: http://localhost/security/dom_xss.php?name=alert(1)
<html>
<head>
<title>XSS_result</title>
</head>
<body>
<script>
var pos = document.URL.indexOf ("name=")+5;
eval(document.URL.substring(pos, document.URL.length));
</script>
<h2> var pos = document.URL.indexOf ("name=")+5;</h2>
<h2> eval(document.URL.substring(pos, document.URL.length));</h2>
</body>
</html>
1.测试: (xss探针)
";"\<poiuyt>=&{()} '';!--"<XSS>=&{()}
–可以测试网站过滤了哪些字符,进行怎样的防护
2.查看网页源代码 (如何闭合属性、标签等)
3.构建xss payload (如何绕过等)
payload大全: https://github.com/pgaijin66/XSS-Payloads/blob/master/payload.txt