Web for Pentester 实验合集

0x00 introduction

Pentester Lab 是渗透测试学习实战平台,在里面提供各种漏洞实验的虚拟机镜像文件,让网络安全爱好者和黑阔进行实战式的训练,可以使其更加深刻地且透彻理解“漏洞”。官方网站:

https://pentesterlab.com/

官网截图:

虽然有些实验是收费的,但是总体来说,免费的还是占多数的。

本文进行操作的是“Web for Pentester”实验。

点击进入实验主页,下载iso镜像文件,

实验主页地址

https://pentesterlab.com/exercises/web_for_pentester

下载好的镜像文件是要放在虚拟机里的,至于虚拟机怎么安装ISO镜像文件,百度很多,这里就不细说了。

安装好了之后,它发现是自动登录了,ifconfig一下看一下ip地址。

直接访问ip即可,看到的是这样子的

那么首先从XSS开始

0x01 XSS-Example 1

点进去我们发现

可以清楚的看到url上有个name,通过改变name的值,发现下面的值也会有变化。

那么尝试在name上加上XSS的代码来进行测试

Payload: :

?name=<script>alert(/xss/)</script>

其实第一关肯定是最简单的,name这个参数不用想就知道是有问题的。

0x02 XSS-Example 2

发现还是和第一关是一样的页面。还是尝试改变name参数,发现内容也是随之而改变。

那么猜想,可能是进行了某种过滤,还是用第一关的payload尝试一下。

再查看下源代码,可以直观的看到2个<script>被变成空了。

那这个也是老套路了,1个变成空,那么我就来2个,类似<scriscriptpt>就行了。中间那个过滤成空了,剩下的拼接在一起,还是<script>。

Payload:

?name=<scriscriptpt>alert(/xss/)</scriscriptpt>

额,可是结果,

失败了。没弹窗,右键看下源代码,发现,不是把script替换成空

那么猜测后端可能是匹配<script>,</script>,如果出现,就替换成空,尝试用大小写绕过

成功,payload:

?name=<scripT>alert(/xss/)</scripT>

0x03 XSS-Example 3

一样熟悉的界面,name参数肯定是突破点,还是用老方法,用最常用也就是第一关的payload尝试。

发现还是和第二关是一样一样的。好,那我们用第二关的payload尝试

发现也被过滤了,也就是说匹配<script>,</script>,但是忽略了大小写,反思一下前面做的,发现,他是连用”<>”一起过滤的,也就是说scscriptript是不行的,但是要把<>也算进去,所以是<scri<script>pt>,当然这也算是猜测,那么尝试一下。

发现成功了。Payload:

?name=<scri<script>pt>alert(/xss/)</scri</script>pt>

0x04 XSS-Example 4

还是一样的场景。老方法,用最正常的payload去尝试,看看返回的结果是什么。

这次直接报error了,

也就是说在后端的处理,是直接检测到关键字就报error,而不是替换再输出,那么我们就要各种尝试了,看看他是匹配什么关键字的。,下面就是一些尝试

 ?name=<script>alert(/xss/) 报error
?name=alert(/xss/)</script> 报error
?name=alert(/xss/) 返回alert(/xss/)

说明一旦出现<script>,</script>,就报error。那就简单了,能执行xss代码的语句不止一个,只要不出现上面2个关键字就行。

Payload:

?name=<svg/onload=alert('xss')>

0x05 XSS-Example 5

还是一样的界面,不多说,还是直接上最简单的payload

还是和上一关一样的场景。这次思考了一下,上面是过滤<script>,那在这次就可能过滤函数了。尝试一下

果然过滤了函数,其实alert在实际的情况下并不会起太大的作用,只是起到测试效果而已。当然过滤函数也是现实中常用的防范方法,解决方法就是,这个函数不行,那就换一个同样效果的函数.比如说,用prompt()来替代

Payload:

?name=<script>prompt(/xss/)</script>

当然了,除了prompt(),和alert()还有类似的弹窗效果的还有confirm()

0x06 XSS-Example 6

恩,开始界面还是一样的,就直接上最简单的payload,看看效果了

这次又变了,看下网页源代码

