Talk is cheap, show you the code.|

宇星海

园龄:2年5个月粉丝:0关注:6

2024-12-10 13:00阅读: 99评论: 0推荐: 0

XSS-Labs闯关

零、闯关前说明

0.1 进度说明

0.1.1 第一阶段

level 1 ~ level 10

0.1.2 第二阶段

level 11 ~ level 20

0.2 闯关环境配置说明

  1. 服务器工具:windows版本PHPstudy2018
  2. xss-Labs下载:xss-labs
  3. 将下载好的xss-Labs解压后修改名称为”xss-labs“并放置在phpstudy文件夹的以下目录中:./phpStudy/PHPTutorial/WWW/
  4. 在浏览器中访问如下网址:http://localhost:80/xss-Labs/即可访问该闯关项目。

0.3 闯关方式说明

  1. 在实际中,我们很难看到后端的PHP代码,因此,本Lab尽可能采用“观察现象及HTML源码推理后端代码从而构造XSS攻击”的解题方式。
  2. 在做题时,请使用F12打开浏览器开发者工具,一边测试一边观察HTML源码。
  3. 需要强调一点,反射型XSS攻击方式为:发送一个构造好的恶意URL给受害者,当受害者点击该恶意URL时受到XSS攻击,因此,我们的目的是构造出一个包含恶意payload的URL。

level 1

分析

  1. 首先观察URL和网页内容,发现URL中的输入的name参数值会直接被嵌入到HTML源码中并从服务端反馈到用户浏览器,同时,在name参数中输入一段测试JavaScript代码发现,后端PHP将用户输入嵌入HTML源码中时并没有将用户输入实体化,即JavaScript脚本能顺利执行。因此这是一个典型的反射型XSS漏洞。
    level 1 浏览器页面
  2. 关于“HTML实体化”
    1. 在 HTML 中,一些字符有特定的意义。例如,< 和 > 用于标记 HTML 标签的开始和结束。如果你想在网页中显示这些字符而不是把它们解释为 HTML 标签,你需要使用它们的实体表示法,即 & lt; 和 & gt;。同样的道理也适用于双引号。双引号在 HTML 属性值中非常常见,如果直接使用,可能会造成语法错误。因此,HTML 提供了 & quot; 来表示双引号。
    2. HTML 实体通常以 & 开始,以 ; 结束,中间是特定字符的名称或编号。& quot; 是表示双引号的名称实体。
    3. 为什么需要实体?
      1. 避免语法冲突;字符编码兼容性;安全性——防止XSS攻击;

解决

  1. 直接在URL的name参数后添加< script >标签及JavaScript代码。
    完成反射型XSS攻击

level 2

分析

  1. 页面中存在一个提交的对话框,对话框在HTML源码中是< input >标签,
    level 2 浏览器界面
  2. 我们仿照level 1 的方式,在keyword参数后添加JavaScript代码,发现并不能完成反射型XSS攻击,同时发现,input框中出现了我们构造的JavaScript代码,如下图所示
    仿照level 1 实施反射型XSS攻击后的页面情况
  3. 因此我们可以断定,后端PHP将用户输入嵌入HTML的< h1 >标签时,将用户输入进行了实体化处理,因而JavaScript代码无法在< h1 >标签中执行;在此期间,用户输入的值同时被放入了input标签的value属性之中,因此猜测PHP代码如下
<?php
session_start();
&name = isset($_GET['name']) ? $_GET['name'] : '';
?>
<input name="name" value="<?php echo $name; ?>"> //该input标签将会作为HTML源码的一部分返回到客户端。

解决

  1. 利用用户输入中的字符"闭合input标签中的value属性,使用字符>闭合input标签。
  2. 在上述两个字符后插入恶意JavaScript脚本,如<script>alert(document.cookie)</script>用于弹出包含用户关于该网页cookie信息的弹窗,如此便顺利构造出一个XSS攻击。
  3. 因此,我们将"><script>alert(document.cookie)</script>用作用户输入,服务端将该输入放入< input >标签,当客户端加载服务端返回的HTML源码后,恶意JavaScript代码将顺利运行。
    完成反射型XSS攻击

