Check server response of

Server response
NS records
Whois domain
Response headers
Request headers
Raw HTML code
301 Moved Permanently - sym01.com
HTTP Status: 301
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
Date: Sun, 18 May 2025 03:14:33 GMT
Content-Type: text/html
Content-Length: 167
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Sun, 18 May 2025 04:14:33 GMT
Location: https://sym01.com/
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=lwK1MgnDBy6WsdHwqx3vV01iydKaTRsPzwtyNpwk5ZKTYwXeMbYXRN3r%2BQ0lXw2YwhJM%2BDMtGBBQbYkEb9b34oM2ENil81ZZb6DC7fcueT8sq19%2F7tqg3rHutyqikuxQ58b5inM7iho%3D"}],"group":"cf-nel","max_age":604800}
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
X-Content-Type-Options: nosniff
speculation-rules: "/cdn-cgi/speculation"
Server: cloudflare
CF-RAY: 94182f5dea8ba68a-ARN
alt-svc: h3=":443"; ma=86400
server-timing: cfL4;desc="?proto=TCP&rtt=7589&min_rtt=7589&rtt_var=3794&sent=1&recv=3&lost=0&retrans=0&sent_bytes=0&recv_bytes=165&delivery_rate=0&cwnd=249&unsent_bytes=0&cid=0000000000000000&ts=0&x=0"

HTTP Code 301 Moved Permanently

301 Moved Permanently means that the requested resource has been permanently moved to a new URL. All future requests should use the new address.

When is Code 301 used?

  • When changing a website domain
  • When modifying URL structures
  • When setting up redirects for SEO

What does Code 301 mean for the user?

The browser will automatically redirect the user to the new address, and search engines will update their indexes.

200 OK - https://sym01.com/
HTTP Status: 200
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
Date: Sun, 18 May 2025 03:14:33 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: cloudflare
Speculation-Rules: "/cdn-cgi/speculation"
Cf-Ray: 94182f5e3fcf09ac-ARN
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
Referrer-Policy: strict-origin-when-cross-origin
X-Content-Type-Options: nosniff
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=Ta0TEtN563FgjtHwjV9ZgUVDvJD9ng1hQ2i73GKMRUtCUiP1eJPZ%2B7UBHCs9d3iXrxh31Vy8jSoT5qur5iuwkEcs%2BSMqAjPVQk%2FFpxRRQNhd8hUeWasdqAUkHZbZoBHYNwJQYZI%2FJ9M%3D"}],"group":"cf-nel","max_age":604800}
Nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Vary: Accept-Encoding
Cf-Cache-Status: DYNAMIC
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
alt-svc: h3=":443"; ma=86400
server-timing: cfL4;desc="?proto=TCP&rtt=7520&min_rtt=7497&rtt_var=2123&sent=5&recv=7&lost=0&retrans=0&sent_bytes=2819&recv_bytes=784&delivery_rate=537194&cwnd=252&unsent_bytes=0&cid=6778751703ee30de&ts=136&x=0"

HTTP Code 200 OK

200 OK is a standard successful HTTP server response. It means that the client’s request (e.g., from a browser) was successfully processed, and the server is delivering the requested data.

When is Code 200 used?

  • When loading a web page
  • When successfully receiving an API response
  • When processing a form or another HTTP request

What does Code 200 mean for the user?

The user receives content without errors, and the page or application functions properly. If Code 200 is accompanied by data, the browser or program processes and displays it to the user.

