{"id":14,"date":"2026-04-14T15:11:21","date_gmt":"2026-04-14T07:11:21","guid":{"rendered":"https:\/\/www.seekinthevortex.cn\/?p=14"},"modified":"2026-04-14T15:11:21","modified_gmt":"2026-04-14T07:11:21","slug":"2025-%e5%9b%bd%e8%b5%9b","status":"publish","type":"post","link":"https:\/\/www.seekinthevortex.cn\/index.php\/2026\/04\/14\/2025-%e5%9b%bd%e8%b5%9b\/","title":{"rendered":"2025 \u56fd\u8d5b"},"content":{"rendered":"<h1>web-login<\/h1>\n<h2>\u9898\u76ee\u5206\u6790<\/h2>\n<blockquote>\n<p>[!\u9898\u76ee\u63cf\u8ff0]<br \/>\n\u9898\u76ee\u5185\u5bb9\uff1a<\/p>\n<ul>\n<li>\u67d0\u4eba\u672c\u60f3\u57282025\u5e7412\u6708\u7b2c\u4e09\u4e2a\u5468\u672b\u7206\u809d\u4e00\u4e2aweb\u5b89\u5168\u767b\u5f55demo\uff0c\u7ed3\u679c\u4e0d\u4ec5\u641e\u5230\u5468\u4e00\u51cc\u6668\uff0c\u4ed6\u81ea\u5df1\u8fd8\u5fd8\u4e86\u6210\u529f\u767b\u5f55\u65f6\u7684\u65f6\u95f4\u6233\u4e86\uff0c\u4f60\u80fd\u5e2e\u4ed6\u627e\u56de\u6765\u5417\uff1f<\/li>\n<li>\u63d0\u4ea4\u683c\u5f0f\u4e3aflag{\u65f6\u95f4\u6233\u6b63\u786e\u65f6\u7684check\u503c}\u3002\u662f\u4e00\u4e2a\u5927\u62ec\u53f7\u5185\u4e3a\u4e00\u4e2a32\u4f4d\u957f\u7684\u5c0f\u5199\u5341\u516d\u8fdb\u5236\u5b57\u7b26\u4e32\u3002<\/li>\n<li>\u9644\u4ef6\u4e0b\u8f7d \u63d0\u53d6\u7801\uff08GAME\uff09\u5907\u7528\u4e0b\u8f7d<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u9996\u5148\u770b\u5230\u9644\u4ef6\uff0c\u662f\u6ca1\u6709\u89c1\u8fc7\u7684\u7c7b\u578b\uff0c\u4f3c\u4e4e\u548cwasm\u76f8\u5173\u3002\u770b\u5230\u6587\u4ef6\u76ee\u5f55\u7ed3\u6784\u662f\u8fd9\u4e2a\u6837\u5b50\u7684\u3002<\/p>\n<pre><code class=\"language-shell\">D:.\n\u2502   crypto-js.js\n\u2502   index.html\n\u2502\n\u2514\u2500\u2500\u2500build\n        release.js\n        release.wasm\n        release.wasm.map\n<\/code><\/pre>\n<p>\u5728\u9a8c\u8bc1\u524d\uff0c\u6211\u4eec\u8981\u77e5\u9053wasm\u662f\u901a\u8fc7http\u8bf7\u6c42\u52a0\u8f7d\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u5728\u76ee\u6807\u6587\u4ef6\u5939\u542f\u52a8\u4e00\u4e2a\u672c\u5730\u670d\u52a1<\/p>\n<pre><code class=\"language-python\">python -m http.server 8000\n<\/code><\/pre>\n<p>\u6211\u4eec\u70b9\u5f00html\u9875\u9762\u770b\u4e00\u4e0b\uff0c\u53d1\u73b0\u662f\u4e00\u4e2a\u767b\u5f55\u9a8c\u8bc1\u7684\u754c\u9762\u3002\u5e94\u8be5\u662f\u9700\u8981\u6211\u4eec\u8f93\u5165\u7528\u6237\u540d\u548c\u5bc6\u7801\u901a\u8fc7<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251229221613.png\" alt=\"image.png|400\"><\/p>\n<p>F12\u770b\u4e00\u4e0b\u4ee3\u7801\uff0c\u770b\u4e00\u4e0b\u903b\u8f91\u662f\u600e\u4e48\u6837\u7684<\/p>\n<pre><code class=\"language-html\">&lt;script type=&quot;module&quot;&gt;\n\timport { authenticate } from &quot;.\/build\/release.js&quot;;\n    \/\/ \u521d\u59cb\u5316 WASM \u6a21\u5757\n    async function initWasm() {\n      const wasmStatus = document.getElementById('wasm-status');\n      const loginForm = document.getElementById('login-form');\n      const loginBtn = document.getElementById('login-btn');\n      const loginSpinner = document.getElementById('login-spinner');\n      const statusMessage = document.getElementById('status-message');\n      const errorMessage = document.getElementById('error-message');\n      const passwordInput = document.getElementById('password');\n      const togglePasswordBtn = document.getElementById('toggle-password');\n      \n      try {\n\n        \/\/ \u521d\u59cb\u5316\u5b8c\u6210\n        wasmStatus.textContent = 'WASM \u5df2\u52a0\u8f7d';\n        wasmStatus.classList.add('text-success');\n        \n        \/\/ \u5207\u6362\u5bc6\u7801\u53ef\u89c1\u6027\n        togglePasswordBtn.addEventListener('click', function() {\n          const type = passwordInput.getAttribute('type') === 'password' ? 'text' : 'password';\n          passwordInput.setAttribute('type', type);\n          \n          const icon = this.querySelector('i');\n          const text = this.querySelector('span');\n          \n          if (type === 'text') {\n            icon.classList.remove('fa-eye-slash');\n            icon.classList.add('fa-eye');\n            text.textContent = '\u9690\u85cf';\n          } else {\n            icon.classList.remove('fa-eye');\n            icon.classList.add('fa-eye-slash');\n            text.textContent = '\u663e\u793a';\n          }\n        });\n        \n        \/\/ \u767b\u5f55\u8868\u5355\u63d0\u4ea4\u5904\u7406\n        loginForm.addEventListener('submit', async function(e) {\n          e.preventDefault();\n          \n          \/\/ \u663e\u793a\u52a0\u8f7d\u72b6\u6001\n          loginBtn.disabled = true;\n          loginSpinner.classList.remove('hidden');\n          statusMessage.classList.add('hidden');\n          \n          try {\n            const username = document.getElementById('username').value;\n            const password = document.getElementById('password').value;\n            \n            \/\/ \u8c03\u7528 WASM \u4e2d\u7684 authenticate \u51fd\u6570\n            const authResult = authenticate(username, password);\n            const authData = JSON.parse(authResult);\n            \n            \/\/ \u6a21\u62df\u53d1\u9001\u5230\u670d\u52a1\u5668\n            console.log('\u53d1\u9001\u5230\u670d\u52a1\u5668\u7684\u6570\u636e:', authData);\n            \n            \/\/ \u6a21\u62df\u670d\u52a1\u5668\u54cd\u5e94\n            simulateServerRequest(authData)\n              .then(response =&gt; {\n                if (response.success) {\n                  \/\/ \u767b\u5f55\u6210\u529f\n                  alert('\u767b\u5f55\u6210\u529f\uff01');\n                } else {\n                  \/\/ \u767b\u5f55\u5931\u8d25\n                  showError(response.message || '\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5');\n                }\n              })\n              .catch(error =&gt; {\n                console.error('\u767b\u5f55\u9519\u8bef:', error);\n                showError('\u7f51\u7edc\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5');\n              })\n              .finally(() =&gt; {\n                \/\/ \u6062\u590d\u6309\u94ae\u72b6\u6001\n                loginBtn.disabled = false;\n                loginSpinner.classList.add('hidden');\n              });\n            \n          } catch (error) {\n            console.error('WASM \u5904\u7406\u9519\u8bef:', error);\n            showError('\u5185\u90e8\u9519\u8bef\uff0c\u8bf7\u8054\u7cfb\u7ba1\u7406\u5458');\n            \n            \/\/ \u6062\u590d\u6309\u94ae\u72b6\u6001\n            loginBtn.disabled = false;\n            loginSpinner.classList.remove('hidden');\n          }\n        });\n        \n        \/\/ \u663e\u793a\u9519\u8bef\u6d88\u606f\n        function showError(message) {\n          errorMessage.textContent = message;\n          statusMessage.classList.remove('hidden');\n          \n          \/\/ \u6dfb\u52a0\u52a8\u753b\u6548\u679c\n          const errorBox = statusMessage.querySelector('div');\n          errorBox.classList.add('animate-shake');\n          setTimeout(() =&gt; {\n            errorBox.classList.remove('animate-shake');\n          }, 500);\n        }\n        \n        \/\/ \u6a21\u62df\u670d\u52a1\u5668\u8bf7\u6c42\n        function simulateServerRequest(data) {\n          return new Promise(resolve =&gt; {\n            \/\/ \u6a21\u62df\u7f51\u7edc\u5ef6\u8fdf\n            setTimeout(() =&gt; {\n              \/\/ \u5b9e\u9645\u5e94\u7528\u4e2d\u8fd9\u91cc\u5e94\u8be5\u662f\u771f\u5b9e\u7684 API \u8bf7\u6c42\n              \/\/ \u8fd9\u91cc\u4ec5\u4f5c\u6f14\u793a\uff0c\u4f7f\u7528\u672c\u5730\u5224\u65ad\n              const check = CryptoJS.MD5(JSON.stringify(data)).toString(CryptoJS.enc.Hex);\n              if (check.startsWith(&quot;ccaf33e3512e31f3&quot;)){\n                resolve({ success: true });\n              }else{\n                resolve({ success: false });\n              }\n            }, 1000);\n          });\n        }\n        \n      } catch (error) {\n        console.error('WASM \u52a0\u8f7d\u5931\u8d25:', error);\n        wasmStatus.textContent = 'WASM \u52a0\u8f7d\u5931\u8d25';\n        wasmStatus.classList.add('text-danger');\n        \n        \/\/ \u7981\u7528\u767b\u5f55\u6309\u94ae\n        loginBtn.disabled = true;\n        loginBtn.classList.add('bg-neutral-400');\n        loginBtn.classList.remove('bg-primary', 'hover:bg-primary\/90');\n      }\n    }\n    \n    \/\/ \u9875\u9762\u52a0\u8f7d\u5b8c\u6210\u540e\u521d\u59cb\u5316 WASM\n    window.addEventListener('load', initWasm);\n&lt;\/script&gt;\n<\/code><\/pre>\n<p>\u53d1\u73b0\u8fd9\u4e2a<code>window.addEventListener('load', initWasm);<\/code>\u51fd\u6570\uff0c\u6240\u4ee5\u9875\u9762\u4f1a\u5728html\u6e32\u67d3\u597d\u540e\u52a0\u8f7dinitMasm\u51fd\u6570\uff0c\u4ece\u800c\u6267\u884c\u91cc\u9762\u7684\u4e00\u4e9b\u903b\u8f91\uff08\u5927\u6982\u5427\uff09<br \/>\n\u6211\u5728\u8fd9\u91cc\u603b\u7ed3\u4e86\u4e00\u4e9b[[Web\u9006\u5411]]\u76f8\u5173\u7684\u77e5\u8bc6\uff0c\u53ef\u4ee5\u7528\u6765\u53c2\u8003\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\u5c31\u53ef\u8ddf\u8e2a\u8fd9\u4e9b\u4e1c\u897f\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u627e\u5230\u63d0\u4ea4\u6309\u94ae\u4e4b\u540e\u4f1a\u89e6\u53d1\u7684\u51fd\u6570\u4e86\u3002<\/p>\n<pre><code class=\"language-js\">  const wasmStatus = document.getElementById('wasm-status');\n  const loginForm = document.getElementById('login-form');\n  const loginBtn = document.getElementById('login-btn');\n  const loginSpinner = document.getElementById('login-spinner');\n  const statusMessage = document.getElementById('status-message');\n  const errorMessage = document.getElementById('error-message');\n  const passwordInput = document.getElementById('password');\n  const togglePasswordBtn = document.getElementById('toggle-password');\n<\/code><\/pre>\n<p>\u6839\u636e\u4e0b\u9762\u7684button\u53ef\u4ee5\u77e5\u9053\uff0c\u6309\u4e0bbutton\u4e4b\u540e\u4f1a\u63d0\u4ea4\u4e00\u4e2a\u8868\u5355\uff0c\u7136\u540e\u89e6\u53d1 <code>loginForm.addEventListener('submit', async function(e)<\/code> \u8fd9\u4e2a\u51fd\u6570<\/p>\n<pre><code class=\"language-html\">&lt;button \n  type=&quot;submit&quot; \n  id=&quot;login-btn&quot;\n  class=&quot;w-full bg-primary hover:bg-primary\/90 text-white font-medium py-3 px-4 rounded-lg btn-hover flex items-center justify-center&quot;\n&gt;\n<\/code><\/pre>\n<p>\u5206\u6790\u4e0b\u9762\u7684\u51fd\u6570\u6211\u4eec\u53ef\u4ee5\u77e5\u9053\uff0c\u7a0b\u5e8f\u4ece\u6211\u4eec\u8fd9\u91cc\u8bfb\u8d70username\u548cpassword\u7136\u540e\u8c03\u7528wasm\u4e2d\u7684authenticate\u51fd\u6570\u5bf9\u4ed6\u4eec\u8fdb\u884c\u5904\u7406\uff0c\u7136\u540e\u901a\u8fc7JSON.parse()\u65b9\u6cd5\u89e3\u6790\u4ed6\u4eec\u3002<\/p>\n<pre><code class=\"language-js\">\/\/ \u83b7\u53d6username \u548c password\nconst username = document.getElementById('username').value;\nconst password = document.getElementById('password').value;\n\n\/\/ \u8c03\u7528 WASM \u4e2d\u7684 authenticate \u51fd\u6570\nconst authResult = authenticate(username, password);\nconst authData = JSON.parse(authResult);\n<\/code><\/pre>\n<p>\u6211\u4eec\u5c31\u53ef\u4ee5\u5c1d\u8bd5\u8f93\u5165\u4e00\u4e9b\u4e1c\u897f\u5e76\u901a\u8fc7\u65ad\u70b9\u6765\u770b\u4e00\u4e0b\u56de\u663e\uff0c\u9a8c\u8bc1\u4e00\u4e0b\u6211\u4eec\u7684\u60f3\u6cd5\u3002\u6b63\u597dhtml\u6700\u540e\u544a\u8bc9\u6211\u4eec<code>&lt;!-- \u6d4b\u8bd5\u8d26\u53f7 admin \u6d4b\u8bd5\u5bc6\u7801 admin--&gt;<\/code>\u6240\u4ee5\u6211\u4eec\u8f93\u5165\u8fd9\u4e2a\u3002<br \/>\n\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u5f97\u5230\u4e86\u4e00\u4e2ajson\uff0c\u91cc\u9762\u6709\u4e09\u4e2a\u6570\u636e\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251229224215.png\" alt=\"image.png|\"><\/p>\n<p>\u63a5\u4e0b\u6765\u7ee7\u7eed\u5f80\u4e0b\u5206\u6790, \u4f1a\u8c03\u7528simulateServerRequest\u51fd\u6570\uff0c\u5c06\u8fd4\u56de\u7684json\u901a\u8fc7md5\u7f16\u7801\uff0c\u7136\u540e\u6821\u9a8c\u524d\u9762\u662f\u5426\u4ee5\u7279\u5b9a\u7684\u6570\u5f00\u5934\u3002<br \/>\n\u8bf4\u767d\u4e86\u5c31\u662f\u9700\u8981\u6211\u4eec\u5206\u6790\u7206\u7834\u9664\u8fd4\u56de\u7684json\u7684md5\u7f16\u7801\u3002<\/p>\n<pre><code class=\"language-js\">simulateServerRequest(authData)\n  .then(response =&gt; {\n\tif (response.success) {\n\t  \/\/ \u767b\u5f55\u6210\u529f\n\t  alert('\u767b\u5f55\u6210\u529f\uff01');\n\t} else {\n\t  \/\/ \u767b\u5f55\u5931\u8d25\n\t  showError(response.message || '\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5');\n\t}\n  })\n  .catch(error =&gt; {\n\tconsole.error('\u767b\u5f55\u9519\u8bef:', error);\n\tshowError('\u7f51\u7edc\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5');\n  })\n  .finally(() =&gt; {\n\t\/\/ \u6062\u590d\u6309\u94ae\u72b6\u6001\n\tloginBtn.disabled = false;\n\tloginSpinner.classList.add('hidden');\n  });\n  \nfunction simulateServerRequest(data) {\n  return new Promise(resolve =&gt; {\n\t\/\/ \u6a21\u62df\u7f51\u7edc\u5ef6\u8fdf\n\tsetTimeout(() =&gt; {\n\t  \/\/ \u5b9e\u9645\u5e94\u7528\u4e2d\u8fd9\u91cc\u5e94\u8be5\u662f\u771f\u5b9e\u7684 API \u8bf7\u6c42\n\t  \/\/ \u8fd9\u91cc\u4ec5\u4f5c\u6f14\u793a\uff0c\u4f7f\u7528\u672c\u5730\u5224\u65ad\n\t  const check = CryptoJS.MD5(JSON.stringify(data)).toString(CryptoJS.enc.Hex);\n\t  if (check.startsWith(&quot;ccaf33e3512e31f3&quot;)){\n\t\tresolve({ success: true });\n\t  }else{\n\t\tresolve({ success: false });\n\t  }\n\t}, 1000);\n  });\n}\n<\/code><\/pre>\n<p>\u90a3\u63a5\u4e0b\u6765\u7684\u6b65\u9aa4\u5c31\u662f\u5206\u6790wasm\u4e86\uff0c\u6211\u4eec\u901a\u8fc7\u5de5\u5177wasm2c\u53cd\u7f16\u8bd1\uff0c\u4f1a\u5f97\u5230\u4e09\u4e2a\u6587\u4ef6<\/p>\n<pre><code class=\"language-shell\">output.c\noutput.h\noutput.wast\n<\/code><\/pre>\n<p>\u7136\u540e\u6211\u4eec\u7528gcc\u7f16\u8bd1\u5b83\uff0c\u4f46\u662f\u6ce8\u610f\u4f1a\u7f3a\u5c11\u5e93\u6587\u4ef6\uff0c\u6240\u4ee5\u6211\u4eec\u8981\u94fe\u63a5\u4e0a\u5b83\u3002\u6ce8\u610f\u8fd9\u91cc\u7684\u5e93\u6587\u4ef6\u5728\u4f60\u4e0b\u8f7d\u7684\u81ea\u5df1\u7684\u76ee\u5f55\u91cc\u9762\u3002<\/p>\n<pre><code class=\"language-shell\">gcc -c .\\output.c -I&quot;D:\\CTFtools\\reverse\\wabt\\wasm2c&quot; -o main.o\n<\/code><\/pre>\n<p>\u7136\u540e\u5c31\u53ef\u4ee5\u901a\u8fc7ida\u5206\u6790\u7f16\u8bd1\u51fa\u6765\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\u4e86\u3002\u4e0b\u9762\u662f\u5927\u81f4\u7684\u903b\u8f91\uff0c\u6240\u4ee5\u6211\u4eec\u63a5\u4e0b\u6765\u9700\u8981\u7206\u7834\u65f6\u95f4\u6233\uff0c\u7136\u540e\u5f97\u5230\u5bf9\u5e94\u7684\u7f16\u7801\u3002<\/p>\n<pre><code class=\"language-js\">f34(a1, username_ptr, password_ptr) {\n    1. \u5904\u7406password\u5b57\u7b26\u4e32\n    2. \u4f7f\u7528SHA256\u54c8\u5e0cpassword\n    3. \u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233\n    4. \u6784\u9020\u7b2c\u4e00\u4e2aJSON (username + password_hash)\n    5. Base64\u7f16\u7801\n    6. \u518d\u6b21Base64\u7f16\u7801\u65f6\u95f4\u6233\n    7. \u8fde\u63a5\u4e24\u4e2aBase64\u5b57\u7b26\u4e32\n    8. \u6784\u9020\u6700\u7ec8JSON (username + password_hash + signature)\n    9. \u8fd4\u56deJSON\u5b57\u7b26\u4e32\n}\n<\/code><\/pre>\n<h2>\u89e3\u5bc6\u811a\u672c<\/h2>\n<p>\u6211\u4eec\u5728console\u63a7\u5236\u53f0\u4e2d\u5728autenticate\u51fd\u6570\u4e0a\u6253\u4e0b\u65ad\u70b9\uff0c\u7136\u540e\u8c03\u7528\u8fd9\u4e2a\u51fd\u6570\u7206\u7834\u5c31\u53ef\u4ee5\u4e86\uff0c\u6839\u636e\u9898\u76ee\u7ed9\u7684\u63d0\u793a\uff0c\u6211\u4eec\u4f1a\u6709\u65f6\u95f4\u8303\u56f4\u3002<\/p>\n<pre><code class=\"language-js\">console.clear();\nconsole.log(&quot;\ud83d\ude80 \u7206\u7834\u5f00\u59cb&quot;);\n\n\/\/ \u8bbe\u5b9a\u76ee\u6807\u548c\u4e8b\u4ef6\u8303\u56f4\nconst TARGET = &quot;ccaf33e3512e31f3&quot;;\nconst START = new Date(&quot;2025-12-22T00:00:00+08:00&quot;).getTime();\nconst END = new Date(&quot;2025-12-22T06:00:00+08:00&quot;).getTime();\n\nconsole.log(&quot;\u8303\u56f4:&quot;, START, &quot;\u5230&quot;, END);\n\nconst orig = Date.now;\nlet mock = 0;\nDate.now = () =&gt; mock;\n\nfor (let t = START; t &lt;= END; t++) {\n    mock = t;\n    try {\n        let r = authenticate(&quot;admin&quot;, &quot;admin&quot;);\n        let h = CryptoJS.MD5(r).toString();\n        if (h.startsWith(TARGET)) {\n            console.log(&quot;\u2705 \u627e\u5230:&quot;, t);\n            console.log(&quot;\u65f6\u95f4:&quot;, new Date(t).toLocaleString());\n            console.log(&quot;MD5:&quot;, h);\n            console.log(&quot;Flag: flag{&quot; + h + &quot;}&quot;);\n            Date.now = orig;\n            break;\n        }\n        if ((t - START) % 10000 === 0) {\n            console.log(&quot;\u8fdb\u5ea6:&quot;, Math.floor((t-START)\/(END-START)*100) + &quot;%&quot;);\n        }\n    } catch(e) {\n        console.error(e);\n        Date.now = orig;\n        break;\n    }\n}\n<\/code><\/pre>\n<p>\u5f97\u5230\u7ed3\u679c\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251229230937.png\" alt=\"image.png\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>web-login \u9898\u76ee\u5206\u6790 [!\u9898\u76ee\u63cf\u8ff0] \u9898\u76ee\u5185\u5bb9\uff1a \u67d0\u4eba\u672c\u60f3\u57282025\u5e7412\u6708\u7b2c\u4e09\u4e2a\u5468\u672b\u7206\u809d\u4e00\u4e2aweb\u5b89 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":1,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":15,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/14\/revisions\/15"}],"wp:attachment":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}