PHP trick

作者: 早安夏天_afa3 | 来源:发表于2018-11-29 20:34 被阅读0次

    1、绕过is_numeric。 %00放在数字开头或者结尾,%20放在开头都能使函数返回false

    2、类型转换上限。intval函数在32位系统最大返回2147483647,64位系统最大返回9223372036854775807。浮点数向下取整。

    3、eregi匹配可以用%00截断,参数是数组返回NULL。

    4、strcmp、strpos绕过。传数组。一般处理字符串的,传入数组会返回null。

    5、md5和sha加密,加密是数组的话md5()===md5()成立。

    6、session绕过。删除cookie,没有cookie中的SESSIONID就找不到对应的session文件,相应的$_SESSION['var']就为NULL,传参NULL。

    7、伪造ip:X-Client-IP:  X-Remote-IP:  X-Remote-Addr:  X-Originating-IP:  X-Forwarded-For:  client-ip:

    可以不用点分十进制,用八进制或者十六进制绕过ip地址限制。

    8、md5之后==比较相等, 240610708    QNKCDZO

    9、md5后sql注入,md5($var,true)把md5后的十六进制转换为字符串,字符 ffifdyop 加密后再转换为字符串为 'or'6<trash>即可。

    10、unserialize反序列化。if (preg_match('/[oc]:\d+:/i', 'O:4:"Demo":1:{s:10:"Demofile";s:16:"f15g_1s_here.php";}'))  进行这种正则判断的时候,可以在数字前加'+'号来绕过,数字的正号在序列化后的字符串中可以省略,但是可以绕过正则。类序列化之后,再调用unserialize()反序列化这个字符串,会调用类的__wakeup()函数(如果存在的话),之后再调用析构函数。序列化之后的字符串,如果改变属性的数量后,再反序列化,不会调用__wakeup函数。

    11、PHP双引号中的变量会被正常解析,比如"hello $name",$name的值会被代入。${}里面的代码会正常执行。比如${@eval(...)}一句话木马。

    12、绕过openbase_dir列目录,p师傅的文章:https://www.leavesongs.com/PHP/php-bypass-open-basedir-list-directory.html

    或者<?php foreach(glob("./*") as $bdw){ echo $bdw."<br>"; }?>

    13、///可以使得parse_url解析错误,不过必须是跟在ip地址后面,具体文件后面不行。

    14、利用phar://协议读取phar文件,可以触发反序列化,受影响函数:file_exists file_get_content file_put_content等等

    详细介绍:https://xz.aliyun.com/t/2715#toc-5

    深入介绍:https://xz.aliyun.com/t/2958

    15、php://filter/convert.iconv.UTF-8/UTF-7/resource= 可以把文件从一个编码转换到另一个编码,可以用来读取某些服务器不支持的格式的文件。

    16、file_put_contents() 在写入文件时,第二个参数,写入数据如果是数组的话,会被连接起来写入文件。但是这样就能绕过前面的过滤。

    17、php读取写入文件,都会调用php_stream_open_wrapper_ex打开流,而判断文件存在、重命名、删除不会。php_stream_open_wrapper_ex会把文件名标准化为一个绝对路径,删除等操作没有。所以读取写入的时候会处理掉相对路径不会出错,删除因为不会处理所以出错。

    linux绕过: xxxxx/../exp.php    exp.php/.

    windows绕过: exp.ph<

    18、end()和count。类似 end($var)==$var[count($var)-1] 绕过,end是直接取数组最后一位,count是根据下标来取的,所以打乱下标可以绕过。

    例如:  ?a[1]=ab&a[0]=cd

    19、filter_var($url,FILTER_VALIDATE_URL) 绕过,http://localhost/?url=0://evil.com:2333,skysec.top:80/  或者 http://localhost/?url=0://evil.com:233;skysec.top:80/ 都可以绕过, 或者 http://localhost/?url=0://evil.com$skysec.top:80/    parse_url($url)['host'] 还是// 和 /之间的内容,但是curl请求的是前半部分的内容。

    参考:http://skysec.top/2018/03/15/Some%20trick%20in%20ssrf%20and%20unserialize()/#some-trick-in-ssrf

    20、parse_url 和libcurl(就是curl函数的库)。  parse_url 匹配host中最后一个@后面符合格式的host    curl匹配第一个。

    例如 http://@a.com@b.com parse_url 中host 为b.com    curl中host为 a.com  (后面的会忽略?)。

    关于有端口号的url:和libcurl版本号有关:

    libcurl 7.55.1 版本之后的 对于  http://@localhost:80@104.248.216.145:8001 host为 localhost 访问端口号为最后那个指定的 中间那个80无用

        7.50.3版本之前的(具体哪个版本分界我也不知道啊!)对上面的url无法访问,需要把最后面那个端口号去掉才行,同时访问的端口号为80

    21、反序列化注入代码。构造属性内容,使得前一个属性因为过滤,属性值内容减少的时候,可以吃掉原本的属性,使得下一个属性的内容成为属性。

    这样就可以在原本的属性值中构造注入代码。对象注入,使得某个特定的对象成为当前的一个属性,然后可以操作相关函数。

    22、json_encode:将数组转换为json,只支持utf8格式的数据。json_encode 会自动将utf8格式的汉字转为unicode格式。gbk格式的数据只能输出NULL。

    json_decode:可以解析unicode编码格式的字符串,官方说明只能解析utf-8编码的数据。  英文字符不区分编码格式,encode  decode都能解析。

    json_decode:可以当作mysql的分隔符: 空格    +  \f  \n  \r  \t \u0009  \u000A  \u000B  \u000C  \u000D  \u0020    \u002B

    相关文章

      网友评论

          本文标题:PHP trick

          本文链接:https://www.haomeiwen.com/subject/cgkqcqtx.html