level 3

分析

  1. 在看到同level 2 的页面情况后,尝试使用相同的反射型XSS攻击,发现服务器虽然将恶意JavaScript代码嵌入在了HTML源码的input标签的value属性中并发送给了客户端浏览器,但浏览器并没有执行嵌入恶意JavaScript代码。
    level 3 浏览器界面
  2. 这就说明,在后端PHP源码中,将用户的输入嵌入到input标签的value属性中时并不是使用<input name="name" value="<?php echo $name; ?>">嵌入的。
  3. 查看HTML源码,再次单独尝试使用"尝试闭合value属性,使用>闭合input标签,发现在HTML源码中并不能有效地闭合value属性和input标签,即在HTML源码中,双引号和字符“>”也被看作是一个输入,因此我猜测可能是双引号与字符“>”被转义了,所以想使用反转义来闭合value属性。
    1. 转义:将字符转换成“&xx;”的形式。
      查看尝试使用">闭合input标签的HTML源码情况
  4. 我们在地址栏的URL中使用&quot来代替双引号,使得输出到HTML中的双引号能够被反转义后正常显示,结果发现,value属性后面确实没有我们的输入了。
    value属性不再显示输入
  5. 但这里存在一个问题,尽管input标签成功闭合,但是我们输入中的JavaScript代码却没有被嵌入到HTML源码中。
    1. 通过单纯在搜索框中输入<script>,我们发现,服务端和客户端并没有对<script>进行过滤,因此造成该问题的原因并非对输入的过滤。
    2. 同时,细想双引号的转义&quot;,字符“&”在URL中岂不是多个查询参数之间的分隔符?那么“&”后面自然就不能算是keyword的值,返回的HTML源码中自然也不会包含用户输入喽,因此,我尝试仅仅在输入框中输入“&”,结果发现,返回的HTML源码中果然没有字符“&”,这就说明,所谓的导致input标签闭合的原因不是转义字符&quot;,而是因为在URL中,输入“&”后,该字符后面的内容被当作另一查询参数,不再是作为用户输入发送到服务端。因此,尝试反转义也就无望了。
  6. 既然双引号闭合value属性不太行,单引号呢?
    输入为单引号的情况
  7. 我发现,输入为单引号时,value属性后面没有等号,同时不远处留存了一个小小的单引号。
  8. 从这里猜测,在PHP源码中,input标签内的构造可能是这样子的<input name="name" value='<?php echo $name; ?>'>,如果输入仅为一个单引号,那么value属性的右半部分单引号无人闭合,自然孤零零存在于input属性中。为了验证猜想,我们再增加一个数字输入尝试。
    输入一个单引号=数字1
  9. 由此可以看出,猜想是正确的。
  10. 针对猜测的PHP源码<input name="name" value='<?php echo $name; ?>'>,如果想让value属性及input标签闭合,自然要构造如下恶意输入:'><script>alert(1)</script>,将其输入发送后,情况如下:
    输入'>alert(1)后的情况
  11. 观察HTML源码,发现闭合value属性后,剩下的JavaScript代码部分符号都被转义从而无法构成JavaScript代码了,因此我们欲尝试反转义来解决,但使用反转义就得使用符号“&”,而上文已说过,在URL中符号”&“的含义,因此反转义功能算是彻底用不上了,这也就意味着我们虽然能闭合value属性,但没办法闭合input标签。
  12. 既然在后端PHP中转义的都是“<”,“>”字符,那有没有办法在不使用“<”,“>”符号的情况下同时在input标签内运行JavaScript代码呢?答案是添加input标签中的属性。
  13. 我们添加一个onclick事件属性,onclick事件会在元素被点击时发生,而我们让这个事件发生时,运行我们植入的恶意JavaScript代码,即将恶意JavaScript代码作为onclick属性的值。因此构造输入为:'onclick='alert(1)(注意:onclick属性的值的左单引号由我们输入,而右单引号则由value属性中未闭合的孤立的右单引号来构成),测试发现,OK。

