php代码审计6审计xss漏洞

跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的html代码,从而盗取用户资料,利用用户身份进行某种动作或者对访问者进行侵害的一中攻击方式,为了与层叠样式表的缩写css区分开,跨站脚本通常简写为xss

危害:

盗取用户cookie

蠕虫

查看网页浏览信息

跳转钓鱼网页

挖掘思路:没有过滤的参数,传入到输出函数中,

漏洞思路:搜索内容 发表文章 留言 评论回复 资料设置等

漏洞类型

反射型

非持久型,通过get和post方法,向服务器端输入数据,用户输入的数据通常被放置在url的query string中,或者是from数据中,如果服务器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息呈现给客户,就会造成反射型xss,危害程度普遍认为较小,但是某些会造成严重的后果,如在输入框的name中输入<meta http-equiv="refresh" content="5"/> ,服务器不加处理,将name的值直接发送到浏览器,浏览器会5秒自动刷新一次,严重会导致服务器崩溃

常见场景:

//将前端获取的内容,直接输出到浏览器页面

代码1

<?php

$content = $_GET['content'];

echo $content;

?>

//将前端获取的内容,直接输出到HTML标签

代码2

<?php

$content = $_GET['content'];

?>

<input type="text" value="<?php echo $content?>">

//将前端获取的内容,直接输出到<script>标签

代码3

<?php

$content = $_GET['content'];

?>

<script>

var xss = '<?php echo $content>';

document.write(xss);

</script>

存储型

持久型xsss,通常是因为服务器端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式,将数据呈现在浏览器上,则该xss攻击将一直存在,若其他用户访问该页面,恶意脚本就会被触发,用于盗取其他用户的私人信息

代码4

<form action="" method="post">

<input type="text" name="xss"/>

<input type="submit" value="test"/>

</form>

<?php

$xss=@$_POST['xss'];

mysql_connect("localhost","root","123");

mysql_select_db("xss");

if($xss!==null){

$sql="insert into temp(id,payload) values('1','$xss')";

$result=mysql_query($sql);

echo $result;

}//用户输入的内容没过滤,但是不直接显示在页面中,而是插入到数据库

代码5

mysql_connect("localhost","root","root");

mysql_select_db("xss");

$sql="select payload from temp where ;

$result=mysql_query($sql);

while($row=mysql_fetch_array($result)){

echo $row['payload'];

}//从数据库读取了之前插入的内容,并显示出来

反射型 输入--输出

存储型 输入--进入数据库--取出数据库--输出

DOM型

是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容,结构以及样式,dom型xss是一种特殊的xss,基于dom文档对象模型的一种漏洞

dom型数据流向:url--->浏览器

常见属性:

___________________________________________

输入点 | 输出点 |

document.URL | eval |

document.location | document.write |

document.referrer | document.InnterHTML |

document.form | document.OuterHTML |

......... | ......... |

_______________|___________________________|

代码6

<?php

error_reporting(0); //禁用错误报告

$name = $_GET["name"];

?>

<input );

print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。

</script>

修复方案:对所有输入中的script,iframe等字样进行严格的检查,验证数据的类型及其格式,长度,范围和内容,客户端做数据的验证与过滤,关键的过滤步骤在服务器端进行,检查输出的数据