PHP篇
1.
哈希值为0e的:(md5比较hash值)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1加密后也是0e开头的字符串:
sha1(str)
sha1('aaroZmOk') = 0e66507019969427134894567494305185566735
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')
同时sha1和MD5不能处理数组,http://127.0.0.1/1.php?a[]=1&b[]=2
2.
php中的魔术方法,即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的。
比如 __construct, __destruct,__toString,__sleep,__wakeup等等。这些函数都会在某些特殊时候被自动调用。
3.
strcmp函数(字符串比较)
这个函数存在一个漏洞就是当传入的参数不为字符串类型时,这个函数将发生错误,在php5.3之前,函数在显示错误信息后,将会返回0。
如何传入非字符串?答案是传入数组。可以输入payload:?a[]=任意字符
4.
extract($_GET),URL 通过 get 的方式传参,数据以数组的形式被封装在 $_GET 中,在payload里面输入变量可以覆盖原来存在的数据。存在变量覆盖漏洞。
如要求原给定变量设为temp和变量flag要相同才可以输出flag
可以直接构造payload:?temp=&&flag=
把他们的值都赋为空,覆盖掉原来给定的值,就可以达成目标输出flag
5.
弱等于绕过
== (弱等于) 和 === (强等于)
如果类型转换后$a等于$b,那么&a == &b
如果$a和$b类型相同并且两者相等,那么&a === &b
例子:
54975581388 == 0xCCCCCCCCC(十六进制) //true
1==“1admin” //true
1==“admin” //false
1==“admin1” //false
假如php里面我们要绕过这样的例子:
if($a==0 and $a) //我们就可以输入a为"admin"/"admin123"...都可以
6.
is_numeric函数绕过
is_numeric函数的绕过和弱等于相似,拿一个ctf的例子来说:
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
不难看出我们想要获取flag,我们需要输入参数b,b既要绕开is_number()还要大于1234。这个时候我们可以这样绕过:
给b赋值 : 1235admin、10000admin、3423v....
原理和弱等于的类型转换一样。
函数及语法:
1.die() 函数输出一条消息,并退出当前脚本,无返回值。该函数是 exit() 函数的别名。
语法:die(message)
2.extract()函数从数组中将变量导入到当前的符号表(当前所有变量和值所对应组成的表)。
语法:extract(array,extract_rules,prefix)
没给extract_rules默认是overwriter(覆盖)
3.intval()函数用于获取变量的整数值。
4.ereg()函数用指定的模式搜索一个字符串中指定的字符串。
如果匹配成功返回true 否则 返回false。
5.strpos()函数查找字符串在另一字符串中第一次出现的位置。
6.is_numeric()函数用于检测变量是否为数字或数字字符串。
7.isset()检测变量是否已设置并且NULL。
8.@是为了抑制错误显示,让用户看不到,提升用户体验。注意:只是抑制错误,但是错误还是存在的。
9.null和false比较,null == false是true,null === false是false。
10.strcasecmp() 函数比较两个字符串。
该函数返回:
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2
11.addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
NULL
12.stripslashes() 函数删除反斜杠。(可以是由 addslashes() 函数添加的反斜杠)
13.eval() 函数把字符串按照 PHP 代码来计算。语法:eval(phpcode);
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
14.in_array() 函数搜索数组中是否存在指定的值。
注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。
语法:in_array(search,array,type)
15.mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置(第一个字符为0)
语法:mb_strpos (要被检查的字符串,要搜索的字符串)
<?php
$str = 'http://www.feiniaomy.com';
echo mb_strpos($str,'niao');
?>
输出结果:14
注意:mb_strpos()函数返回被查找的字符串在别一字符串中首次出现的位置
string
输入字符串。必须至少有一个字符。
start
如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 "abcdef" 中,在位置 0 的字符是 "a",位置 2 的字符串是 "c" 等等。
如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。
如果 string 的长度小于 start,将返回 FALSE。
length
正:返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。
负:string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回 FALSE。
如果提供了值为 0,FALSE 或 NULL 的 length,那么将返回一个空字符串。
如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。