4.26
-
ereg() 函数或 eregi() 函数
存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。ereg() 有区分大小写,PHP函数eregi()与大小写无关。
例:eregi("111".substr($b,0,1),"1114") ,对b的要求为长度strlen()大于5且b[0]!=4
解:判断"1114"这个字符串里面是否有符合"111".substr($b,0,1)这个规则的(即111加.后的字符)
Strlen检测长度时遇到%00不会被截断,而eregi会被截断,故构造b为字串,首位为%00,长度大于5,则检测时长度满足,eregi(‘111’,’1114’)也满足,b首位整形也不等于4也满足
设置b=%00(/x)12345即可file_get_contents()函数
例子:$data = @file_get_contents($a,'r');
解:源码中变量 $data 是由 file_get_contents() 函数读取变量 $a 的值而得,所以 $a 的值必须为数据流。
因此这里用伪协议 php:// 来访问输入输出的数据流,其中 php://input 可以访问原始请求数据中的只读流。这里令 $a = "php://input",并在POST请求主体中提交字符串a= bugku is a nice plateform!。使$_GET['id']不等于0,$id==0
令id=%00或者令id=.字符串都可以绕过
php认定0e开头的 == 0可设置id=0e123
strcmp()绕过
strcmp()函数用来判断两个字符串是否相等,若相等,返回0。php在5.3版本之前若传入的是一个非字符串类型数据,比如数组和对象,则会报错,但在报错的同时会返回0。浏览了CTF命令执行及绕过技巧相关学习网站 https://blog.csdn.net/JBlock/article/details/88311388