解决

  1. 构造payload为'onclick='alert(1),其中,payload最左侧单引号用于闭合value属性,onclick='alert(1)用于在input标签内建立一个事件对象,当点击input标签时触发事件,同时执行onclick中的参数,即恶意JavaScript代码。
    完成反射型XSS攻击

level 4

分析

  1. 与level 3 几乎相同,只是后端PHP中input标签内的value属性值由双引号包裹而非level 2 中的单引号。

解决

  1. 构造payload"onclick="alert(1),点击输入框即可触发恶意JavaScript代码。
    完成反射型XSS攻击

level 5

分析

  1. 第一种进攻方式:构造与level 4 相同的payload,现象如下
    构造与level 4 相同的payload后的现象
  2. 观察现象发现,虽然我们输入的是onclick,但是后端将输入的内容做了修改,即将onclick改为o_nclick后才放入input标签中。
  3. 通过增加字符“on”的个数,发现只要是“on”字符都会被后端改为“o_n”后再放入input标签中,而文本标签处显示的内容与我们输入的内容相同,这是典型的通过检测可疑的字符串来做攻击检测的静态特征过滤方式,在本例中,可疑的字符串即为“on”。
  4. 第二种进攻方式:即构造"><script>alert(1)</script>。显示结果如下,只能说,乱七八糟。
    构造
  5. 第三种进攻方式:借鉴他人思路】嵌入超链接标签< a >,并在标签< a >的href属性中写入恶意JavaScript伪代码。
    1. 但我个人总觉得完成的不够漂亮,当然,形成一个超链接也没有问题,比如诱惑性较强的超链接会有不少人不以为意而去点击
    2. 我希望是有种方法能绕过PHP后的特征过滤机制。【待补充】

解决

  1. 第三种进攻方式的payload为:"><a href="javascript:alert(1);">
    完成反射型XSS攻击

level 6

分析

  1. 挨个尝试【一、闯关过程中使用过的XSS攻击方法】中的方法二到方法三,其中方法二显示结果与level5的第一种进攻方式结果相同,而方法三攻击结果如下图所示
    方法三攻击结果
  2. 可以看出,后端PHP对< a >标签中的href属性也存在特征过滤。总体来说,当前level 6 包含对script,onfunction,href三类关键字的特征过滤。
  3. 在level 4/5中,后端PHP还对用户输入做了全小写转换,因此想利用改变大小写来绕过特征过滤失败了,然而,在level 6中,改变输入的大小写成功了,这说明后端PHP对用户输入的大小写没有进行检查,进而形成了一个漏洞。
    改变输入的大小写进而绕过特征过滤

解决

  1. 方法三构造的payload为<a Onclick="alert(1)">
  2. 虽然后端PHP对字符串“oncilck”存在特征过滤,但是却遗漏了大小写改变的情况,而HTML对大小写是不敏感的,因此我们将onclick事件对象的首字母改为大写,进而绕过特征过滤。攻击结果如下
    方法二:完成反射型XSS攻击
    方法三:完成反射型XSS攻击
  3. 经过多次尝试后,发现无论是方法二还是方法三,都可以使用以往的所有方法仅通过改变大小写便能绕过所有的特征过滤,进而完成XSS攻击。

level 7

分析

  1. 使用方法三后发现href属性直接消失了(被过滤掉了),而使用方法二后,onfunction中的字符"on"消失不见,< script >标签中的字符“script”同样消失;上述payload字段改变大小写后同样消失,说明PHP对用户输入大小写也做了转换处理。
    使用方法三进行攻击:href属性消失
    使用方法二进行攻击:onclick事件对象中的字符"on"消失
    使用方法二进行攻击:标签中的“script”字符消失
  2. 在尝试了各种事件处理程序及构造标签后发现,后端PHP对该类攻击方式的防御很充分,将各种可能的构造攻击字符都过滤了。
  3. 回到方法二,既然PHP的过滤之一是将on字符删去,那么我们可以将onclick事件对象写成“oonnclick”样式,当PHP将字符“on”删去后,我们就顺利构建了onclick事件对象。

