ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
strrev() 函数反转字符串。
intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。
正则表达式中^是开始位置,$是结束位置,+表示匹配前面的子表达式一次或多次(应该就不能匹配些别的东西)
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 23:53:55
*/
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
if (ereg ("^[a-zA-Z]+<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 23:53:55
*/
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) {
die('error');
}
//只有36d的人才能看到flag
if(intval(strrev($_GET['c']))==0x36d){
echo $flag;
}
?>
quot;, $_GET['c'])===FALSE) {
die('error');
}
//只有36d的人才能看到flag
if(intval(strrev($_GET['c']))==0x36d){
echo $flag;
}
?>
ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE
这一行是这段代码比较复杂的一段,要注意比较的顺序,之前先认为c和FALSE比较就做不下去
应该是先ereg ("^[a-zA-Z]+$", $_GET['c'])再比较FALSE
结合ereg()函数用法,搜索不到指定字符串就会返回FALSE
if 语句是要TRUE才能执行
FALSE===FALSE
if语句才会是TRUE
如果要让 if 语句不执行,就要让ereg()函数返回TRUE,所以要让c中有字母,但应该不能出现其他东西
intval(strrev($_GET['c']))==0x36d
intval()函数中要877,转化成16进制就是36d
strrev()函数会颠倒顺序,所以c中真实数字要是778
结合第一个函数只能传字母,但有%00截断漏洞
intval()函数只取整数值进行转换
就用字母+%00+数字
?c=a%00778