这次是直接放在了变量里,不得不说,越来越贴近实际情况了。其实这也是最简单的一种,只要精心构造语句,然后把引号闭合,就可以执行后面我们想要执行的代码了。接下来,就来尝试一下,首先,看到提交的内容都是在完整的在引号里,那么就可以先闭合引号,然后分号(;)表示一句结束,然后alert语句,最后注释(//)最后一个分号即可,即?name=”;alert(“xss”);//

Payload:

?name=";alert("xss");//

0x07 XSS-Example 7

还是一样,用最普通的payload尝试,查看源代码可以看到,果然进行了过滤

把尖括号给编码成了html字符实体,所谓的html字符实体,简单的说就是html里的预留字符,就像是C语言中的int不能作为变量名一样,为了防止html把尖括号误认为标签,所以要进行编码.

从上面的测试中可以看到只是编码了尖括号,但是因为上下文已经有了script标签,所以就不需要我们再加上<script>了。好吧,其实我们上一关也是这个思路,是直接借用了它自己的<script>标签,所以用上一关的payload也能成功,

额,没有成功,貌似把双引号等一些特殊符号都给编码了。但是仔细看和上一题不同的是,这里用的是单引号,把payload的引号换一下试试。

很幸运的是单引号没被编码,payload:

?name=';alert('xss');//

0x08 XSS-Example 8

还是提交常规payload,

可以看到,提交参数的方式变成了post,然后也是对一些符号进行了html实体编码。对于这种输出直接进行html实体编码的,老实说,我也没想出什么好方法,大神教我。。。

对于这题,也是尝试了好久,各种方法都是不行,都没有成功。本人也是小白,没有什么好的方法,只能-----------看源码,

其他没有什么特殊的,唯有这个$_SERVER['PHP_SELF'],看到这种超级全局变量,就感觉用的有点蹊跷,果断百度一下,终于发现了漏洞所在。

$_SERVER["PHP_SELF"]的值是当前php文件相对于网站根目录的位置地址,也就是说,是返回当前正在执行脚本的文件名。但是呢,这个$_SERVER["PHP_SELF"]的值是可以通过url上的值控制的,比如说/xss/example8.php,在url上改成/xss/example8.php233

那么$_SERVER["PHP_SELF"]的值就是/xss/example8.php233,(当然不能直接php233,这样就请求不到文件了,/ 如果不是伪静态的话,一般是指目录,由于已经请求到具体的php文件了,后面就不会管了)

最后,源代码是没有任何过滤就直接输出了这个值,,那我们就可以通过构造语句,来闭合双引号,然后执行自己想要的代码。

Payload:

example8.php/"><script>alert("xss")</script>"

可以看到源码;

0x09 XSS-Example 9

可以看到稍微有点变化了,还是老规矩,用常规payload测试。

第一次并没有反应,查看一下源码

百度一下这个函数,发现

location是JavaScript管理地址栏的内置对象,location.hash则可以用来获取或设置页面的标签值,也就是#号后面的值。所以当我们第一次访问

/xss/example9.php#hacker时,location.hash.substring(1)就是#后面的hacker,当我们在改变为

#<script>alert(/xss/)</script>时,location.hash.substring(1)的值并没有更新,需要刷新一下,才会更新。这是典型的DOM-XSS。

Payload:

#<script>alert(/xss/)</script>

当然如果你直接访问/xss/example9.php#<script>alert(/xss/)</script>的话,是可以直接成功的。

0x10 总结

现在来总结下:

  • 第一关是普通的payload
  • 第二关是匹配并替换标签,大小写绕过
  • 第三关是忽略大小写的匹配并替换标签,双重标签绕过
  • 第四关是匹配标签并报错,使用未过滤的标签绕过
  • 第五关是匹配函数并报错,使用未过滤的函数绕过
  • 第六关/第七关都是把提交的代码放入某个变量中,根据上下文闭合双引号,标签等
  • 第八关则是考察了php的漏洞结合的xss,$_SERVER['PHP_SELF']
  • 第九关是DOM-XSS

其实xss漏洞也主要是这些,在CTF比赛中或者在实际的发掘漏洞中,当然不可能是单个的一种,肯定需要多种不同的组合。

原文发布于微信公众号 - 安恒网络空间安全讲武堂(gh_fa1e45032807)

原文发表时间:2018-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏祝威廉

ElasticSearch Bulk 源码解析

读这篇文章前,建议先看看ElasticSearch Rest/RPC 接口解析,有利于你把握ElasticSearch接受处理请求的脉络。对于RPC类的调用,我...

1244
来自专栏向治洪

Google V8 引擎

V8的前世今生 V8是JavaScript渲染引擎,第一个版本随着Chrome的发布而发布(具体时间为2008年9月2日)。在运行JavaScript之前,相比...

6515
来自专栏北京马哥教育

有关bash,我希望我能知晓的十件事

1795
来自专栏向治洪

Google V8引擎

V8的前世今生 V8是JavaScript渲染引擎,第一个版本随着Chrome的发布而发布(具体时间为2008年9月2日)。在运行JavaScript之前,相比...

4435
来自专栏码洞

深入理解 RPC 消息协议设计

本节我们开始讲解 RPC 的消息协议设计背后的基本原理,了解 RPC 的协议开发背后有哪些需要考虑的基本点。在通晓原理之后,我们就可以自己设计一套协议来开发属于...

1413
来自专栏Java架构师进阶

Java 10 新特性全览

在 Java 9 之后,Java 将采用基于时间发布的策略,每 6 个月一个版本。目前,Java 10 的新特性都已经确定。

914
来自专栏软件开发

前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

一、前端MVC概要 1.1、库与框架的区别 ? 框架是一个软件的半成品,在全局范围内给了大的约束。库是工具,在单点上给我们提供功能。框架是依赖库的。Angula...

33510
来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb08-XML,tomcat,HTTP轻松入门

XML&tomcat&HTTP 一.XML基础知识 1. xml介绍 XML 指可扩展标记语言(EXtensible Markup Language),也是一种...

4079
来自专栏从零开始学自动化测试

Selenium2+python自动化44-元素定位参数化(find_element)

前言 元素定位常用的有八种方法,这个能看到这一篇的小伙伴都知道了,那么有没有一种方法,可以把常用的八种定位合为一种呢?也就是把定位的方式参数化,如id,name...

3465
来自专栏程序你好

C# API中的模型和它们的接口设计

952

扫码关注云+社区

领取腾讯云代金券