PHP和XSS跨站攻击

 更新时间:2016年11月25日 15:26  点击:1411

如何攻击,在此不作说明(也不要问我),主要谈谈如何防范。首先,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用htmlentities() 。

<?php
$str = "A ''''quote'''' is <b>bold</b>";

// Outputs: A ''''quote'''' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>


这样可以使非法的脚本失效。
 
但是要注意一点,htmlentities()默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。这个问题我先找几个站点测试后再说。

这里提供一个过滤非法脚本的函数:

function RemoveXSS($val) {
   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
   // this prevents some character re-spacing such as <java\0script>
   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
   $val = preg_replace(''''/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/'''', '''''''', $val);
   
   // straight replacements, the user should never need these since they''''re normal characters
   // this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
   $search = ''''abcdefghijklmnopqrstuvwxyz'''';
   $search .= ''''ABCDEFGHIJKLMNOPQRSTUVWXYZ'''';
   $search .= ''''1234567890!@#$%^&*()'''';
   $search .= ''''~`";:?+/={}[]-_|\''''\\'''';
   for ($i = 0; $i < strlen($search); $i++) {
      // ;? matches the ;, which is optional
      // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
   
      // &#x0040 @ search for the hex values
      $val = preg_replace(''''/(&#[x|X]0{0,8}''''.dechex(ord($search[$i])).'''';?)/i'''', $search[$i], $val); // with a ;
      // &#00064 @ 0{0,7} matches ''''0'''' zero to seven times
      $val = preg_replace(''''/(&#0{0,8}''''.ord($search[$i]).'''';?)/'''', $search[$i], $val); // with a ;
   }
   
   // now the only remaining whitespace attacks are \t, \n, and \r
   $ra1 = Array(''''javascript'''', ''''vbscript'''', ''''expression'''', ''''applet'''', ''''meta'''', ''''xml'''', ''''blink'''', ''''link'''', ''''style'''', ''''script'''', ''''embed'''', ''''object'''', ''''iframe'''', ''''frame'''', ''''frameset'''', ''''ilayer'''', ''''layer'''', ''''bgsound'''', ''''title'''', ''''base'''');
   $ra2 = Array(''''onabort'''', ''''onactivate'''', ''''onafterprint'''', ''''onafterupdate'''', ''''onbeforeactivate'''', ''''onbeforecopy'''', ''''onbeforecut'''', ''''onbeforedeactivate'''', ''''onbeforeeditfocus'''', ''''onbeforepaste'''', ''''onbeforeprint'''', ''''onbeforeunload'''', ''''onbeforeupdate'''', ''''onblur'''', ''''onbounce'''', ''''oncellchange'''', ''''onchange'''', ''''onclick'''', ''''oncontextmenu'''', ''''oncontrolselect'''', ''''oncopy'''', ''''oncut'''', ''''ondataavailable'''', ''''ondatasetchanged'''', ''''ondatasetcomplete'''', ''''ondblclick'''', ''''ondeactivate'''', ''''ondrag'''', ''''ondragend'''', ''''ondragenter'''', ''''ondragleave'''', ''''ondragover'''', ''''ondragstart'''', ''''ondrop'''', ''''onerror'''', ''''onerrorupdate'''', ''''onfilterchange'''', ''''onfinish'''', ''''onfocus'''', ''''onfocusin'''', ''''onfocusout'''', ''''onhelp'''', ''''onkeydown'''', ''''onkeypress'''', ''''onkeyup'''', ''''onlayoutcomplete'''', ''''onload'''', ''''onlosecapture'''', ''''onmousedown'''', ''''onmouseenter'''', ''''onmouseleave'''', ''''onmousemove'''', ''''onmouseout'''', ''''onmouseover'''', ''''onmouseup'''', ''''onmousewheel'''', ''''onmove'''', ''''onmoveend'''', ''''onmovestart'''', ''''onpaste'''', ''''onpropertychange'''', ''''onreadystatechange'''', ''''onreset'''', ''''onresize'''', ''''onresizeend'''', ''''onresizestart'''', ''''onrowenter'''', ''''onrowexit'''', ''''onrowsdelete'''', ''''onrowsinserted'''', ''''onscroll'''', ''''onselect'''', ''''onselectionchange'''', ''''onselectstart'''', ''''onstart'''', ''''onstop'''', ''''onsubmit'''', ''''onunload'''');
   $ra = array_merge($ra1, $ra2);
   
   $found = true; // keep replacing as long as the previous round replaced something
   while ($found == true) {
      $val_before = $val;
      for ($i = 0; $i < sizeof($ra); $i++) {
         $pattern = ''''/'''';
         for ($j = 0; $j < strlen($ra[$i]); $j++) {
            if ($j > 0) {
               $pattern .= ''''('''';
               $pattern .= ''''(&#[x|X]0{0,8}([9][a][b]);?)?'''';
               $pattern .= ''''|(&#0{0,8}([9][10][13]);?)?'''';
               $pattern .= '''')?'''';
            }
            $pattern .= $ra[$i][$j];
         }
         $pattern .= ''''/i'''';
         $replacement = substr($ra[$i], 0, 2).''''<x>''''.substr($ra[$i], 2); // add in <> to nerf the tag
         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
         if ($val_before == $val) {
            // no replacements were made, so exit the loop
            $found = false;
         }
      }
   }
}

*
 字符串检查类
 *@author  sanshi
    QQ:35047205
    Email:sanshi0815@tom.com
    MSN:sanshi0815@tom.com

*/
class checkBase
{
 function checkBase()
 {
 }
 /*
 用来检查字符串是否为空
 *@param $str 检查的字段
 *@param $isStr 如果字段有可能唯一字符是数字或者bool类型时使用
 为空的时候返回true
 */
 function strIsNull($str,$isStr=true)
 {
  return $isStr?(empty($str)?true:false)
      :(isset($str)?false:true);
 }
 /*
 字符串与正则表达式做比较
 @param $str   要比较的字符串
 @param $pattern     要比对的正则
 与正则比对上了返回true
 */
 function strComparePattern($str,$pattern)
 {
  if(ereg($pattern,$str))
  {
   //找到了返回
   return true;
  }
  return false;
 }
 /*
 判断字符串长短
 @param $str 要检查的字符串
 @param $max 最大长度
 @param $min 最小长度
 符合要求返回true
 */
 function strCompareLen($str,$max,$min=1)
 {
  $len = strlen($str);
  $max=empty($max)?$len:$max;
  return ($len>$max || $len<$min)?false:true;
 }
 /*
 信息处理,跳转到页面
 @param $page     跳转到的页面   
 @param $msg      提示信息
 */
 function msg($page,$msg)
 {
  $msg = empty($msg)?'''''''':"?msg=".base64_encode($msg);
  $url=$page.$msg;
  if(@header("Location:".$url))
  {
     echo "<meta http-equiv=refresh content=''''0;url=".$url."''''>";
  }
  exit();
 }
 
}

 

最近很多朋友都在问我是否能把我那一句话木马隐藏到HTML或图片里,其实把一句话木马插入到PHP文件中就已经很隐蔽了,如果说硬是要放到HTML文件或图片里,就接着往下看的这篇测试报告吧。
 
要知道如果光把PHP语句放到图片里是无论如何也不能执行的,因为PHP只解析扩展名为php的文件。所以说要能使隐藏在图片里的PHP语句执行。我们就的借助PHP中的调用函数 :include 、require 等。

 

我们还记得前些日子把木马隐藏到图片的文章吧。也就是在PHP文件里用include("x.gif")这样的语句来调用隐藏在图片的木马语句。ASP中语句也类似。看似非常隐蔽但直接调用图片对稍微懂点PHP的人就不难发现可疑之处。由于URL 里用GET方式很难传递参数,这就使得插入木马的性能得不到发挥。 Chinaz

Include 函数在PHP中使用的比较频繁,所以引起的安全问题也实在太多,例如PHPWIND1.36的漏洞就是因为include后面的变量没做过滤引起的。由此我们就可以构造类似的语句来插入到PHP文件中。然后把木马隐藏到图片或HTML文件里,可以说隐蔽性就更高了。如在PHPWIND论坛里插入下面的语句:

 

<‘’?@include includ/.$PHPWIND_ROOT;? > 站.长站

一般管理员是无法看出来的。 Chinaz

有了include 函数来辅助帮忙我们就可以把PHP木马隐藏到 诸如 txt、html和图片文件等很多类型的文件里来了。因为txt、html和图片文件这三种类型的文件最无论在论坛还是文章系统里是最为常见的了,下面我们就依次来做测试。 中国站.长.站

首先建立一PHP文件test.php 文件内容为:

以下为引用的内容:
    $test=$_GET['test'];
    @include 'test/'.$test
    ?>
Chinaz@com

Txt文件一般都是说明文件,所以我们把一句话木马放到目录的说明文件里就OK了。随便建立一个TXT文件t.txt。我们把一句话木马粘贴到t.txt文件里。然后访问 hxxp://localhost/test/test.php?test=../t.txt 如果你看到t.txt的内容就证明Ok了, 然后把在lanker微型PHP后门客户端 木马地址添入 hxxp://localhost/test/test.php?test=../t.txt 密码里添入cmd就可以了,执行返回的结果都可以看到。

 

 

对于HTML的文件,一般都为模版文件。为了使插入到HTML的文件的木马能被调用执行而且不被显示出来,我们可以在HTML里加入一个隐藏属性的文本框 ,如: 然后使用方法同上。执行的返回结果一般都可以查看源文件看到。 如使用查看本程序目录功能。查看源文件内容为 我可以得到目录为 C:\Uniserver2_7s\www\test。 Www~Chinaz~com

下面我们说说图片文件,要说最为毒的一招莫过于把木马隐藏到图片里。我们可以直接对一个图片进行编辑,把插入到图片末尾

 

经测试一般都不会对图片造成影响。然后同样方法客户端木马地址添入 

我们查看PHP环境变量 返回的是结果是原图片。

 

这里可能要和我们想象的结果有些差距了,其实命令已经运行了,只是返回的结果看不到而已,因为这是真正的GIF文件,所以是不会显示返回结果的,为了证明是否真的执行了命令我们 执行上传文件命令。果不出所料,文件已经成功上传到服务器上。这样伪造的优点是隐蔽性好。缺点也自然不用说了是没回显。如果你想看到返回的结果,那就拿出记事本伪造一个假的图片文件吧。

 代码如下 复制代码


<?php
/**
* @name date safe class 0.1
* @author kevin xu
* @copyright kenvin E-mail:gincn@cn.cashboxparty.com MSN:gincn@live.cn
*/
interface dateSafe{
 function gincn();
}
class safe extends doSafe implements dateSafe
{
 public $safe;
 function __construct($safe)
 {
  parent::__construct($safe);       //调用父类构造函数,网友javachen找出来的错误
  $this->safe = $safe;
 }
 function gincn()
 {
  $this->safe = parent::xss($this->safe);
  $this->safe = parent::sql($this->safe);
  return $this->safe;
 }
}
class doSafe
{
 protected  $str;
 function __construct($str)
 {
  $this->str = $str;
 }
 function xss()
 {
  $this->str = trim($this->str);         //清理空格字符
  $this->str = nl2br($this->str);         //将换行符转化为<br />
  $this->str = strip_tags($this->str);      //过滤文本中的HTML标签
  $this->str = htmlspecialchars($this->str);    //将文本中的内容转换为HTML实体
  $this->str = addslashes($this->str);      //加入字符转义
  return $this->str;
 }
 function sql()
 {
  $this->str = mysql_escape_string($this->str);
  return $this->str;
 }
}

?>

 

CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。她提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter 可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。

她是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,她可以为 PHP 程序员建立功能完善的 Web 应用程序。如果你是一个与人共享主机并且为客户要求的期限而烦恼的开发人员,如果你已经厌倦了那些傻大笨粗的框架,那么 CodeIgniter 就是你所需要的,如果...

1. 你想要一个小巧的框架。
2. 你需要出色的性能。
3. 你需要广泛兼容标准主机上的各种 PHP 版本和配置(例如 PHP4)。
4. 你想要一个几乎只需 0 配置的框架。
5. 你想要一个不需使用命令行的框架。
6. 你想要一个不需坚守限制性编码规则的框架。
7. 你对 PEAR 这种大规模集成类库不感兴趣。
8. 你不希望被迫学习一门模板语言(虽然可以选择你要求的模板解析器)。
9. 你不喜欢复杂,热爱简单。
10. 你需要清晰、完整的文档。

 

主要更改:

一个数据库工厂类: 对数据库表和字段的维护。
一个增强的 Active Record 类库。
一个新的 Session 类,包含“flash 变量” 和附加的安全性。
一个可扩展的模型类:可自动装载模型。
可扩展的辅助函数,并且增加了新的辅助函数,增强了已有的辅助函数。
一个新的视图架构,它允许更简单的包含多个视图。
超过 120 项增强、改善和 BUG 修正。

下载:http://codeigniter.org.cn/downloads/

[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • 详解前端安全之JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • golang与php实现计算两个经纬度之间距离的方法

    这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
  • php构造方法中析构方法在继承中的表现

    这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
  • PHP如何使用cURL实现Get和Post请求

    这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
  • thinkPHP中多维数组的遍历方法

    这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
  • 一篇文章带你了解kali局域网攻击

    这篇文章主要给大家介绍了kali的局域网攻击,小编觉得这篇文章还是不错的,使用起来也是非常方便的,需要的朋友可以参考下...2021-08-20
  • php预防XSS攻击的一些方法整理

    现在有很多php开发框架都提供关于防XSS攻击的过滤方法,下面和大家分享一个预防XSS攻击和ajax跨域攻击的函数,摘自某开发框架,相比于仅仅使用内置函数应该还是够强了的吧...2016-11-25
  • 谈谈PHP中相对路径的问题与绝对路径的使用

    经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
  • php有序列表或数组中删除指定的值的实现代码

    这篇文章主要介绍了php有序列表或数组中删除指定的值的实现代码,删除给定的值之后,得到一个新的有序列表,长度-1,下面是具体的实现方法...2021-08-22