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);
?>
逆向思维编代码(不是我的强项),按加密原理,进行解密,乍一看其实不难