GET / HTTP/1.1
Host: sym01.com
Accept: */*
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
<!DOCTYPE html>
<html lang="en" dir="auto">

<head>
	<meta name="generator" content="Hugo 0.145.0"><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>SYM01</title>
<meta name="keywords" content="SYM01, Stay Young, Stay Naive, SYM01&#39;s Blog, Byte.Vet">
<meta name="description" content="">
<meta name="author" content="SYM01">
<link rel="canonical" href="https://sym01.com/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.45e028aa8ce0961349adf411b013ee39406be2c0bc80d4ea3fc04555f7f4611a.css" integrity="sha256-ReAoqozglhNJrfQRsBPuOUBr4sC8gNTqP8BFVff0YRo=" rel="preload stylesheet" as="style">
<link rel="icon" href="https://sym01.com/favicon.svg">
<link rel="icon" type="image/png" sizes="16x16" href="https://sym01.com/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://sym01.com/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://sym01.com/favicon.svg">
<link rel="mask-icon" href="https://sym01.com/favicon.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<link rel="alternate" type="application/rss+xml" href="https://sym01.com/index.xml">
<link rel="alternate" type="application/json" href="https://sym01.com/index.json">
<link rel="alternate" hreflang="en" href="https://sym01.com/">
<noscript>
    <style>
        #theme-toggle,
        .top-link {
            display: none;
        }

    </style>
    <style>
        @media (prefers-color-scheme: dark) {
            :root {
                --theme: rgb(29, 30, 32);
                --entry: rgb(46, 46, 51);
                --primary: rgb(218, 218, 219);
                --secondary: rgb(155, 156, 157);
                --tertiary: rgb(65, 66, 68);
                --content: rgb(196, 196, 197);
                --code-block-bg: rgb(46, 46, 51);
                --code-bg: rgb(55, 56, 62);
                --border: rgb(51, 51, 51);
            }

            .list {
                background: var(--theme);
            }

            .list:not(.dark)::-webkit-scrollbar-track {
                background: 0 0;
            }

            .list:not(.dark)::-webkit-scrollbar-thumb {
                border-color: var(--theme);
            }
        }

    </style>
</noscript>
      <script async src="https://www.googletagmanager.com/gtag/js?id=G-EH6W0S669D"></script>
      <script>
        var doNotTrack = false;
        if ( false ) {
          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
          var doNotTrack = (dnt == "1" || dnt == "yes");
        }
        if (!doNotTrack) {
          window.dataLayer = window.dataLayer || [];
          function gtag(){dataLayer.push(arguments);}
          gtag('js', new Date());
          gtag('config', 'G-EH6W0S669D');
        }
      </script><meta property="og:url" content="https://sym01.com/">
  <meta property="og:site_name" content="SYM01">
  <meta property="og:title" content="Posts">
  <meta property="og:locale" content="zh-CN">
  <meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Posts">
<meta name="twitter:description" content="">

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "SYM01",
  "url": "https://sym01.com/",
  "description": "",
  "logo": "https://sym01.com/favicon.svg",
  "sameAs": [
      "https://github.com/SYM01", "https://buymeacoffee.com/sym01"
  ]
}
</script>
</head>

<body class="list" id="top">
<script>
    if (localStorage.getItem("pref-theme") === "dark") {
        document.body.classList.add('dark');
    } else if (localStorage.getItem("pref-theme") === "light") {
        document.body.classList.remove('dark')
    } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
        document.body.classList.add('dark');
    }

</script>

<header class="header">
    <nav class="nav">
        <div class="logo">
            <a href="https://sym01.com/" accesskey="h" title="SYM01 (Alt + H)">
                <img src="https://sym01.com/favicon.svg" alt="" aria-label="logo"
                    height="32">SYM01</a>
            <div class="logo-switches">
                <button id="theme-toggle" accesskey="t" title="(Alt + T)" aria-label="Toggle theme">
                    <svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
                        stroke-linejoin="round">
                        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
                    </svg>
                    <svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
                        stroke-linejoin="round">
                        <circle cx="12" cy="12" r="5"></circle>
                        <line x1="12" y1="1" x2="12" y2="3"></line>
                        <line x1="12" y1="21" x2="12" y2="23"></line>
                        <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
                        <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
                        <line x1="1" y1="12" x2="3" y2="12"></line>
                        <line x1="21" y1="12" x2="23" y2="12"></line>
                        <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
                        <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
                    </svg>
                </button>
            </div>
        </div>
        <ul id="menu">
            <li>
                <a href="https://sym01.com/categories/" title="Categories">
                    <span>Categories</span>
                </a>
            </li>
            <li>
                <a href="https://sym01.com/tags/" title="Tags">
                    <span>Tags</span>
                </a>
            </li>
            <li>
                <a href="https://sym01.com/search/" title="Search (Alt &#43; /)" accesskey=/>
                    <span>Search</span>
                </a>
            </li>
        </ul>
    </nav>
</header>
<main class="main"> 
<article class="first-entry home-info">
    <header class="entry-header">
        <h1>Stay Young, Stay Naive.</h1>
    </header>
    <div class="entry-content">
        
    </div>
    <footer class="entry-footer">
        <div class="social-icons" >
    <a href="https://github.com/SYM01" target="_blank" rel="noopener noreferrer me"
        title="Github">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
    stroke-linecap="round" stroke-linejoin="round">
    <path
        d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22">
    </path>
</svg>
    </a>
    <a href="https://buymeacoffee.com/sym01" target="_blank" rel="noopener noreferrer me"
        title="Buymeacoffee">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 884 1279" fill="none" stroke="currentColor" stroke-width="2">
    <path d="M791.109 297.518L790.231 297.002L788.201 296.383C789.018 297.072 790.04 297.472 791.109 297.518Z"
        fill="currentColor"></path>
    <path d="M803.896 388.891L802.916 389.166L803.896 388.891Z" fill="currentColor"></path>
    <path
        d="M791.484 297.377C791.359 297.361 791.237 297.332 791.118 297.29C791.111 297.371 791.111 297.453 791.118 297.534C791.252 297.516 791.379 297.462 791.484 297.377Z"
        fill="currentColor"></path>
    <path d="M791.113 297.529H791.244V297.447L791.113 297.529Z" fill="currentColor"></path>
    <path
        d="M803.111 388.726L804.591 387.883L805.142 387.573L805.641 387.04C804.702 387.444 803.846 388.016 803.111 388.726Z"
        fill="currentColor"></path>
    <path d="M793.669 299.515L792.223 298.138L791.243 297.605C791.77 298.535 792.641 299.221 793.669 299.515Z"
        fill="currentColor"></path>
    <path
        d="M430.019 1186.18C428.864 1186.68 427.852 1187.46 427.076 1188.45L427.988 1187.87C428.608 1187.3 429.485 1186.63 430.019 1186.18Z"
        fill="currentColor"></path>
    <path
        d="M641.187 1144.63C641.187 1143.33 640.551 1143.57 640.705 1148.21C640.705 1147.84 640.86 1147.46 640.929 1147.1C641.015 1146.27 641.084 1145.46 641.187 1144.63Z"
        fill="currentColor"></path>
    <path
        d="M619.284 1186.18C618.129 1186.68 617.118 1187.46 616.342 1188.45L617.254 1187.87C617.873 1187.3 618.751 1186.63 619.284 1186.18Z"
        fill="currentColor"></path>
    <path
        d="M281.304 1196.06C280.427 1195.3 279.354 1194.8 278.207 1194.61C279.136 1195.06 280.065 1195.51 280.684 1195.85L281.304 1196.06Z"
        fill="currentColor"></path>
    <path
        d="M247.841 1164.01C247.704 1162.66 247.288 1161.35 246.619 1160.16C247.093 1161.39 247.489 1162.66 247.806 1163.94L247.841 1164.01Z"
        fill="currentColor"></path>
    <path
        d="M472.623 590.836C426.682 610.503 374.546 632.802 306.976 632.802C278.71 632.746 250.58 628.868 223.353 621.274L270.086 1101.08C271.74 1121.13 280.876 1139.83 295.679 1153.46C310.482 1167.09 329.87 1174.65 349.992 1174.65C349.992 1174.65 416.254 1178.09 438.365 1178.09C462.161 1178.09 533.516 1174.65 533.516 1174.65C553.636 1174.65 573.019 1167.08 587.819 1153.45C602.619 1139.82 611.752 1121.13 613.406 1101.08L663.459 570.876C641.091 563.237 618.516 558.161 593.068 558.161C549.054 558.144 513.591 573.303 472.623 590.836Z"
        fill="currentColor"></path>
    <path d="M78.6885 386.132L79.4799 386.872L79.9962 387.182C79.5987 386.787 79.1603 386.435 78.6885 386.132Z"
        fill="currentColor"></path>
    <path
        d="M879.567 341.849L872.53 306.352C866.215 274.503 851.882 244.409 819.19 232.898C808.711 229.215 796.821 227.633 788.786 220.01C780.751 212.388 778.376 200.55 776.518 189.572C773.076 169.423 769.842 149.257 766.314 129.143C763.269 111.85 760.86 92.4243 752.928 76.56C742.604 55.2584 721.182 42.8009 699.88 34.559C688.965 30.4844 677.826 27.0375 666.517 24.2352C613.297 10.1947 557.342 5.03277 502.591 2.09047C436.875 -1.53577 370.983 -0.443234 305.422 5.35968C256.625 9.79894 205.229 15.1674 158.858 32.0469C141.91 38.224 124.445 45.6399 111.558 58.7341C95.7448 74.8221 90.5829 99.7026 102.128 119.765C110.336 134.012 124.239 144.078 138.985 150.737C158.192 159.317 178.251 165.846 198.829 170.215C256.126 182.879 315.471 187.851 374.007 189.968C438.887 192.586 503.87 190.464 568.44 183.618C584.408 181.863 600.347 179.758 616.257 177.304C634.995 174.43 647.022 149.928 641.499 132.859C634.891 112.453 617.134 104.538 597.055 107.618C594.095 108.082 591.153 108.512 588.193 108.942L586.06 109.252C579.257 110.113 572.455 110.915 565.653 111.661C551.601 113.175 537.515 114.414 523.394 115.378C491.768 117.58 460.057 118.595 428.363 118.647C397.219 118.647 366.058 117.769 334.983 115.722C320.805 114.793 306.661 113.611 292.552 112.177C286.134 111.506 279.733 110.801 273.333 110.009L267.241 109.235L265.917 109.046L259.602 108.134C246.697 106.189 233.792 103.953 221.025 101.251C219.737 100.965 218.584 100.249 217.758 99.2193C216.932 98.1901 216.482 96.9099 216.482 95.5903C216.482 94.2706 216.932 92.9904 217.758 91.9612C218.584 90.9319 219.737 90.2152 221.025 89.9293H221.266C232.33 87.5721 243.479 85.5589 254.663 83.8038C258.392 83.2188 262.131 82.6453 265.882 82.0832H265.985C272.988 81.6186 280.026 80.3625 286.994 79.5366C347.624 73.2301 408.614 71.0801 469.538 73.1014C499.115 73.9618 528.676 75.6996 558.116 78.6935C564.448 79.3474 570.746 80.0357 577.043 80.8099C579.452 81.1025 581.878 81.4465 584.305 81.7391L589.191 82.4445C603.438 84.5667 617.61 87.1419 631.708 90.1703C652.597 94.7128 679.422 96.1925 688.713 119.077C691.673 126.338 693.015 134.408 694.649 142.03L696.732 151.752C696.786 151.926 696.826 152.105 696.852 152.285C701.773 175.227 706.7 198.169 711.632 221.111C711.994 222.806 712.002 224.557 711.657 226.255C711.312 227.954 710.621 229.562 709.626 230.982C708.632 232.401 707.355 233.6 705.877 234.504C704.398 235.408 702.75 235.997 701.033 236.236H700.895L697.884 236.649L694.908 237.044C685.478 238.272 676.038 239.419 666.586 240.486C647.968 242.608 629.322 244.443 610.648 245.992C573.539 249.077 536.356 251.102 499.098 252.066C480.114 252.57 461.135 252.806 442.162 252.771C366.643 252.712 291.189 248.322 216.173 239.625C208.051 238.662 199.93 237.629 191.808 236.58C198.106 237.389 187.231 235.96 185.029 235.651C179.867 234.928 174.705 234.177 169.543 233.397C152.216 230.798 134.993 227.598 117.7 224.793C96.7944 221.352 76.8005 223.073 57.8906 233.397C42.3685 241.891 29.8055 254.916 21.8776 270.735C13.7217 287.597 11.2956 305.956 7.64786 324.075C4.00009 342.193 -1.67805 361.688 0.472751 380.288C5.10128 420.431 33.165 453.054 73.5313 460.35C111.506 467.232 149.687 472.807 187.971 477.556C338.361 495.975 490.294 498.178 641.155 484.129C653.44 482.982 665.708 481.732 677.959 480.378C681.786 479.958 685.658 480.398 689.292 481.668C692.926 482.938 696.23 485.005 698.962 487.717C701.694 490.429 703.784 493.718 705.08 497.342C706.377 500.967 706.846 504.836 706.453 508.665L702.633 545.797C694.936 620.828 687.239 695.854 679.542 770.874C671.513 849.657 663.431 928.434 655.298 1007.2C653.004 1029.39 650.71 1051.57 648.416 1073.74C646.213 1095.58 645.904 1118.1 641.757 1139.68C635.218 1173.61 612.248 1194.45 578.73 1202.07C548.022 1209.06 516.652 1212.73 485.161 1213.01C450.249 1213.2 415.355 1211.65 380.443 1211.84C343.173 1212.05 297.525 1208.61 268.756 1180.87C243.479 1156.51 239.986 1118.36 236.545 1085.37C231.957 1041.7 227.409 998.039 222.9 954.381L197.607 711.615L181.244 554.538C180.968 551.94 180.693 549.376 180.435 546.76C178.473 528.023 165.207 509.681 144.301 510.627C126.407 511.418 106.069 526.629 108.168 546.76L120.298 663.214L145.385 904.104C152.532 972.528 159.661 1040.96 166.773 1109.41C168.15 1122.52 169.44 1135.67 170.885 1148.78C178.749 1220.43 233.465 1259.04 301.224 1269.91C340.799 1276.28 381.337 1277.59 421.497 1278.24C472.979 1279.07 524.977 1281.05 575.615 1271.72C650.653 1257.95 706.952 1207.85 714.987 1130.13C717.282 1107.69 719.576 1085.25 721.87 1062.8C729.498 988.559 737.115 914.313 744.72 840.061L769.601 597.451L781.009 486.263C781.577 480.749 783.905 475.565 787.649 471.478C791.392 467.391 796.352 464.617 801.794 463.567C823.25 459.386 843.761 452.245 859.023 435.916C883.318 409.918 888.153 376.021 879.567 341.849ZM72.4301 365.835C72.757 365.68 72.1548 368.484 71.8967 369.792C71.8451 367.813 71.9483 366.058 72.4301 365.835ZM74.5121 381.94C74.6842 381.819 75.2003 382.508 75.7337 383.334C74.925 382.576 74.4089 382.009 74.4949 381.94H74.5121ZM76.5597 384.641C77.2996 385.897 77.6953 386.689 76.5597 384.641V384.641ZM80.672 387.979H80.7752C80.7752 388.1 80.9645 388.22 81.0333 388.341C80.9192 388.208 80.7925 388.087 80.6548 387.979H80.672ZM800.796 382.989C793.088 390.319 781.473 393.726 769.996 395.43C641.292 414.529 510.713 424.199 380.597 419.932C287.476 416.749 195.336 406.407 103.144 393.382C94.1102 392.109 84.3197 390.457 78.1082 383.798C66.4078 371.237 72.1548 345.944 75.2003 330.768C77.9878 316.865 83.3218 298.334 99.8572 296.355C125.667 293.327 155.64 304.218 181.175 308.09C211.917 312.781 242.774 316.538 273.745 319.36C405.925 331.405 540.325 329.529 671.92 311.91C695.906 308.686 719.805 304.941 743.619 300.674C764.835 296.871 788.356 289.731 801.175 311.703C809.967 326.673 811.137 346.701 809.778 363.615C809.359 370.984 806.139 377.915 800.779 382.989H800.796Z"
        fill="currentColor"></path>
</svg>
    </a>
</div>

    </footer>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">MySQL Order By 注入的小技巧
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 前几年在工作上遇到了一个 MySQL 的注入问题,注入点在 order by 后面,类似于
select 1 from dual order by &#34;&#34;, *;` 其中, * 所在的地方即为注入点。
随即本人尝试对这个点进行注入,经过若干次尝试后均以失败告终。 具体尝试结果如下:
1. 报错注入 尝试使用常见的 GTID_SUBSET() 函数进行报错注入,发现 order by 后没有发挥应用的效果。
2. 延时注入 尝试使用的 sleep() 函数进行延时注入,发现 order by 后没有发挥应用的效果。
此时你可能会发现, order by 后面的行为稍显怪异,难以琢磨。 难道就没有办法利用这个注入了吗?肯定得有,不然这篇文章就写不下去了。
0x01 order by 后的注入 POC 在经过若干次尝试后,本人发现下面的查询语句能够触发报错。
select 1 from dual order by &#34;&#34;,(SELECT(1)FROM(SELECT(GTID_SUBSET(2,2))where(1=1))test); # 报错 select 1 from dual order by &#34;&#34;,(SELECT(1)FROM(SELECT(GTID_SUBSET(2,2))where(1=2))test); # 不报错 因此,完全可以利用上述语句进行 bool 类型的注入, 甚至直接一点,利用该特性进行报错注入:
或者将 GTID_SUBSET 换成 sleep 进行延时注入。
0x02 未完待续 本文能够利用一些特殊的 SQL,对 order by 后的注入点进行注入。然而,这个只是表现,并非原理。至于 MySQL 的行为为何如此奇怪,本人并没有了解清楚,有待研究。
...</p>
  </div>
  <footer class="entry-footer"><span title='2024-06-17 23:10:27 +0800 +0800'>June 17, 2024</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;84 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to MySQL Order By 注入的小技巧" href="https://sym01.com/posts/2024/mysql-tricks/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">再谈 IP 伪造
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 本篇文章最早由笔者发布在漕河泾小黑屋公众号上。然而,公众号始终不利于分享,故重新发表于博客上。
本篇文章主要介绍几种常见的伪造来源 IP 的方式。
0x01 方式1: X-Forwarded-For 这个是最为认知的 IP 伪造方法,早年的 CTF 题目也经常涉及,然而现在知道的人太多, CTF 都不屑于出这类题目。 X-Forwarded-For 诞生的原因比较简单粗暴。 对于一个非常简单的网络模型, 一个网络请求通常只有两方,即请求方与被请求方,如下所示。这样的网络模型下, Web Server 是可以拿到 User 的真实 IP 地址的,即使拿到的可能是路由器的地址。
User --&gt; Web Server 但是上了规模的网站,其网络模型不会这么简单,它可能长这样:
User --&gt; CDN --&gt; Web Server 在这种场景下, CDN 依旧可以拿到 User 的真实 IP 地址,然而 Web Server 却无法直接拿到。 为了解决这个问题, 有人提出了 X-Forwarded-For, 它作为 HTTP Header 传递给后端的 Web Server,其格式如下:
X-Forwarded-For: 1.0.0.1, 2.0.0.2 细心的朋友可能会发现, 我是不是可以直接将 1.0.0.1 改成任意 IP 地址,然后直接将请求发送给 Web Server?没错,这就是非常简单的 X-Forwarded-For IP 伪造攻击。一般这类问题的解决思路是,校验 4 层协议的来源 IP,判断是否为可信 IP,比如是否为 CDN 的 IP。如果可信,才会尝试解析 X-Fowarded-For Header。
...</p>
  </div>
  <footer class="entry-footer"><span title='2024-06-17 21:31:33 +0800 +0800'>June 17, 2024</span>&nbsp;·&nbsp;3 min&nbsp;·&nbsp;546 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to 再谈 IP 伪造" href="https://sym01.com/posts/2023/ip-forgery/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">Chrome 反调试之检测 DevTools
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 前言的前言 笔者一直认为反调试不是银弹,它只能有限地提升利用成本,并没有本质上的改善
最近的一个项目里,不得不引入一些反调试的手段。因此,笔者对近些年来的 Chrome 反调试技术进行了回顾与测试。 在比较流行的反调试技术里,经常提到的有以下几类:
通过死循环 debugger 让用户无法正常调试 通过 HTML Element 的 id 属性检测 devtools 是否被开启 通过正则表达式的 toString() 方法检测 devtools 是否被开启 方法 1 依旧是简单有效的手段。由于过于简单,容易被发现,一般配合代码混淆以及 eval() 等动态代码执行特性实现。这种方式也容易违反 CSP 。如果没有结合动态代码执行,这个方式很容易被发现并且绕过。
方法 2、3 很不幸,在最新的 Chrome 中已经无法利用。关于 2 ,有个 Chromium 的 issue 记录了这个问题以及它的修复方式。关于 3, 笔者暂时没有没有找到 Chrome 的修复记录。
出于上述原因,笔者不得不找到更多的反调试实现。经过一番测试,找到了一个通过 sourcemap 检测 devtools 的方法。
0x01 SourceMap 检测 DevTools 的实现 关于 SourceMap 及其详细用途可参考 Mozilla 的介绍文档 。
为了加快下载于加载速度,现代网页的 JS 文件普遍被最小化(minified)处理过,去除了不必要的元素,简化了实现,甚至重命名一些变量/函数,提换成更简短的命名方式。这种抠到家的方式,对于开发人员的 debug 和 troubleshooting 是很不利,开发人员自己都读不懂这些 JS 文件。 因此,SourceMap 诞生了。
...</p>
  </div>
  <footer class="entry-footer"><span title='2023-05-06 14:19:39 +0800 +0800'>May 6, 2023</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;168 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to Chrome 反调试之检测 DevTools" href="https://sym01.com/posts/2023/chrome-devtool-detection/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">Web 3 与 Tor
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 最近 Web 3 概念炒的火热,即使不想关注,票圈里依旧有许多人在潜移默化地让你关注。上一次这么火爆的概念还是元宇宙。
鄙人不成熟的认知告诉我,一旦一个东西开始大火,火到连菜场大妈都知道的时候,那么这个东西往往没有太大的关注的价值了。毕竟有趣好玩的东西往往掌握在少数人手里。
为了验证我不成熟的认知,我决定花一个小时的时间好好研究一下 Web 3。
0x01 什么是 Web 3 Web3(也被称为Web 3.0,又写为web3)是关于万维网发展的一个概念,主要与基于区块链的去中心化、加密货币以及非同质化代币有关。 – Wikipedia
看起来 Web 3 的定义十分美好,去中心化。然而我注意到,
与区块链有关的web3概念是由以太坊联合创始人Gavin Wood于2014年提出 – Wikipedia
读到这一信息的时候,瞬间就将没了继续研究下去的动力。
几经纠结后,还是决定将 Web 3 关键的亮点看完。关于 Web 3 的关键优势,各个网站有略微不同的说法,比如 Wikipedia 上,认为 Web 3 的优势在于:
将互联网转化为数据库 向人工智能进化的道路 语义网和SOA的实现 向3D进化 等等 鄙人以为,除了第1点,其它优势纯属扯淡。毕竟除了第1点以外,其它优势 Web 2.0 也能实现。
至此, Web 3 的关键亮点可总结为 对等 与 去中心化,以及因此带来的自由(无监管)。
研究到这里,一些人可能已经发现了,Tor、Freenet、I2P 等不都具备上述关键亮点吗?
要是硬是要说出点区别,也是有的:
Web 3 基于区块链 Tor、Freenet、I2P 比 Web 3 省资源 (毕竟不需要挖矿,也不需要大量存储区块数据) 比 Web 3 多了匿名特性(也有人认为区块链也是匿名的,这里不争论,你认为是匿名的就是匿名的) 这么一比,Tor、Freenet、I2P 反倒比 Web 3 还好?
...</p>
  </div>
  <footer class="entry-footer"><span title='2022-05-03 14:01:09 +0800 +0800'>May 3, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;179 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to Web 3 与 Tor" href="https://sym01.com/posts/2022/web3-vs-tor/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">利用 URN 绕过 URL 检查
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 最近痴迷于看 RFC 及各类规范文档,从中发现一些有趣的利用。刚好前段时间发现了一处有趣的特性,成功绕过了某个知名站点的 XSS 防御,最终执行 XSS 攻击。本来以为只是一个小 trick,后来被某偶像拿来出了道 CTF 题目,觉得有必要分享一下。
0x01 一个真实 case 及其绕过 几个月前发现某网站上有类似于下面的逻辑,会从 URL 中取 next 参数的值,并解析出 pathname 部分,执行跳转。
const getParam = (key) =&gt; { return new URL(location).searchParams.get(key) } const nextURL = getParam(&#39;next&#39;) if (nextURL) { const u = new URL(nextURL) location.href = &#34;&#34; &#43; u.pathname } 老司机应当可以发现,如果 u.pathname 能够以 javascript: 开头,那么就可以执行 XSS 攻击了。然而,pathname 会多带一个 ‘/’ ,导致利用失败,无法 XSS。
爱折腾的人怎么会止步于此呢,这个问题的突破点在于 new URL(M).pathname 。根据规范,如果cannot-be-a-base-URL 为 true,那么 pathname 等价于 path[0]。
刚好规范中就给出了满足这类条件的 case,如下图所示
因此,只要构造 ?next=urn:javascript:alert(location.origin) 即可绕过改限制并执行 XSS 攻击。
...</p>
  </div>
  <footer class="entry-footer"><span title='2021-08-22 16:50:07 +0800 +0800'>August 22, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;92 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to 利用 URN 绕过 URL 检查" href="https://sym01.com/posts/2021/bypassing-url-check-via-urn/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">利用 multipart boundary 绕过 WAF
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 WAF(Web Application Firewall)是很常见的 Web 安全基础设施,许多云厂商、大厂、乙方安全公司均有相应的产品。然而,不得不承认,WAF 只能有限提升安全防护能力,不能拦截一些稍微复杂的攻击。正常业务不应当过度依赖 WAF,况且 WAF 还存在误拦截正常业务流量的可能。
目前已知的一些绕过 WAF 的手段包括但不限于:
Chunked encoding 绕过 IBM037 等罕见编码绕过 多嘴一句:最早提出 IBM037 编码绕过 WAF 的应该是 Soroush Dalili 在 SteelCon 2017 上的议题,然而国内众多相关文章,基本没有标记出处,很奇怪。
笔者最近在分析 Go 语言的 HTTP 协议解析实现的时候,发现了一种能够利用 multipart boundary 绕过 WAF 的方法,在 Python 的一些 Web 框架上也适用,因而将其分享出来。
0x01 绕过 multipart/form-data 是一种非常常见的 HTML 表单编码方式,绝大部分的 Web 服务器、框架实现,均支持此编码。其编码后的请求大致如下所示,表单数据通过boundary分割。
POST /test HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=“boundary” —boundary Content-Disposition: form-data; name=“field1” value1 —boundary Content-Disposition: form-data; name=“field2”; filename=“example.txt” value2 —boundary— 那么只要满足上述协议要求,服务端就可以正常获取到字段内容了,如下图所示。 ...</p>
  </div>
  <footer class="entry-footer"><span title='2021-08-02 02:28:33 +0800 +0800'>August 2, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;182 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to 利用 multipart boundary 绕过 WAF" href="https://sym01.com/posts/2021/bypass-waf-via-boundary-confusion/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">构建一个安全可靠的 HTML 富文本过滤器
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 许久以前接到一个需求,实现一个 HTML 富文本过滤的基础库。这个需求在其它语言实现中有许多久经考验的开源库,比如 NodeJS 有 DOMPurify ,但在 Go 中却异常尴尬,没有一个合适的、久经考验的 HTML 富文本过滤库。即使运气好找到了一个,也很难保证这个库是安全可靠的。思来想去,还是决定自己做一套性能扛得住、安全可靠的 Go 语言实现。
其实相关代码在 2020 年的时候就已经完成,但一直没有介绍其实现。好在最近开启的 躺平模式 ,终于可以唠一唠这个东西是怎么实现的了。
0x01 原理 咱们的目标是做一套性能扛得住、安全可靠的 Go 语言实现,其核心关键词是性能和安全:
处于安全考虑,这里不能轻易地使用第三方的 DOM 解析库(毕竟也不知道靠不靠谱),最为稳妥的办法是做一个 HTML 的最小语义支持,不管输入如何,这个库只支持它认为正常的HTML 语法。 要满足性能需求,算法复杂度不宜太高,最好是线性扫描 所以最终决定使用 DFA(确定有限状态自动机) 从 0 构建一个 HTML 解析器。
提到 DFA 有些同学可能会一头雾水,但提到正则表达式大家可能会相对熟悉一点。一个正则表达式,可能是一个 DFA,也有可能是一个 NFA(非确定有限状态自动机)。比如
a*ab 这个正则表达式是一个 NFA a&#43;b 这个正则表达式则是一个 DFA 很明显,上面两个正则表达式是等价的,NFA 是可以和 DFA 互转的。
实现具体的 DFA 之前,我们需要先把整个状态机的实现勾勒出来,避免写代码的时候一头雾水。因此,我们按照设想的 “HTML 的最小语义支持”,画了下面这张状态图。
HTML 解析过程的 DFA 源文件
实际上 ETAG_END、TAG_END、NORMAL 是同一种状态,但为了实现方便,这里拆成了三种状态
0x02 实现 安全标签&#43;安全属性 状态机画出来后,还需要总结出所有的安全标签&#43;安全属性。安全标签这个概念比较好理解,类似与 &lt;script&gt; 这种可以造成 XSS 的标签,肯定不属于安全标签。类似的,onerror 这类属性,肯定也不属于安全属性。最终我们梳理出了这么一份安全标签&#43;安全属性列表。
...</p>
  </div>
  <footer class="entry-footer"><span title='2021-06-05 15:28:52 +0800 +0800'>June 5, 2021</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;227 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to 构建一个安全可靠的 HTML 富文本过滤器" href="https://sym01.com/posts/2021/how-to-make-a-secure-html-filter/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">iOS 中利用 Frida 解密任意 APP 的流量
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 最近测试的APP里,越来越多的APP采用了加密流量的通信方式,即在原有的HTTP、HTTPS流量之上,又做了一层加密。
要对这些加密过程进行逆向,无疑要耗费大量的工作量,时间可能不允许。因此,可采用一种Hook的方式,将加密前/解密后的流量截获下来。
0x01 原理 通过加密流量与远端进行通信,势必会调用响应的加密、解密函数。因此,可通过Frida直接将未加密的流量Hook出来。
然而这样只能查看未加密的流量,不能篡改里边的数据,显然不太实用。因此,我们需要允许用户在流量进行加密/解密时,篡改里边的内容。
实现思路较为简单,如下所示:
Hook加密函数,中断加密过程,将未加密的数据发送到本地搭建的一个服务器,并将HTTP代理设置为Burpsuite的代理 本地搭建的服务器原封不动地返回请求数据 Hook点收到服务器返回的数据后,利用服务器返回的数据替换原有数据,并恢复加密函数的执行过程 重复1、2、3的步骤,Hook掉解密函数 这样一来,Burpsuite就能够发挥其原有的作用,劫持未加密的流量,并对流量内容进行篡改了。
0x02 实现 以某APP为例,首先起一个echo服务器线程,专门负责原封不动地返回客户端的请求数据;其次用Frida hook掉相关加解密函数,将未加密的流量通过Burpsuite代理发往echo服务器。相关脚本内容如下:
#!/usr/bin/env python3 # coding: utf-8 from time import sleep from threading import Thread from http.server import HTTPServer, BaseHTTPRequestHandler import sys import requests import frida ECHO_PORT = 28080 BURP_PORT = 8080 class RequestHandler(BaseHTTPRequestHandler): def do_REQUEST(self): content_length = int(self.headers.get(&#39;content-length&#39;, 0)) self.send_response(200) self.end_headers() self.wfile.write(self.rfile.read(content_length)) do_RESPONSE = do_REQUEST def echo_server_thread(): print(&#39;start echo server at port {}&#39;.format(ECHO_PORT)) server = HTTPServer((&#39;&#39;, ECHO_PORT), RequestHandler) server.serve_forever() # start echo server first t = Thread(target=echo_server_thread) t.daemon = True t.start() session = frida.get_usb_device().attach(&#39;平安普惠&#39;) script = session.create_script(&#39;&#39;&#39; var reqMethod = ObjC.classes.PHNetworkAgent[&#39;- requestOperationWithHTTPMethod:requestSerializer:URLString:parameters:&#39;]; var respDecrypt = ObjC.classes.PHSecurityHelper[&#39;&#43; phUnSecurityAESWithAesKey:content:&#39;]; var NSString = ObjC.classes.NSString; Interceptor.attach(reqMethod.implementation, { onEnter: function (args) { var methodStr = new ObjC.Object(args[2]).toString(); var urlStr = new ObjC.Object(args[4]).toString(); var param = new ObjC.Object(args[5]); var paramStr = param[&#39;- uxy_JSONString&#39;]().toString(); var data = { method: methodStr, url: urlStr, param: paramStr, }; send({type: &#39;REQ&#39;, data: data}) var op = recv(&#39;NEW_REQ&#39;, function(val) { var data = val.payload; args[2] = NSString.stringWithString_(data.method); args[4] = NSString.stringWithString_(data.url); args[5] = NSString.stringWithString_(data.param)[&#39;&#43; __uxy_JSONObject&#39;](); }); op.wait(); } }); Interceptor.attach(respDecrypt.implementation, { onLeave: function (retval) { var resp = new ObjC.Object(retval); var data = resp.toString(); send({type: &#39;RESP&#39;, data: data}) var op = recv(&#39;NEW_RESP&#39;, function(val) { var data = val.payload; var newRetval = NSString.stringWithString_(data); retval.replace(newRetval); }); op.wait(); } }); &#39;&#39;&#39;) def on_message(message, data): if message[&#39;type&#39;] == &#39;send&#39;: payload = message[&#39;payload&#39;] _type, data = payload[&#39;type&#39;], payload[&#39;data&#39;] if _type == &#39;REQ&#39;: r = requests.request(&#39;REQUEST&#39;, &#39;http://127.0.0.1:{}/&#39;.format(ECHO_PORT), proxies={&#39;http&#39;: &#39;http://127.0.0.1:{}&#39;.format(BURP_PORT)}, data=data[&#39;param&#39;].encode(&#39;utf-8&#39;), headers={ &#39;REQ_METHOD&#39;: data[&#39;method&#39;], &#39;REQ_URL&#39;: data[&#39;url&#39;], }) new_data = { &#39;method&#39;: r.headers.get(&#39;REQ_METHOD&#39;, data[&#39;method&#39;]), &#39;url&#39;: r.headers.get(&#39;REQ_URL&#39;, data[&#39;url&#39;]), &#39;param&#39;: r.text } script.post({&#39;type&#39;: &#39;NEW_REQ&#39;, &#39;payload&#39;: new_data}) elif _type == &#39;RESP&#39;: r = requests.request(&#39;RESPONSE&#39;, &#39;http://127.0.0.1:{}/&#39;.format(ECHO_PORT), proxies={&#39;http&#39;: &#39;http://127.0.0.1:{}&#39;.format(BURP_PORT)}, data=data.encode(&#39;utf-8&#39;)) script.post({&#39;type&#39;: &#39;NEW_RESP&#39;, &#39;payload&#39;: r.text}) script.on(&#39;message&#39;, on_message) script.load() sys.stdin.read() 0x03 总结 套用上面的模板,可以快速地对加密流量的APP进行测试。然而实际应用上的难点在于找到相关加解密的函数,对于Objective-C这类没有明显调用关系的APP更甚。
...</p>
  </div>
  <footer class="entry-footer"><span title='2019-11-04 19:04:29 +0800 +0800'>November 4, 2019</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;282 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to iOS 中利用 Frida 解密任意 APP 的流量" href="https://sym01.com/posts/2019/ios-debug-encrypted-traffic-with-frida/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2 class="entry-hint-parent">Revel框架的一处DoS问题
    </h2>
  </header>
  <div class="entry-content">
    <p>0x00 前言 Revel 是一个基于Golang的灵活的Web框架,大量应用了Golang的反射特性,使得其可以类似于Django那样快速地建立一个网站。前段时间在翻阅Revel框架的文档时,发现其某个特性可能存在DoS问题,故对该特性的相关源码进行了审计,发现了一处非常容易利用的DoS问题,利用单个请求即可打挂Revel的服务器。
好在该DoS的利用是有条件的,当且仅当网站使用了Revel框架获取slice类型的参数时才会触发。
0x01 分析 Revel框架为开发者提供了许多有用的特性,其中一个特性允许开发者直接获取数组类型的数据。如当用户访问http://example.com/?keys[]=1&amp;keys[]=2时,开发者可直接将keys参数视为slice类型(Golang中对数组的封装)。
该特性在Revel中是通过反射&#43;Binder实现的,其中专门用于处理slice类型的函数如下。
func bindSlice(params *Params, name string, typ reflect.Type) reflect.Value { // Collect an array of slice elements with their indexes (and the max index). maxIndex := -1 numNoIndex := 0 sliceValues := []sliceValue{} // Factor out the common slice logic (between form values and files). processElement := func(key string, vals []string, files []*multipart.FileHeader) { // ... // 省略相关用于处理单个slice元素的内容 } for key, vals := range params.Values { processElement(key, vals, nil) } for key, fileHeaders := range params.Files { processElement(key, nil, fileHeaders) } resultArray := reflect.MakeSlice(typ, maxIndex&#43;1, maxIndex&#43;1&#43;numNoIndex) for _, sv := range sliceValues { if sv.index != -1 { resultArray.Index(sv.index).Set(sv.value) } else { resultArray = reflect.Append(resultArray, sv.value) } } return resultArray } 该函数的的作用主要用于解析数组类型的参数,进行类型转换并确定slice的最大下标maxIndex,最终申请一个足够大的slice来容纳这些内容。
...</p>
  </div>
  <footer class="entry-footer"><span title='2019-03-04 17:12:01 +0800 +0800'>March 4, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;155 words&nbsp;·&nbsp;SYM01</footer>
  <a class="entry-link" aria-label="post link to Revel框架的一处DoS问题" href="https://sym01.com/posts/2019/dos-vuln-in-revel-framework/"></a>
</article>
    </main>
    
<footer class="footer">
        <span>&copy; 2025 <a href="https://sym01.com/">SYM01</a></span> · 

    <span>
        Powered by
        <a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
        <a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
    </span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
        <path d="M12 6H0l6-6z" />
    </svg>
</a>

<script>
    let menu = document.getElementById('menu')
    if (menu) {
        menu.scrollLeft = localStorage.getItem("menu-scroll-position");
        menu.onscroll = function () {
            localStorage.setItem("menu-scroll-position", menu.scrollLeft);
        }
    }

    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
        anchor.addEventListener("click", function (e) {
            e.preventDefault();
            var id = this.getAttribute("href").substr(1);
            if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
                    behavior: "smooth"
                });
            } else {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
            }
            if (id === "top") {
                history.replaceState(null, null, " ");
            } else {
                history.pushState(null, null, `#${id}`);
            }
        });
    });

</script>
<script>
    var mybutton = document.getElementById("top-link");
    window.onscroll = function () {
        if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
            mybutton.style.visibility = "visible";
            mybutton.style.opacity = "1";
        } else {
            mybutton.style.visibility = "hidden";
            mybutton.style.opacity = "0";
        }
    };

</script>
<script>
    document.getElementById("theme-toggle").addEventListener("click", () => {
        if (document.body.className.includes("dark")) {
            document.body.classList.remove('dark');
            localStorage.setItem("pref-theme", 'light');
        } else {
            document.body.classList.add('dark');
            localStorage.setItem("pref-theme", 'dark');
        }
    })

</script>
</body>

</html>
                               

Whois info of domain

Domain Name: SYM01.COM
Registry Domain ID: 2184275406_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.cloudflare.com
Registrar URL: http://www.cloudflare.com
Updated Date: 2024-10-08T04:01:59Z
Creation Date: 2017-11-07T05:46:22Z
Registry Expiry Date: 2025-11-07T05:46:22Z
Registrar: Cloudflare, Inc.
Registrar IANA ID: 1910
Registrar Abuse Contact Email: [email protected]
Registrar Abuse Contact Phone: +1.6503198930
Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
Name Server: AJAY.NS.CLOUDFLARE.COM
Name Server: PAT.NS.CLOUDFLARE.COM
DNSSEC: signedDelegation
DNSSEC DS Data: 2371 13 2 80301F348ACC0BD363B56B41AD90FC59AD75A2137B87418583B1A18E7A6E9EEB
URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
>>> Last update of whois database: 2025-05-18T03:14:24Z <<<
For more information on Whois status codes, please visit https://icann.org/epp
NOTICE: The expiration date displayed in this record is the date the
TERMS OF USE: You are not authorized to access or query our Whois
by the following terms of use: You agree that you may use this Data only
to: (1) allow, enable, or otherwise support the transmission of mass