Pikachu靶场之XSS
Pikachu靶场之XSS
XSS测试流程
1.在目标上寻找可输入点,比如接口、留言板、搜索框之类
2.输入常见poc,如<script>alert(1)</script>,后通过F12页面源代码看看后端是否有对数据进行处理,有的话寻找绕过方法
3.根据源代码构造闭合
4.提交构造的脚本代码,看看是否可以成功执行,成功的话则说明存在xss漏洞
我们的目标就是实现弹窗(‘alert(1)’),接下来是我的pikachu靶场下的xss模块过程记录。
反射型xss(get)
Get简述:用户输入通过URL查询字符串(?name=xxx)传给服务器,参数在地址栏里可见。攻击者可以把恶意 payload 直接构造进 URL,诱导受害者点击链接即可触发。只要受害者点击一个看似正常的链接,payload就会在浏览器执行。
我们先随便输入一个数据,后查看页面源代码回显的地方
这里不需要闭合所以直接输入payload
<script>alert(1)</script>
发现搜索框可输入的长度不够,页面源代码改一下,再提交


成功弹窗!

反射型xss (post)
Post简述:用户输入通过HTTP请求体(表单提交)传给服务器,参数不在URL里暴露。攻击者无法仅靠一个链接完成攻击,因为数据必须在请求体里提交。攻击者需要自己搭建一个自动提交的表单页面,诱导受害者访问该页面,再由JavaScript自动POST到目标站点。
根据提示输入账号密码

剩下的和上一题一样,编写有关cookie的payload
<script>alert(document.cookie)</script>

成功弹窗!
存储型xss
简述:存储型XSS的恶意脚本被永久存储在目标服务器上,任何用户访问受影响的页面时,脚本都会自动执行。所以payload成功后每次点进这个部分或点提交时都会有弹窗。
而前两题的反射型的payload成功后只在当前的响应中出现,这就是区别。
随便输入一个留言信息后查看源代码

这里依旧不需要闭合
<script>alert(1)</script>

成功弹窗
Dom型xss
简述:dom型xss的payload注入和执行全程发生在浏览器端,完全不需要服务端参与拼接。服务端返回的页面源码本身并不包含攻击脚本,但页面前端JavaScript在处理用户输入时,以不安全的方式直接操作DOM,导致了脚本执行。
这里可以看见我们输入的payload原因是我们用的F12,它可以看到浏览器解析HTML+执行所有JS之后当前内存里的DOM树,而用ctrl+U查看页面源代码是看不见我们的payload的,所以依然算dom型。
随便输入后发现其值会回到href里

构造payload
javascript:alert(1)

成功弹窗
先闭合’
‘ onclick=”alert(1)”

成功弹窗
Dom型xss-x
和上一个一样,只不过需要多点一个链接,就不写了。
Xss之盲打
简述:“盲打”是存储型XSS的一种特殊利用场景,是指攻击者提交恶意脚本后,自己在当前页面看不到任何反馈,脚本只在另一类用户(通常是管理员)访问后台时触发。
输入payload
<script>alert(“猜猜我是谁”)</script>

根据提示登录到后台

http://localhost:84/vul/xss/xssblind/xssblind/admin_login.php


这个是之前的弹窗

弹窗成功!
Xss之过滤
简述:开发者可能在输入或输出阶段加了一些过滤,比如删除 <script>、转义部分字符等。这一关就是考验攻击者能否通过变换payload的方式,使过滤规则失效,最终依然触发脚本执行。
输入
<script>alert(1)</script>

发现地下只剩下>
这里源代码看不到被过滤的字符,只能自己推测
尝试payload
"<>'$&#<script>/\

"<>'$&#<sCript>/\

推测他把<script>替换为空,尝试绕过
<sCript>alert(1)</sCript>

查看源码
$html = ''; if(isset($_GET['submit']) && $_GET['message'] != null){ //这里会使用正则对<script进行替换为空,也就是过滤掉 $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']); // $message=str_ireplace('<script>',$_GET['message']); if($message == 'yes'){ $html.="<p>那就去人民广场一个人坐一会儿吧!</p>"; }else{ $html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>"; } }
xss之htmlspecialchars
简述:htmlspecialchars()是PHP中的一个内置函数,用于将特定的HTML字符转换为HTML实体字符,从而防止跨站脚本攻击(XSS)。在HTML中,某些字符如 <, >, ", ' 和 & 具有特殊含义,分别代表HTML的标签、结束标签、字符引用和实体引用。通过将这些字符转换为HTML实体,可以防止它们被浏览器解释为HTML标签或字符引用。
一开始输入和上一关一样的payload
<script>alert(1)</script>
输入被原封不动的返回了,查看源码源码后发现有的字符被转义了

这里开始猜测被转义的字符
尝试payload
"<>'$&#<scr_ipt>/\

搜一下什么是
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ' (单引号)成为 '
- < (小于)成为 <
- > (大于)成为 >
没有&“<>的,想到事件型,这里还是需要闭合的
‘onclick=’alert(111)’

‘onfocus=’alert(111)’

xss之href输出
简述:href属性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和 JavaScript代码段。如果用户选择了<a>标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的URL所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表;也就是说可以直接输入javascript代码段执行。
查看提示

查看源码

输入
javascript:alert(1)

这里思考了为什么不能用事件型进行xss触发
查看源码发现引号被转义了

a标签的href属性的值属于URL,根据URL规范对href的值进行URL解码;而onclick是事件处理器属性,它属于JavaScript代码,浏览器不会对它进行URL解码
所以不行
xss之js输出
简述:用户输入被服务端直接拼接到了<script>标签内的JavaScript代码中,而不是普通的HTML文本或属性里。
这里根据提示查看源码发现隐藏值tmac部分

闭合再构造语句
一个是script闭合,一个是用;和注释闭合
m'</script><script>alert(666)</script>

';alert('xss');//

弹窗成功!

pikachu靶场下的xss模块的实践记录
浙公网安备 33010602011771号