解决

  1. 使用方法二:payload为:"oonnclick="alert(1),利用后台PHP删去字符“on”的静态特征过滤机制,帮助我们完成onclick事件对象的建立。攻击结果如下
    方法二:完成反射型XSS攻击

level 8

分析

  1. 首先发现无论是单引号还是双引号均无法闭合value属性,因此方法二至三在input标签中无法起到作用。
  2. 观察发现,后端PHP将用户输入同时嵌入到了< a >标签的href属性中。
  3. 尝试构造JavaScript伪代码javascript:alert(1);,攻击测试结果如下
    构造JavaScript伪代码的攻击测试结果
  4. 可以发现,后端PHP中对字符“script”做了静态特征过滤,并且通过测试发现,level 8 同时存在对属性字符如“href”、“onclick”等的静态特征过滤。
  5. 不过,href存在一个隐藏属性:可对href内的文本自动Unicode解码。
  6. 因此,我们可以将恶意JavaScript代码先进行Unicode编码后作为输入传递给href属性,从而绕过后端PHP的静态特征过滤机制。

解决

  1. 构造payload为:javascript:alert(1);,接着将其进行Unicode编码,可使用在线工具
  2. 编码后的payload为:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;
  3. 但是注意,我们不能直接将上述的payload用于构建恶意URL,原因为:在上文中我们曾提到过转义时的字符“&”在URL中是查询条件的分隔符,因此如果直接将该payload用于构建恶意URL,则浏览器会将payload中的字符“&”当作查询条件的分隔符解释。
  4. 因此,我们在对payload进行Unicode编码后,还需要对Unicode编码后的内容进行URL编码,可以使用该编码工具
    1. 由于URL常常会包含ASCII集合之外的字符,URL必须转换为有效的ASCII格式。而字符“&”的URL编码即为“%26”,字符“#”的URL编码即为“%23”.关于URL编码更细致的内容请见菜鸟教程
      在搜索框中输入字符“&”
      在地址栏中输入字符“&”
  5. 综上,我们先进行Unicode编码后,再进行URL编码最终得到的payload为:%26%23106%3b%26%2397%3b%26%23118%3b%26%2397%3b%26%23115%3b%26%2399%3b%26%23114%3b%26%23105%3b%26%23112%3b%26%23116%3b%26%2358%3b%26%2397%3b%26%23108%3b%26%23101%3b%26%23114%3b%26%23116%3b%26%2340%3b%26%2349%3b%26%2341%3b%26%2359%3b
  6. 将payload用作URL中keyword参数的值,即可顺利实现恶意JavaScript代码嵌入。攻击结果如下
    完成反射型XSS攻击

level 9

分析

  1. 首先简单输入“123”,发现HTML源码中,只有input标签内显示了用户输入。
    简单输入“123”后的HTML源码
  2. 其次,无论单/双引号均无法闭合value属性。
  3. 再次观察页面文本及HTML源码,< a >标签中的href属性是一段文字“您的链接不合法?有没有”,同时浏览器页面中,button按钮的文字是添加友情链接。
  4. 依据以上页面内容,我们在搜索框中输入一个合法网址http://www.baidu.com尝试,发现该输入被顺利嵌入到了< a >标签的href属性中。这就说明,后端PHP对输入存在一个判断过程,即如果输入符合URL格式,则可被送入到< a >标签的href属性中,否则只作为input标签的value属性值,同时< a >标签的href显示“您的链接不合法?有没有”。
  5. 通过变换输入发现,只要用户输入中包含字符串“http://”,后端PHP就会认为该输入是合法的URL。
    包含http://的非法URL输入
  6. 因此,我们的目标便是让一个恶意的JavaScript代码包含字符串“http://”嵌入href属性中。
  7. 因此,我们可以构造payload为:javascript:alert(1);/*http://*/注释符中的内容不影响JavaScript代码的执行
    构造payload为:
  8. 可以看到,用户输入被显示到href属性中了,且在JavaScript中“斜杠+星号”是一个段落注释符,因此字符串“http://”不会影响JavaScript代码的执行。由于字符“script”被静态特征过滤给替换掉了,因此我们仿照level 8 ,利用href隐含的Unicode解码属性,将输入进行Unicode编码,又由于我们的输入中必须明确含有字符串“http://”(如果在输入时就对该字符串进行编码,后端PHP检测输入时并不会解码,从而第一时间无法检测到该字符串,因此会报出输入不合法),因此我们对除了字符串“[/http:///]”外的内容进行编码,编码后的内容为:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;/*http://*/
  9. 为了将payload嵌入URL,我们还需仿照level 8 的解决方式对进行过Unicode编码的payload再进行URL编码。最终构造出的payload为:%26%23106%3b%26%2397%3b%26%23118%3b%26%2397%3b%26%23115%3b%26%2399%3b%26%23114%3b%26%23105%3b%26%23112%3b%26%23116%3b%26%2358%3b%26%2397%3b%26%23108%3b%26%23101%3b%26%23114%3b%26%23116%3b%26%2340%3b%26%2349%3b%26%2341%3b%26%2359%3b%2f*http%3a%2f%2f*%2f。测试攻击结果如下
    测试攻击结果

