入门级别 不是很全,慢慢总结
要求变量原值不同但md5或sha1相同的情况下
1.0e开头的全部相等(==判断)
240610708 和 QNKCDZO md5值类型相似,但并不相同,在”==”相等操作符的运算下,结果返回了true. 还可以参考下面博客的0e类型 https://blog.csdn.net/dyw_666666/article/details/82348564
Md5和sha1一样
2.利用数组绕过(===判断)
Md5和sha1对一个数组进行加密将返回NULL;而NULL===NULL返回true,所以可绕过判断。
strcmp 的参数只能是字符串,当我们传入数组时就会返回NULL,而判断使用的是==,NULL==0是 bool(true)的
代码测试
<?php error_reporting(0); $flag="{sadd44484878}"; if(isset($_GET['password'])) if (strcmp($_GET['password'],$flag)==0) die('Flag: '.$flag); else print 'Invalid password'; ?>get 传参 password[] 数组,成功打出flag
定义和用途
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
1.数组绕过
ereg是处理字符串,传入数组之后,ereg是返回NULL
2.%00截断绕过== 的比较
测试环境: php5.3版本,php7不行
测试代码
<?php error_reporting(0); *//$test=$_POST['a'];* if( ereg("c",$_GET['a'])== false) { echo 'failure'; } else { echo 'success'; }加入%00,可以发现后面的c被截断了
== :弱等于。在比较前会先把两种字符串类型转成相同的再进行比较。简单的说,它不会比较变量类型,只比较值。至于怎么转换后续会再赘述。
=== :强等于。在比较前会先判断两种字符串类型是否相同再进行比较,如果类型不同直接返回不相等。既比较值也比较类型。
当要比较的两种字符串的类型相同时,== 和 === 是相等的。
PHP转换规则
若一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较。若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串(例如"aaa"是不能转换为数字的字符串,而"123"或"123aa"就是可以转换为数字的字符串)或null,则转换为0;例如: var_dump(12=="12") // true var_dump(12=="12aa") //true var_dump( "admin"==0) //true var_dump(false==""==0==NULL) //true 1234 布尔值true和任意字符串都弱相等。例如: var_dump(true=="hyuf") //true 数字和“e"开头加上数字的字符串(例如"1e123”)会当作科学计数法去比较;0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0;当字符串被当作一个数值来处理时,如果该字符串没有包含’.’,‘e’,'E’并且其数值在整形的范围之内,该字符串作为int来取值,其他所有情况下都被作为float来取值,并且字符串开始部分决定它的取值,开始部分为数字,则其值就是开始的数字,否则,其值为0。直接看题
extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
如果当前符号表中有于数组键值变量名相同的,那么用数组键值的变量覆盖
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
ltrim() - 移除字符串左侧的空白字符或其他预定义字符
rtrim() - 移除字符串右侧的空白字符或其他预定义字符
我们本题利用extract()函数的变量覆盖漏洞原理构造payload
漏洞产生原因:extract()函数当只有一个参数时,默认的第二参数是:EXTR_OVERWRITE,如果有变量发生冲突,则覆盖已有的变量。
代码审计需要满足两个条件:1. if(isset($a)) == 》 TRUE
2. if( a = = a== a==c) == 》 TRUE
构造payload:
//利用extract()函数变量覆盖漏洞+php伪协议 http://123.206.87.240:9009/1.php?a=999&b=data://,999 //利用file_get_content()函数返回字符串+php弱类型(null == "string" ==》 true) http://123.206.87.240:9009/1.php?a= http://123.206.87.240:9009/1.php?a=&b= http://123.206.87.240:9009/1.php?a=&c=属于菜鸡的注释: 当file_get_connents 读入的不是一个文件是,返回的是false ,也就是 NULL
所以我们可以不对 b变量进行赋值或者随意赋值,只要a 是 NULL 就行,如果要想让a 不是NULL 我们就可以利用php伪协议 data,这里不能使用 php://input 是因为 它限定的是GET方式传参
首先我们介绍一下什莫是json:JSON概念很简单,JSON 是一种轻量级的数据格式,他基于 javascript 语法的子集,即数组和对象表示。由于使用的是 javascript 语法,因此JSON 定义可以包含在javascript 文件中,对其的访问无需通过基于 XML 的语言来额外解析。
<?php if (isset($_POST['message'])) { $message = json_decode($_POST['message']); $key ="*********"; if ($message->key == $key) { echo "flag"; } else { echo "fail"; } } else{ echo "~~~~"; } ?>输入一个数组进行json解码,如果解码后的message与key值相同,会得到flag,主要思想还是弱类型进行绕过,我们不知道key值是什莫,但是我们知道一件事就是它肯定是字符串,这样就可以了,上文讲过,两个等号时会转化成同一类型再进行比较,直接构造一个0就可以相等了。最终payload message={“key”:0}。