每个开发者都很担心遇到bug/漏洞,php开发者也不例外,本文就给大家介绍一下什么是漏洞/bug,PHP代码常见漏洞有哪些?
漏洞是指一个系统存在的弱点或缺陷,系统对特定威胁攻击或危险事件的敏感性,或进行攻击的威胁作用的可能性。漏洞可能来自应用软件或操作系统设计时的缺陷或编码时产生的错误,也可能来自业务在交互处理过程中的设计缺陷或逻辑流程上的不合理之处。这些缺陷、错误或不合理之处可能被有意或无意地利用,从而对一个组织的资产或运行造成不利影响,如信息系统被攻击或控制,重要资料被窃取,用户数据被篡改,系统被作为入侵其他主机系统的跳板。
漏洞问题是与时间紧密相关的。一个系统从发布的那一天起,随着用户的深入使用,系统中存在的漏洞会被不断暴露出来,这些早先被发现的漏洞也会不断被系统供应商发布的补丁软件修补,或在以后发布的新版系统中得以纠正。而在新版系统纠正了旧版本中具有漏洞的同时,也会引入一些新的漏洞和错误。因而随着时间的推移,旧的漏洞会不断消失,新的漏洞会不断出现。漏洞问题也会长期存在。所以开发者才戏称自己日常工作是:找bug,补bug,然后写bug!
而php中常见的漏洞有哪些呢?
- extract变量覆盖漏洞
<?php $flag='xxx'; extract($_GET); if(isset($shiyan)) { $content=trim(file_get_contents($flag)); if($shiyan==$content) { echo'flag{xxx}'; } else { echo'Oh.no'; } } ?>
又是老套路extract变量覆盖,之前俗说君在上一篇中就有提到过,这次拿一下这个简单题来练练手,首先这次有几个新朋友,我们来认识一下(u‿ฺu✿ฺ)
isset()函数:用于判断一个变量是否被设置,如果设置了并且不为NULL,则返回True,反之就为False;
file_get_content()函数:用于将文本中的数据写入字符串
然后本题要求就是shiyan这个变量和flag变量内容相同;所以payload:?shiyan=&flag=关于extract漏洞:它是会将原来同名的变量覆盖,使用数组键作为变量名,使用数组键值作为变量值
- strcmp字符串比较及MD5漏洞
<?php $flag = "flag{xxxxx}"; if (isset($_GET['a'])) { if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。 //比较两个字符串(区分大小写) die('Flag: '.$flag); else print 'No'; } ?>
php5.3版本之前的strcmp函数在出现输入变量类型错误时会返回0,所以这里我们只要构造数组传值即可,因为这个函数只能处理字符串(๑•̀ㅂ•́)و✧;payload:?a[]=1
<?php error_reporting(0); $flag = 'flag{test}'; if (isset($_GET['username']) and isset($_GET['password'])) { if ($_GET['username'] == $_GET['password']) print 'Your password can not be your username.'; else if (md5($_GET['username']) === md5($_GET['password'])) die('Flag: '.$flag); else print 'Invalid password'; } ?>
md5漏洞:由于md5()函数不能处理数组,所以导致在返回时为false;
所以payload:?username[]=1&password[]=2
- Urldecode二次编码漏洞
<?php if(eregi("hackerDJ",$_GET[id])) { echo(" not allowed! "); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo " Access granted! "; echo " flag "; } ?>
PHP 函数 eregi()
语法
int eregi(string pattern, string string, [array regs]);
定义和用法
eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串,如密码。
浏览器在读取参数时,会默认对其进行一次url解码,而这里eregi()函数在匹配到这个hackerDJ的id时就会返回not allowed,但是后面的if语句中又必须要求id是hackerDJ,所以我们就要想办法对其进行编码传参,又由于urldecode($_GET[id]) 会在进行解码,所以此时应对了题目的二次编码,百度一下url编码表,发现 “%”编码是%25,“h”是%68,所以构造payload:?id=%2568ackerDJ
以上就是“php漏洞是啥?常见php漏洞梳理”的详细内容,想要了解更多php教程欢迎关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/8400/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料