PHP安全 [魔术方法]
Posted 热绪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP安全 [魔术方法]相关的知识,希望对你有一定的参考价值。
php魔术方法(Magic methods)
_construct(),类的构造函数,当对象创建(new)时会自动调用
_destruct(),类的析构函数,当对象被销毁时会自动调用
_call() ,在对象中调用一个不可访问方法时调用
_callStatic() ,用静态方式中调用一个不可访问方法时调用
__get(), 获得一个类的成员变量时调用
_set(),设置一个类的成员变量时调用
_isset(),当对不可访问属性调用isset()或empty()时调用
_unset(),当对不可访问属性调用unset()时被调用。
_sleep(),执行serialize()时,先会调用这个函数
_wakeup(),执行unserialize()时,先会调用这个函数
_toString(),类被当成字符串时的回应方法
_invoke(),调用函数的方式调用一个对象时的回应方法
_set_state(),调用var_export()导出类时,此静态方法会被调用。
_clone(),当对象复制完成时调用
_debugInfo(),和__tostring()方法一样,由var_dump()、print_r()打印对象体的时候,控制对象体要输出的属性和值
在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
函数黑魔法
-
php读取文件其实是读取数据流, `php:/ / input` 可以访问原始请求数据中的只读流,这里令`$a = "php: / / input”`,并在请求主体中提交字符串。
-
eregi()截断漏洞,ereg()函数或eregi()函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。
-
弱比较,若字符串以数字开头,则取开头数字作为转换结果,若无则输出0
-
md5(),sha1();Md5()是不能处理数组的,md5(数组)会返回null,两个null相等绕过sha1()也是同理
-
转换,php会自动进行转换,比如16进制,科学计数法等,有时也用这点绕过
-
intval(),intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0。
-
strcmp(),strcmp()函数只有在相等的情况下返回0。那么我们传入一个数组,它会返回NULL,而判断使用了==,而NULL==0是bool(true),这样就成功绕过。
-
ereg(),字符串对比解析,ereg函数存在NULL截断漏洞,当ereg读取字符串string时,如果遇到了%00,后面的字符串就不会被解析。注:这里的%00是需要urldecode才可以截断的,这是url终止符,且%00长度是1不是3
-
is_numeric(),当有两个is_numeric判断并用and连接时,and后面的is_numeric可以绕过16进制也可以绕过is_numeric()检验,可以用来绕过sql注入里的过滤
例如将'1 or 1'转换为16进制形式,再传参,就可以造成sql注入 -
switch(),当switch没有break时可以继续往下执行。这里也有自动转换,比如$switch_bug = a,会当0执行,=1a,会当1执行......
-
array_search(),用到了PHP弱类型的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。当检索中带入字符串,比如"sky",会intval('sky')==0,从而致使数字数组也可以查询成功
函数黑魔法-协议流
为了读取包含有敏感信息的PHP等源文件,我们就要先将"可能引发冲突的PHP代码"编码一遍,这里就会用到 php://filter
php://fiter是PHP语言中特有的协议流,作用是作为一个“中间流"来处理其他流。比如,我们可以用如下一行代码将POST内容转换成base64编码并输出:
readfile("php://filter/read=convert.base64-encode/resource=php: //input"); `
所以,在XXE中,我们也可以将PHP等容易引发冲突的文件流用php://filter协议流处理一遍,这样就能有效规避特殊字符造成混乱
php: //filter/read=convert.base64-encode/resource=./ xxe.php `
以上是关于PHP安全 [魔术方法]的主要内容,如果未能解决你的问题,请参考以下文章