解决

  1. 构造payload为%26%23106%3b%26%2397%3b%26%23118%3b%26%2397%3b%26%23115%3b%26%2399%3b%26%23114%3b%26%23105%3b%26%23112%3b%26%23116%3b%26%2358%3b%26%2397%3b%26%23108%3b%26%23101%3b%26%23114%3b%26%23116%3b%26%2340%3b%26%2349%3b%26%2341%3b%26%2359%3b%2f*http%3a%2f%2f*%2f
  2. 由于后端PHP中包含对字符串“script”的静态特征过滤机制,因此需要对用户输入进行Unicode编码。
  3. 只有当用户输入中显式包含字符串“http://”时,后端PHP才认为该输入为合法URL,因此编码内容修改为“仅对除字符串“http://”外的内容进行Unicode编码。
  4. 在JavaScript中,“斜杠+星号”是一个段落注释符,不影响JavaScript的执行。
  5. 由于最终目标是构建出一个包含payload的URL,因此还需对进行过Unicode编码的payload进行URL编码。
    完成反射型XSS攻击

level 10

分析

  1. level 10 和以往的level均有所不同,显示如下
    level 10的显示页面
  2. 我们看到,地址栏中有keyword参数,参数中的内容被后端PHP转换为文本类型后嵌入到HTML源码中的h2标签并返回到浏览器。我们试着对keyword参数进行一些修改尝试。
  3. 通过修改keyword参数的值,我们发现除了h2标签中的内容发生了一些改变外,其余部分纹丝不动。
  4. 继续观察HTML源码,在form标签中的三个input标签吸引了我的注意。三个input标签的value属性均为空值,type属性均为hidden。因此,我依次利用“删去一个input标签中的type属性值,并在显示的输入框中输入一些信息“方法,发现在name=“t_sort”的input中,当有用户输入时value值会发生变化,同时检测到后端PHP对用户输入中的字符“>”、“<”存在静态特征过滤机制,这就说明我们可以闭合value属性,但无法闭合input标签。
    在name=“t_sort”的input中输入字符串后发生的变化
  5. 以上测试说明我们可以利用name=“t_sort”的input构造相应的XSS攻击。
  6. 再次强调!反射型XSS攻击的定义为:发送一个构造好的恶意URL给受害者,当受害者点击该URL时受到XSS攻击;因此我们的最终目标是构造出一个包含payload的恶意URL。
  7. 综上,我们可以尝试构造URL为:http://localhost/xss-labs/level10.php?t_sort="type=""onclick="alert(1)"
  8. 上述构造的URL中参数说明如下
    1. 首先指明我们想修改的参数,即t_sort=。后续所有的内容都会被后端PHP认作name=“t_sort”的input标签的value属性值;
    2. 第一个数据:“ " ”双引号用于闭合value属性;
    3. 第二个数据:type=""用于将name=“t_sort”的input标签修改为用户可见类型,即覆盖掉原有的type="hidden";
    4. 第三个数据:onclick="alert(1)",当用户点击该输入框时,触发XSS攻击。

