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