[XDCTF2015] filemanager
BUU上一个15年的题,二次注入
源码泄漏
www.tar.gz。。。我试了www.zip和robots.txt,结果源码是另一个圧缩形式
有用的就两个文件,upload.php和rename.php
提交的所有数据都被转义加了斜杠,直接注入无果,事实上测试一下就发现把文件名改成1’之类的时候,再去修改会触发二次注入
flask的模板注入加一个debug模式下的命令执行
题目开局给的是一个base64的加解密网站,说明了是flask写的,hint界面在注释里面藏了一句PIN(我一开始还不知道是什么意思)
后来在解码处输入了一个错误的字符串,进入了debug界面,可以看到解码部分的源码
@app.route('/decode',methods=['POST','GET'])
def decode():
if request.values.get('text') :
text = request.values.get("text")
text_decode = base64.b64decode(text.encode())
tmp = "结果 : {0}".format(text_decode.decode())
if waf(tmp) :
flash("no no no !!")
return redirect(url_for('decode'))
res = render_template_string(tmp)
发现在debug模式下可以运行一个shell,但是要输入一个叫PIN码的东西,这个就是提示中出现的PIN了,每个机器的PIN码是由几个数据固定生成的,那么我们只要读取到对应的文件,自然就能计算出PIN从而任意命令执行
而这里又使用了模板渲染,自然可以测一下ssti,简单的{{8+8}}可以被计算即可证明存在模板注入。不过这里也提出了有Waf,就需要测一下waf禁用了什么。简单找几个payload试试,发现os,flag和popen,system,import之类的常用命令执行的字段被禁用了,不过就这种过滤还是很容易绕过的,毕竟还是得用ssti读文件去计算PIN码,网上找几个payload就可以了
伪随机数安全的一个题,通过php_mt_rand这个工具逆向出随机数种子,然后通过种子获取字符串
贴一下源码
<?php
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'];)){
$_SESSION['seed'];=rand(0,999999999);
}
mt_srand($_SESSION['seed'];);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";
if(isset($_POST['num'];)){
if($_POST['num'];===$str){x
echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
}
else{
echo "<p id=flag>没抽中哦,再试试吧</p>";
}
}
show_source("check.php");
mt_rand(min,max)函数返回该区间内的任意一个数,通过如下脚本得到逆向所需数据,通过php_mt_rand工具爆破出种子