CTF中遇到的php语法
十分感谢
1.if(eregi(“hackerDJ”,$_GET[id])) { //eregi字符串对比
echo(“
not allowed!
“);exit();
2.isset 判断变量是否定义过
3.比较符
a== a == b 松散比较
=== 完全等于
= 大于等于
!= 如果类型转换后 a不等于 a 不 等 于 b,Ture
!== 不完全等于,如果 a不等于 a 不 等 于 b或者它们类型不同,Ture
当php进行一些数学计算的时候,当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
1 var_dump(0 == ‘0’); // true
2 var_dump(0 == ‘abcdefg’); // true
3 var_dump(0 === ‘abcdefg’); // false
4 var_dump(1 == ‘1abcdef’); // true
* bool类型的true跟任意字符串可以弱类型相等
在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。比如: ‘3’ == ‘3ascasd’结果为true。
4.eval可以直接执行php代码
5.intval 将变量转成整数类型
6.ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
int ereg(string pattern, string originalstring, [array regs]);
例,$email_id = “admin@tutorialspoint.com”;
retval=ereg("(\.)(com r e t v a l = e r e g ( " ( \. ) ( c o m )”, $email_id);
ereg()限制password的格式,只能是数字或者字母。但ereg()函数存在NULL截断漏洞,可以使用%00绕过验证。
这里ereg有两个漏洞:
①%00截断及遇到%00则默认为字符串的结束
②当ntf为数组时它的返回值不是FALSE
7.strpos — 查找字符串首次出现的位置:
例,$mystring = ‘abc’;
$findme = ‘a’;
pos=strpos( p o s = s t r p o s ( mystring, $findme);
8.$_GET可以接受数组但MD5
md5()不能处理数组结构的数据
利用此漏洞构造index.php?a[]=1&b[]=2
构造?a[]=1&b[]=2这样md5函数无法处理数组返回false完成匹配得到flag
例,
if (isset( GET[′a′])andisset( G E T [ ′ a ′ ] ) a n d i s s e t ( _GET[‘b’])) {
if ( GET[′a′]!= G E T [ ′ a ′ ] ! = _GET[‘b’])
if (md5( GET[′a′])===md5( G E T [ ′ a ′ ] ) === m d 5 ( _GET[‘b’]))
die(‘Flag: ‘.$flag);
else
print ‘Wrong.’;
}
9.