r0ckyzzz's Blog.

攻防世界Web进阶区部分writeup 2

Word count: 710Reading time: 3 min
2020/02/22 Share

攻防世界Web进阶区部分writeup 2

lottery

这题是我那一届xman选拔赛QCTF的题目 当时做出来了

我记得payload所以一下子就做出来了

但这题应该的步骤是
扫描目录->发现有git泄露->githack下载源码->审计发现有弱类型漏洞->编写payload

upload successful

Web2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function encode($str){
$_o=strrev($str);
// echo $_o;

for($_0=0;$_0<strlen($_o);$_0++){

$_c=substr($_o,$_0,1);
$__=ord($_c)+1;
$_c=chr($__);
$_=$_.$_c;
}
return str_rot13(strrev(base64_encode($_)));
}

highlight_file(__FILE__);
/*
逆向加密算法,解密$miwen就是flag
*/
?>

就是逆向解密加密算法
把密文通过rot13 strrev base64_decode之后得到
‘~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg’
对代码进行分析 发现主要的加密逻辑在这里

1
$__=ord($_c)+1;

取原文的每一个ASCII值加1
复制源代码吧+1改为-1即可

附上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$miwen='a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws';
$_o=base64_decode(strrev(str_rot13($miwen)));
//print($_o);
for($_0=0;$_0<strlen($_o);$_0++){

$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
print(strrev($_));

?>

upload successful

得到flag

PHP2

/index.phps发现源码泄露

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>

Can you anthenticate to this website?

第一步 要使’admin’不等于id传入的参数
第二步 id传入的参数经过一次url解码之后使得它等于’admin’

思路就是二次url编码

payload:
/index.php?id=admi%256e

因为浏览器会进行第一次解码 传入的参数在第一次判断时就变成了’admi%6e’
代码中进行第二次解码就变成了’admin’

upload successful

easytornado

这道题是护网杯的题目之前打过

upload successful

flag的位置在/fllllllllllllag
welcome 的内容为
http://111.198.29.45:49603/file?filename=/welcome.txt&filehash=a74279ca034b144dfdbb3aca8e4a21c1
hints的内容为md5(cookie_secret+md5(filename))

很容易让人联想到哈希长度扩展攻击

但其实不是
哈希长度扩展攻击要求md5(cookie_secret+这里的内容长度是可控的)
但这里被md5长度锁死了

所以这题的思路就是
获取cookie_secret 构造合适的filehash来读取flag

但怎么获取呢?

在试错之后发现一个页面

http://111.198.29.45:49603/error?msg=Error

upload successful

msg=Error 发现这个是可控的

upload successful

想到了模版注入

upload successful

确实存在模版注入
查了资料之后发现tornado的cookie_secret在handler.settings文件中

upload successful

得到了cookie_secret
现在可以构造payload了

1
2
3
4
5
6
<?php
$a='ab75ac1a-6f7a-40b6-877f-2cf67bebc4e3';
$b='/fllllllllllllag';
$c=md5($a.md5($b));
print($c);
?>

得到filehash=73686d058425888d3491cbd05aaf4948
代入得到flag

upload successful

CATALOG
  1. 1. 攻防世界Web进阶区部分writeup 2
    1. 1.1. ¶lottery
    2. 1.2. ¶Web2
    3. 1.3. ¶PHP2
    4. 1.4. ¶easytornado