CTF之PHP黑魔法总结

php黑魔法,是以前做CTF时遇到并记录的,很适合在做CTF代码审计的时候翻翻看看。

一、要求变量原值不同但md5或sha1相同的情况下

1.0e开头的全部相等(==判断)

240610708 和 QNKCDZO md5值类型相似,但并不相同,在”==”相等操作符的运算下,结果返回了true.

Md5和sha1一样

<?php

$password=$_GET['password'];

if(strcmp('am0s',$password)){

echo 'false!';

}else{

echo 'success!';

}

?>

2.利用数组绕过(===判断)

Md5和sha1对一个数组进行加密将返回NULL;而NULL===NULL返回true,所以可绕过判断。

二、Strcmp利用数组绕过

查看php的手册

int strcmp ( string $str1 , string $str2 )

Return Values

Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.

当输入的两个值为不是字符串时就会产生不预期的返回值:

比如

这样一段代码中,输入password[]=1则返回success,成功绕过验证

三、当有两个is_numeric判断并用and连接时,and后面的is_numeric可以绕过

$a=$_GET['a'];

$b=$_GET['b'];

$c=is_numeric($a) and is_numeric($b);

var_dump(is_numeric($a));

var_dump(is_numeric($b));

var_dump($c); //$b可以不是数字,同样返回true

$test=false and true;

var_dump($test); //返回true

四、NULL,0,”0″,array()使用==和false比较时,都是会返回true的

五、Eregi匹配

  • 数组绕过

ereg是处理字符串,传入数组之后,ereg是返回NULL

  • %00截断绕过

http://www.secbox.cn/hacker/1889.html

六、接收参数$a得存在,并且$a==0可用.绕过(非数字都可绕过)

测试代码:

<?php

$a=$_GET['a'];

if ($a==0) {

echo "1";

}

if ($a) {

echo "must";

}

七、接收参数中不能出现某一字符,但下面又必须使用可以php://伪协议绕过

目前遇到的是file_get_contents其他情况具体而定

八、is_numeric绕过

空格、\t、\n、\r、\v、\f、+、-能够出现在参数开头,“点”能够在参数任何位置,E、e只能出现在参数中间。

九、php5,3,29,这里可以直接用%0b绕过\s(空白字符)的匹配

十、既是0又是1的情况

$a==1&$test[$a]=t时

  • php精度(16以上)var_dump(9999999999999999999==1);//true
  • 科学计数法 .1e1 echo $b[‘.1e1’]//输出t

.是字符串所以在数组里面变成0,但在is_numeric中有点则正常输出为数字

十一、当switch没有break时可以继续往下执行

<?php

if (isset ( $_GET ['which'] )) {

$which = $_GET ['which'];

switch ($which) {

case 0 :

case 1 :

case 2 :

echo $which . '.php';

break;

default :

echo "1";

break;

}

}

$which进入循环时没有break则按顺序

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2017-02-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

20120918 -- 可计算性

程序特性规定: 1 程序开始执行时,自认为一切变元的值为0 2 转向无定义符号,执行程序的最后一条指令 时 自动认为停机 y=x+3 y=x+1 y=x+1 ...

1829
来自专栏前端黑板报

Javascript即将迎来Optional Chaining

Optional Chaining 现在处于 Stage 1。 它是什么? Optional Chaining 使我们能检查一个对象上面是否存在某属性。其它一些...

3565
来自专栏黑泽君的专栏

Struts2中:值栈(ValueStack)、值栈中的Action实例、Struts2中的其他命名对象 小结

  Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。 ...

1341
来自专栏华仔的技术笔记

再议Block

2917
来自专栏你不就像风一样

Apache Commons Codec的Base64加解密库

下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi

1014
来自专栏Java3y

Struts2【OGNL、ValueStack】

什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OG...

3086
来自专栏行者常至

(14)Struts2_值栈

822
来自专栏LanceToBigData

struts2(六)之ognl表达式与ActionContext、ValueStack

前言   前面已经把struts2讲内容说了一半了,我写的很详细,希望对博友们有帮助。 一、OGNL表达式语言概述 1.1、OGNL表达式简介   百度上是这样...

2477
来自专栏Android机动车

RxJava从入门到不离不弃(二)——简化代码

上篇文章中的示例大家可能会觉得,打印字符串需要那么麻烦嘛?主要是为了展示RxJava的原理而采用了这种比较啰嗦的写法,RxJava其实提供了很多便捷的函数来帮助...

784
来自专栏小樱的经验随笔

Codeforces 810C Do you want a date?(数学,前缀和)

C. Do you want a date? time limit per test:2 seconds memory limit per test:256 m...

2605

扫码关注云+社区