漏洞无非这么几类,XSS、sql注入、命令执行、上传漏洞、本地包含、远程包含、权限绕过、信息泄露、cookie伪造、CSRF(跨站请求)等。 这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何有效防止这些漏洞。 命令执行 对于命令执行,可以从关键字入手,总共可分为3类 (1) php代码执行 :eval等 (2)shell命令执行:exec、passthru、system、shell_exec等 (3) 文件处理 3.上传漏洞 对于上传漏洞,也是重点关注的地方,要仔细分析它的处理流程,针对上传的绕过方式是很多的,最保险的方式:在保存文件是采用文件名随机命名和后缀白名单方式。 (phpddt.com)就有一篇文章:关于PHP防止漏洞策略 ,介绍了register_globals 的危害以及魔术引用Magic Quotes使用说明。
下面是 第3篇代码审计文章:
Day 3 - Snow Flake
题目叫做雪花,代码如下:
?
漏洞解析 :
这段代码中存在两个安全漏洞。 我们再来说说第二个漏洞。在上图第9行中,我们发现实例化类的类名和传入类的参数均在用户的控制之下。攻击者可以通过该漏洞,调用PHP代码库的任意构造函数。 修复建议
关于PHP中XXE漏洞的修复,我们可以过滤关键词,如: ENTITY 、 SYSTEM 等,另外,我们还可以通过禁止加载XML实体对象的方式,来防止XXE漏洞(如下图第2行代码),具体代码如下 Day3 的分析文章就到这里,我们最后留了一道CTF题目给大家练手,题目如下:
// index.php
<?
';
}
// f1agi3hEre.php<?php$flag = "HRCTF{X33_W1tH_S1mpl3Xml3l3m3nt}";?
1.MD5 compare漏洞 PHP在处理哈希字符串时,会利用”! 在所有php认为是int的地方输入string,都会被强制转换 15.serialize 和 unserialize漏洞 1.魔术方法 这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧 > 16.session 反序列化漏洞 主要原因是 ini_set(‘session.serialize_handler’, ‘php_serialize’); ini_set(‘session.serialize_handler //a:1: //ini_set('session.serialize_handler', 'php');//a|s:3:"111" session_start(); $_SESSION["spoock ', 'php');中把|之前认为是键值后面的视为序列化 那么就可以利用这一漏洞执行一些恶意代码 看下面的例子 1.php ini_set('session.serialize_handler', 'php_serialize
前言 此篇文件为有关PHP邮件漏洞的总结,如有错误,还请各位师傅指出。 PHP mail()函数介绍 ? CVE-2016-10033分析 上面我们分析了PHP中mail函数产生的漏洞,而这个cve phpmailer正是因为第五个参数过滤的不严谨导致的漏洞,下面开始进行分析,代码在https://github.com 漏洞环境https://github.com/opsxcq/exploit-CVE-2016-10033 漏洞利用条件 php version < 5.2.0 no pcre phpmailer < 5.2.18 具体链接:https://www.php.net/manual/zh/function.imap-open.php 漏洞主要触发原理: 如下实例: @imap_open('{localhost}:143 .'}:143/imap}INBOX', '', ''); 存在RFI漏洞文件: <?php include($file); ?
此漏洞仅测试了最新版v3.8,不知道低版本是否存在此漏洞。 PHP版本的ewebeditor并没有使用数据库来保存配置信息,所有信息位于php/config.php中,代码如下: $sUsername = “admin”; $sPassword = “admin /uploadfile/|||550|||350|||rar|zip|exe|doc|xls|chm|hlp|||swf|||gif|jpg|jpeg|bmp|||rm|mp3|wav|mid|midi +’php/upload.php? /uploadfile/|||550|||350|||rar|zip|exe|doc|xls|chm|hlp|||swf|||gif|jpg|jpeg|bmp|||rm|mp3|wav|mid|midi
我觉得学习的时候,所有的问题都应该问 3 个问题:what、why、how: what:什么是反序列化,why:为什么会出现反序列化漏洞,how:反序列化漏洞如何利用。 php phpinfo(); ?> 写入到 shell.php 中。 poc 代码: <?phpclass l1nk3r{ var $test = '<?php phpinfo(); ? ,来测试 exploit. 2.构造 exploit 的思路 1、寻找可能存在漏洞的应用 2、在他所使用的库中寻找 POP gadgets 3、在虚拟机中安装这些库,将找到的POP链对象序列化,在反序列化测试 E5%88%86%E6%9E%90 PHP 反序列化漏洞: http://paper.tuisec.win/detail/fa497a4e50b5d83 理解 php 反序列化漏洞: https://blog.csdn.net B0%88php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/ PHP 反序列化漏洞成因及漏洞挖掘技巧与案例: https://www.anquanke.com
文件上传在PHP中经常被使用到,例如上传一个图片,上传一个文本等,文件上传如果在编写时过滤不够严格则很有可能导致漏洞的产生,如下代码是针对文件上传漏洞的总结,学习这些问题代码可以更好的查缺补漏弥补问题。 php phpinfo();?>即可完成绕过,或者如果是\xffxd8\xff我们需要在文件开头先写上%ff%d8%ff<?php phpinfo(); ? "rb"); if($fh) { $bytes = fread($fh,6); fclose($fh); if(substr($bytes,0,3) == "\xff\xd8\xff" or substr($bytes,0,3)=="\x3f\x3f\x3f"){ return "image/jpeg"; } 针对这种上传方式的绕过我们可以将图片与FIG文件合并在一起copy /b pic.gif+shell.php 1.php上传即可绕过. <?
前言 变量覆盖漏洞是需要我们需要值得注意的一个漏洞,下面就对变量覆盖漏洞进行一个小总结。 其实,大多数变量覆盖漏洞是函数使用不当导致的。比如extract()函数和parse_str()。 还有一个函数是import_request_variables(),它是在没有开启全局变量注册的时候,调用这个函数相当于开启了全局变量注册,在PHP5.4之后,这个函数被取消了。 php $b=2; $a=array('b'=>'123'); extract($a); echo $b; ? a=3,那么key的值就为3,还有一个在a的前面,结合起来就是a=addslashes(_value),所以会覆盖原有a的值。上面的代码我们执行一下,如下图,发现a被覆盖成由GET方式传的8。
注入的种类有很多,而不仅仅是SQL Injection. php常见注入有以下几种 ? Cross Site Scripting,XSS) SQL注入攻击(SQL Injection) 动态函数注入攻击(Dynamic Variable Evaluation) 序列化注入 & 对象注入 php 由此我们基本可以确定是存在注入漏洞的.进行手动验证.. ? ? 通过验证得知. 注入漏洞确实存在.接下来我们就需要做相应的修复. 通过发现漏洞过程,得知造成此问题是因为参数过滤不严导致的,那我们如果能对提交的参数做很好的验证过滤,保证我们提交的数据时ip类型或者域名类型是不是就可以解决了? 发现漏洞已修复. ?
PHP处理MYSQL注入漏洞 本文最后更新时间超过30天,内容可能已经失效。 一、什么是SQL注入 SQL注入漏洞为PHP研发人员所熟知,它是所有漏洞类型中危害最严重的漏洞之一。 SQL注入漏洞,主要是通过伪造客户端请求,把SQL命令提交到服务端进行非法请求的操作,最终达到欺骗服务器从而执行恶意的SQL命令。 下面对每一种注入威胁举例说明,以帮助您在编码过程中有效地避免漏洞的产生。 为了能更直观地了解SQL注入,先在数据库中创建一个名叫hacker的用户表。 当攻击者再利用其他漏洞找到下载方式,将文件下载或者复制走,最终造成被拖库时,Web站点的数据就会全部暴露。 如果执行下面请求,将发生更可怕的事情。 在页面无返回的情况下,攻击者也可以通过延时等技术实现发现和利用注入漏洞。
3.程序执行 程序可以对对象进行一系列的操作,并使用它执行其他操作。入,宽字节注入依旧会产生: ? 4.对象销毁 函数的相关执行流程已经大致介绍完毕,那具体的unserialize()中的漏洞是如何发生的呢? 攻击者可以使用此反序列化漏洞来实现RCE攻击,因为用户提供的对象被传递给反序列化,并且Example2类具有在用户提供的输入上运行 eval() 的魔术函数。 那么知道了漏洞的形成,如何防范unserialize()漏洞呢? 为了防止发生PHP对象注入,建议不要将不受信任的用户输入传递给unserialize()。 考虑使用JSON与用户之间传递序列化数据,如果确实需要将不受信任的序列化数据传递到unserialize(),请确保实施严格的数据验证,以最大程度地降低严重漏洞的风险。 ?
PHP命令执行漏洞初探 Mirror王宇阳 by PHP 命令执行 PHP提供如下函数用于执行外部应用程序;例如:system()、shell_exec()、exec()、passthru() system php $host = $argv[1]; system("ping ".$host); ?> 在服务端运行php.exe index.php 192.168.2.1 ? 执行php.exe index.php "|net user"(这里的“|”符号的作用时屏蔽源代码的ping字符) ? PHP代码字段并以分号结尾 <? php $arr = $_GET['arr']; $array = array(1,2,3,4,5); $new_array = array_map($arr, $array); ?> ?
php处理session的应用架构 ? 会话劫持 会话劫持是指攻击者利用各种手段来获取目标用户的session id。 2)计算:如果session id使用非随机的方式产生,那么就有可能计算出来 3)窃取:使用网络截获,xss攻击等方法获得 会话劫持的攻击步骤 ? 开始攻击 //attack.php php // 打开Session session_start(); echo "目标用户的Session ID是:" . session_id > 提交 http://localhost/attack.php? PHPSESSID,此变量会保存在cookie中,如果黑客不抓包分析,就不能猜到这个名称,阻挡部分攻击 session_start(); session_name("mysessionid"); …… 3)
漏洞总结 PHP 文件上传漏洞 只验证MIME类型: 代码中验证了上传的MIME类型,绕过方式使用Burp抓包,将上传的一句话小马*.php中的Content-Type:application/php, id=1' and 1=0 union select 1,2,3,4 --+ index.php? id=1' and 1=0 union select 1,2,3,4,5 --+ index.php? id=1' and 0 union select 1,load_file("/etc/passwd"),3,4,5 --+ index.php? php phpinfo();?>",3,4,5 into outfile '/var/www/html/shell.php' --+ index.php?
使用PHP封装伪协议PHP 有很多内置 URL 风格的封装协议,这类协议与fopen()、 copy()、 file_exists()和 filesize()的文件系统函数所提供的功能类似。 php流input利用php中流的概念,将原本的include的文件流重定向到了用户可控制的输入流中命令执行(allow_url_include:on,allow_url_fopen不做要求)http: //127.0.0.1/include/03/index.php? page=php://filter/convert.base64-encode/resource=index.php效果跟前面一样,少了read等关键字。在绕过一些waf时也许有用zip://实验? php phpinfo();?>?
关于该metinfo漏洞的分析,我们来看下漏洞产生的原因: 该漏洞产生在member会员文件夹下的basic.php代码文件: metinfo独有的设计风格,使用了MVC框架进行设计,该漏洞的主要点在于使用了 n=user&m=web&c=register&a=doemailvild HTTP/1.1 Cookie: p=00c7%2FDBwD23b41olxVCthTvDDTRBhldmrrdyA8S3t% 2F3yAl4QZ0P%2FSfOS5zlB 把具体的SQL注入语句放到 cookie中进行攻击,我们发现注入成功了。 ,以及安全方案 目前metinfo最新版本发布是2019年3月28日,6.2.0版本,官方并没有针对此sql注入漏洞进行修复,建议网站的运营者对网站的后台地址进行更改,管理员的账号密码进行更改,更改为数字 +字符+大小写的12位以上的组合方式,对网站的配置文件目录进行安全限制,去掉PHP脚本执行权限,如果自己对代码不是太熟悉,建议找专业的网站安全公司来处理修复漏洞,国内SINE安全,以及绿盟,启明星辰,都是比较不错的网站漏洞修复公司
2020年,刚刚开始WordPress博客系统被网站安全检测出有插件绕过漏洞,该插件的开发公司,已升级了该插件并发布1.7版本,对以前爆出的漏洞进行了修补,该企业网站漏洞造成的原因是未经许可身份认证的普通用户给以了系统管理员权限 该网站漏洞影响的插件版本,是存在于1.5-1.6版本。 根据目前WP官方的数据资料统计,使用该版本的用户以及网站数量占比竟然达到百分之95左右,受漏洞影响的网站确实太多,建议各位站长尽快对该插件进行升级,修复漏洞。 该网站漏洞的利用方式以及条件,必须是该主题插件处于启用状态,并且是公司网站上都安装了这个插件才会受到漏洞的攻击,让黑客有攻击网站的机会。 针对于WP官方的数据安全中心发布的安全报告中显示的两个网站漏洞,当黑客利用这些网站漏洞时,都是会造成和本次安全事件一样的影响。
本文作者:cream(贝塔安全实验室-核心成员) PHP序列化漏洞原理 1、序列化(串行化) 2、反序列化(反串行化) 3、序列化实例分析 4、反序列化实例分析 5、祸起萧墙---Magic函数 5.1 PHP反序列化漏洞CTF练习题 7、防御PHP序列化漏洞 1、序列化(串行化) 将变量转换为可保存或传输的字符串的过程; 2、反序列化(反串行化) 在适当的时候把这个字符串再转化成原来的变量使用。 mixed unserialize ( string $str )对单一的已序列化的变量进行操作,将其转换回 PHP 的值。 3、序列化实例分析 <? 成功读取到文件中的内容 6、实例讲解 6.1 CVE-2016-7124 触发该漏洞的PHP版本为PHP5小于5.6.25或PHP7小于7.0.10。 影响版本:Typecho 0.9~1.0 漏洞的入口出现在install.php页面,代码如下: //判断是否已经安装 if (!
> 输出结果: O:6:"person":2:{s:4:"name";s:3:"cx";s:3:"age";i:19;} O代表结构类型为类 6表示类名长度 person表示类名 2表示类的属性个数 {s:4:"name";N;s:3:"age";i:18;s:3:"sex";B;} 数组: a:<length>:{key; value pairs}; a:1:{i:1;s:1:"a";} NULL 条件 unserialize()函数的参数可控 php中有可以利用的类并且类中有魔术方法 漏洞成因 当传给unserialize()的参数可控时,就可以注入精心构造的payload,在进行反序列化是就可能触发对象中的一些魔术方法 Web_php_unserialize 题目来源攻防世界 前置知识:在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在__wakeup()的漏洞。 正则表达式完整教程 利用__wakeup()漏洞绕过 然后绕过__wakeup(),修改类的属性个数大于真是属性个数即可。
php class F{ public $filename='a.txt'; } $a = new F(); echo $a->filename.' php class F{ public $filenameF='bcda.txt'; } $a = new F(); echo $a->filenameF.' php class F{ public $filename='a.txt'; } $a = new F(); echo $a->filename.' php class F{ public $filename='a.txt'; function __destruct(){ echo '-------------->< php include "xxx.php";#此文件中有类定义, 有魔术函数或方法, 且输入参数能被控制 class Classname{ #存在有害魔术函数或方法,且输入参数能被控制 }