解决

  1. 构造恶意URL为:http://localhost/xss-labs/level10.php?t_sort="type=""onclick="alert(1)"
  2. 攻击结果如下
    完成反射型XSS攻击

level 11

分析

  1. 观察本关HTML源码发现一个有趣的现象。如下图所示:id=t_ref的input标签中的value值等于上一关我们构造出的恶意URL。
    level 11中的有趣现象
  2. 从id、value值及跳转现象可以看出,该value值实际上就是该HTTP请求报文头的Referrer值,即指示该页面是由哪个页面跳转而来的。也就是说,level 10页面构造了一个HTTP请求报文,并在请求头的Referrer中写明了自己的URL,而后端PHP接收到请求报文后,将Referrer中的信息嵌入到了id=t_ref的input标签中的value值中。
  3. 其余标签经过与level 10相同的测试后发现并没有对其标签内的value产生什么影响。
  4. 为此,当前我们能够利用的只有id=t_ref的input标签中的value值,由Referrer被添加到HTML源码中的过程可以想到,我们能够截获从level 10发起的请求,同时修改HTML请求报文中的Referrer值,构造一个恶意payload从而使服务端将Referrer中的值嵌入id=t_ref的input标签的value值中,返回HTML源码后使得客户端受到XSS攻击。

解决

  1. 我们使用Burpsuite软件截获请求包。
    1. 设置代理服务器为Burpsuite的listener
      Burpsuite的listener
    2. 注意!必须通过本机的IP访问PHPstudy才能使用Burpsuite捕获到数据包。即闯关时的URL格式需修改为[ip address]/xss-labs/...
  2. 截获的由level 10发起的请求报文如下
    截获的由level 10发起的请求报文
  3. 可以看到,请求头中的Referrer项包含了level 10的URL。
  4. 使用Burpsuite软件将Referrer修改为"type=""onclick="alert(1)",点击Forward放行该请求,得到的响应HTML源码如下
    修改Referrer后响应的HTML源码
  5. 点击input输入框,完成XSS攻击
    完成反射型XSS攻击

level 12

分析

  1. 观察到id=t_ua的input标签中的value值,明显看出,这是将请求报文中的User-Agent信息嵌入到了该标签的value值中。

解决

  1. 方法同level 11,先截获请求报文,后修改信息并发送报文。
  2. 构造payload,将User-Agent修改为:"type=""onclick="alert(1)"
    完成反射型XSS攻击

level 13

分析

  1. 查看HTML源码发现多了个cookie的input标签,因此可仿照level 11和level 12解决。

解决

  1. 截获请求报文,修改cookie信息并发送报文。
  2. 构造payload,将Cookie修改为:"type=""onclick="alert(1)"
    完成反射型XSS攻击

level 14

分析

  1. 这关主要涉及的漏洞是exif xss漏洞。
    1. exif是可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
    2. 有些网站有读取图片exif信息的功能,当网站读取到的恶意的exif信息就会触发这个payload
  2. 我们右键图片选择属性,点击详细信息就可以看到exif的相关属性。
  3. 我们可以在这些属性里面添加XSS代码,然后上传图片实现弹窗。

解决

  1. 待复现

level 15

分析

  1. 测试发现,在参数src中输入的内容会被嵌入到右下角的< !>HTML元素中
    测试信息
  2. ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号。

解决

  1. 在PHPstudy文件夹的xss-labs目录下创建一个html文件,命名为level15.html。
  2. level15.html文件内容如下
    level15.html文件内容
  3. level 15的URL中,构造payload为:"http://10.5.230.34/xss-labs/scr_ipt/15.html"
  4. 点击出现的输入框,触发onclick事件,完成XSS攻击
    完成反射型XSS攻击

level 16

分析

  1. 一些特殊字符被后端PHP用&nbsp(即常规空格)替换了。
  2. 多尝试了一些特殊符号后,发现使用回车符号不会被替换为&nbsp。

