web-php特性
url传入的数值都默认为字符串
web-89
重点在于绕过preg_match函数,且num是个int类型的数字
我们可以通过数组进行绕过,就得到了flag
web-90
这题考察intval()函数和强比较
强比较
在php中,三个等号“===”是全等比较运算符,用于比较两个操作数的值是否相等,同时检测它们的类型
是否相同;只有两边的值和数据类型都相等时,运算结果才是TRUE。
这题传入num=4476a,原因是如果base=0时,当intval遇到字母,会自动停止
web-91
考察preg_match()和正则表达式
第一层由于/m存在为多行匹配,第二层为单行匹配,要想通过第一层且绕过第二层,我们使用换行绕过
传入cmd=%0Aphp就可以了,**%0A为换行符的url编码**
这样传入的数就变成了:
1 | //第一行为空格 |
就能拿到flag了
web-92
这道题考察的是intval函数和弱类型比较
但如果我们传入的num为4476a的话,
1 | if($num==4476){ |
这层代码就会返回true,因此想要绕过这层代码同时使
下面这层代码成立,我们可以使用进制转换,intval会自动将字符串转换成指定的进制,且返回int类型
1 | if(intval($num,0)==4476){ |
因此我们可以传入num=0x117c来获得flag
web-93
这题和上题一样,但限制了字母,因此二进制,十六进制就不可以用了,但八进制没有被过滤掉
所以传入num=010574就能拿到flag了
web-94
得了,这道题由于strpos的存在,过滤掉了开头的0(还可以在数据前填个+号,这样0就不是第一位了)
,但我们发现$num===”4476”是个强类型比较,我们就可以传入num=4476.0,因为url传入的默认是字符串,所以这个强类型比较返回false,然后就能一路拿到flag了
1 | ?num= 010574 |
web-95
把点过滤了,不过还是能在前面加空格、换行或者加减号.
1 | ?num= 010574 |
web-96
可以用php伪协议来做
传入?u=php://filter/convert.base64-encode/resource=flag.php
会得到一串base64编码,再通过解码就能得到flag
其它payload
1 | ./flag.php 相对路径 |
web-97
利用md5不能识别数组,且返回false来绕过md5得到flag
web-98
解释一下$_GET?$_GET=&$_POST:’flag’;
如果get传入了一个值,就要用post传入的值覆盖掉,否则get传不进去
highlight_file($GET[‘HTTP_FLAG’]==’flag’?$flag:_FILE);
如果HTTP_FLAG通过get方式传入一个flag,就打开flag这个文件
所以POST:HTTP_FLAG=flag;GET随便传什么都行.
web-99
1 | highlight_file(__FILE__); |
函数in_array()第三个参数
is_array()可以判断一个值是否在数组中。
in_array(value,array,type) value :要搜索的值
array : 被搜索的数组
type : 类型,true全等 ,false非全等(默认)
file_put_contents() 函数把一个字符串写入文件中。f
语法:
1 | int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) |
GET传入n=1.php
这题file_put_contents() 函数没有设置第三个参数,所以1.php和数字1比较时,1.php会转化为1再和1比较, 满足条件.
接着POST:content= 传入php代码到1.php中,然后访问1.php发现flag
查看flag,POST:content=
web-100
这题考察运算符的优先级
1 | $v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); |
由于=的优先级大于and,因此只要满足v1是个数字,v0就返回1
1 | if($v0){ |
通过代码审计,v2不能存在;,而v3要存在一个;且在开头
我们可以用highlight_file()返回ctfshow.php中的内容
?v1=1&v2=highlight_file(“ctfshow.php”)&v3=;
我们得到flag为a2eae7f30x2d8dc90x2d45560x2dad910x2d629eccb9bba4,接下来把0x2d换成-就能得到flag了
也可以传入?v1=1&v2=eval($_POST[1])?%3E&v3=; 传入一句话木马,然后使用蚁剑进行连接
web-101
这题考察反射和运算符的优先级
1 | $v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); |
根据上题的经验,我们可以知道v1=1,
由于v2,v3过滤了数字和特殊字符
因此,这题我们考虑用ReflectionClass反射,
我们传入?v1=1&v2=echo new RefectionClass&v3=;
我们就能拿到flag值了
我们把0x2d换成-,得到flag{6feae7fe-d7cd-4fea-9d47-30b0e0ee2be},但当我们提交flag时,却提示我们flag错误,经过仔细对比,我们发现flag少了一位
我们可以手动爆破或通过bp,猜flag的最后一位(不演示了)
web-102
考察call_user_func函数和php版本特性
1 | $a='<?=`cat *`;'; //为什么用这个,主要是因为编码后带e,或者是编码后全部是数字 |
web-103
跟上题做法一模一样