Web刷题之旅(三) - 攻防世界 站

mfw

没看出是什么题,就先githack一下,爆出git源码,有个flag.php,但是空的

看了一圈,index.php里面倒是有内容

assert 判断一个表达式是否成立。返回true or false;

strpos(string,find,start) 函数查找字符串在另一字符串中第一次出现的位置

 

代码审计一下,没有可以着手的地方(关键不知道考点是什么)

查WP,考点是命令执行漏洞:

bool assert(mixed $assertion[,string $description]),如果assertion是字符串,他会被assert()当做php代码执行。 思路是通过可控变量file传入恶意参数,构造闭合 file_exists(),使assert()执行恶意代码

构造file语句,当page=abc时返回的结果为false和false很恒成立,就是true了,用or连接

可以执行system函数,后面再跟上“.php”

?page=abc') or system(phpinfo());//".php"

?page=abc') or system("cat templates/flag.php");//".php"

用cat命令打开flag.php文件,最后查看源代码,得到flag

其中//是用来注释掉后面内容的,涨姿势了

 

web2

题目代码:

<?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
*/
?> 

strrev() 函数反转字符串,例:I LOVE U,反转以后变成U EVOL I

substr(a,b,c)函数返回字符串a下标从b开始,到c结束的子串(不包含c)

ord() 函数返回字符串的首个字符的 ASCII 值

chr() 函数从指定的 ASCII 值返回字符

str_rot13() 函数对字符串执行 ROT13 编码

总结:看似是个web题,其实是crypto

简单解一下,结束for循环以后得到的是:~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg

但问题是,这里的数字,比如88到底是8还是88,还有函数

$_c=substr($_o,$_0,1);

当$_0超过了1,还能截取子串吗,那么又是怎么截取的?

 

其实没有解释全,有点问题:

第三个参数,其实是长度,编译器里面也标注出来了

最后交给脚本:

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function decode($miwen){
$_o=base64_decode(strrev(str_rot13($miwen)));
//echo $_o;
for($_0=0;$_0<strlen($_o);$_0++)
{
$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_.= $_c;
}
return strrev($_);

}
echo decode($miwen);
?>

逆向思维编代码(不是我的强项),按加密原理,进行解密,乍一看其实不难

posted @ 2020-05-21 10:00  ch0bits  阅读(408)  评论(0编辑  收藏  举报