解决

  1. 由分析可知,由于URL中无法直接输入回车,因此对换行符编码,回车(换行)的URL编码为%0a
  2. 构造payload为:<input%0aonclick="alert(1)">
  3. 出现input输入框,点击输入框完成XSS攻击
    完成反射型XSS攻击

level 17

分析

  1. 观察HTML源码,发现< embed >标签。
    1. < embed > 标签定义了一个容器,用来嵌入外部应用或者互动程序(插件)。
       标签中嵌入图片或HTML页面
  2. level 17在页面中嵌入了一个插件。
  3. 按照原本PHP源码,如果想通过本关,则需要用一个支持flash插件的浏览器打开本关(打开后会有个图片出来的,不支持flash插件浏览器就没有)。
  4. 如果不想下载flash插件的话,自己去后端改一下也行,即将后端第十七关的代码(level17.php)指向的swf文件改为index.png。
  5. 修改后的页面及HTML源码如下
    修改后的页面及HTML源码
  6. 在embed标签中构造一个事件属性,即利用方法二闯关。

解决

  1. 构造payload为:arg01=a&arg02=b%20onclick=alert(1)
    完成反射型XSS攻击

level 18

分析

  1. 同level 17,改后端PHP源码。

解决

  1. 构造payload为:arg01=a&arg02=b%20onclick=alert(1)
    完成反射型XSS攻击

level 19

分析

  1. 这关用到的是Flash Xss注入。
    1. 就是往Flash里面插入一段js代码,然后手动执行
  2. Flash xss了解一下就行,现在许多浏览器都用不上flash插件了。
  3. 本题跳过,重点在于掌握XSS的基础思想及方法,故不再在本类型题中花费时间。

level 20

分析

  1. 这关同样用到的是Flash Xss注入,故跳过处理。

解决

  1. 关于Flash XSS注入可参考文章:CSDN:XSS-labs Level 20 Flash XSS

一、闯关过程中使用过的XSS攻击方法

方法一:直接注入法

方法概述

  1. 由于PHP源码直接将用户输入的数据嵌入在HTML源码中,因此可在输入数据中写入JavaScript代码从而使返回的HTML源码运行恶意JavaScript脚本,从而完成反射型XSS攻击。

完成题

  1. level 1;

方法二:闭合标签或属性->添加事件属性及恶意代码法

方法概述

  1. 浏览器页面存在搜索框;
  2. 用户将数据写入搜索框后,后端PHP将用户输入放入input标签的value属性中;
  3. 攻击方法
    1. 攻击方案一:我们可通过闭合value属性,同时添加事件属性(如onclick)并将恶意代码存入事件属性中,进而在HTML源码返回后触发事件,进而运行恶意脚本。
    2. 攻击方案二:我们可通过闭合value属性及input标签,同时添加< script >标签及恶意代码来实现反射型XSS攻击。
    3. 攻击方案三:假如后端PHP存在静态特征过滤机制,且该过滤机制为删去某一特定字符,则我们可以利用该机制帮助我们构建恶意JavaScript代码,举例如level 7。

完成题

  1. level 2【同时闭合value及input】
  2. level 3/4【闭合value并添加事件属性】

方法三:添加标签法

方法概述

  1. 浏览器页面存在搜索框;
  2. 用户将数据写入搜索框后,后端PHP将用户输入放入input标签的value属性中;
  3. 后端存在特征过滤函数,过滤如script、on等字符;
  4. 闭合value属性及input标签,同时添加一个超链接< a >标签,在超链接标签中嵌入恶意JavaScript伪代码;
  5. 当HTML源码返回后,受害者点击超链接,进而触发恶意代码;
  6. 当后端PHP中存在对输入的静态特征过滤时
    1. 由于< a >标签中的href属性隐含对文本自动进行Unicode解码,因此可以通过对输入进行Unicode编码方式绕过对输入的静态特征过滤机制。

方法四:使用Burpsuite抓取请求包并注入payload

二、参考资料

  1. CSDN:xss-labs靶场实战全通关详细过程(xss靶场详解)

本文作者:宇星海

本文链接:https://www.cnblogs.com/Yu-Xing-Hai/p/18597179/XSS-Labs

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   宇星海  阅读(99)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起