Uvod u cURL

b0ne^
/srv/http/Posts: 22Administrator edited January 8 in PHP

NOTE: Tutorial je pisan dok je jos bila aktuelan v2 verzija Ljuske i PHP 5

[ cURL ]

[ Sadrzaj ]
[0] Uvod
[1] cURL provera
[2] Osnovni primer
[3] Login na forum
[4] Shell provera

0) Uvod
cURL je PHP library koji vam omogucava da se konektujete na razne vrste serevr-a... Podrzani su http, https, FTP, gopher, telnet i drugi... Koristeci cURL mozete na neki sajt sa vase skripte da posaljete neki POST request, da uploadate fajl i mnogo drugih stvari...

1) cURL provera
Da biste mogli da koristite cURL morate da proverite da li je on load-ovan. To cemo uraditi pokretanjem jednostavne skripte:

<?php
    if(function_exists("curl_init"))
    {
        echo "cURL loaded";
    } else {
        echo "cURL not loaded!";
    }

Ako vam ispise da cURL nije loadovan moracete da ga load-ujete, ukoliko radite na localhostu ili vasem serveru editujte fajl php.ini tako sto cete skloniti ; pre extension=php_curl.dll

2) Osnovni primer
Da bismo napravili novi cURL request koristicemo funkciju curl_init, da bismo nasem requestu zadali neka podesavanja koristimo curl_setopt, da bismo ga izvrsili koristimo curl_exec, a da bismo zatvorili neki cURL request koristimo funkciju curl_close... Osnovni primer bi ovako izgledao:

<?php
    $link = "http://ljuska.org/";

    $ch = curl_init($link);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17");
    $exec = curl_exec($ch);
    curl_close($ch);

Koristimo curl_init kako bismo napravili novi request i zadali link sajta, sa curl_setopt zadajemo useragent-a koji ce se koristiti u request-u (zato sto se na ljusci vrsi provera useragent-a i ukoliko ga nema dobijamo 403 Forbidden), funkcijom curl_exec izvrsavamo nas request i na kraju ga sa curl_close zatvaramo...

Na ovom linku mozete pronaci sva moguca podesavanja za curl_setopt:

http://www.php.net/manual/en/function.curl-setopt.php

Kao sto vidite nas request je poslat i vracen je i ispisan rezultat... To bi bio neki osnovni primer kako biste razumeli kako radi cURL...

3) Login na forum
U ovom primeru napravicemo skriptu koja ce poslati POST request na

http://ljuska.org/ucp.php?mode=login

Skripta bi izgledala ovako:

<?php
    $login_link = "http://ljuska.org/ucp.php?mode=login";
    $forum_link = "http://ljuska.org/";
    $login_info = "username=vas_username&password=vas_password&login=Login";

    $fp = fopen("cookie.txt", "w");
    fclose($fp);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_URL, $login_link);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $login_info);
    curl_setopt($ch, CURLOPT_URL, $forum_link);
    $exec = curl_exec($ch);
    curl_close($ch);

    unlink("cookie.txt");

Sada vec kod izgleda malo komplikovanije ali u stvari nije, sada cu objasniti sta smo ovde sve koristili...

U ovom slucaju nismo stavljali link od sajta u curl_init nego smo ga zadavali sa curl_setopt($ch, CURLOPT_URL zato sto cemo imati 2 linka, 1 za login i 1 od foruma na koji ce skripta otici posle login-a...

CURLOPT_COOKIEJAR koristimo kako bismo zadali fajl u kome ce se snimiti cookies i sesije iz requesta

CURLOPT_COOKIEFILE koristimo kako bismo zadali fajl iz koga ce se uzeti cookies i sesije i zadati skripti da ih koristi pri poseti sajta

CURLOPT_URL koristimo da zadamo link na koji ce se slati cURL request

CURLOPT_USERAGENT zadaje useragenta koji ce se koristiti prilikom request-a, u ovom slucaju je ovo obaveno zato sto se proverava useragent i ukoliko ga nema dobicemo 403 Forbidden response

CURLOPT_POST koristimo kako bismo rekli skripti da ce se slati neki POST podaci kako bi skripta zadala content-type request application/x-www-form-urlencoded

CURLOPT_POSTFIELDS koristimo kako bismo poslali POST podatke... username je ime input-a za username, password je ime input-a za password i login je ime login dugmeta sa vrednoscu Login... username, password i login imena nalazimo tako sto pogledamo source code... POST podaci se salju u sledecem formatu 1=1&2=2 i tako ih samo redjate

CURLOPT_URL zadajemo novi link na koji ce skripta da ode posle login-a

unlink smo stavili na kraju skripte kako bi skripta posle izvrsavanja cURL obrisala taj fajl zato sto nije potrebno da ostane sacuvan

Sada kada smo napravili skriptu koja ce nas ulogovati na forum kako bismo na primer sa sajta mogli da uzmemo samo neke stvari, na primer samo broj novih privatnih poruka, broj novih postova, topica i usera u poslednja 24 sata? Da bismo to uspeli da uradimo na nasu skriptu cemo morati da dodamo CURLOPT_RETURNTRANSFER kako skripta ne bi ispisala rezultat nego ga sacuvala u $exec varijabli... Skripta ce sada izgledati ovako:

<?php
    $login_link = "http://ljuska.org/ucp.php?mode=login";
    $forum_link = "http://ljuska.org/";
    $login_info = "username=vas_username&password=vas_password&login=Login";

    $fp = fopen("cookie.txt", "w");
    fclose($fp);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_URL, $login_link);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $login_info);
    curl_setopt($ch, CURLOPT_URL, $forum_link);
    $exec = curl_exec($ch);
    curl_close($ch);

    unlink("cookie.txt");

Kada bismo pokrenuli ovu skriptu na stranici bismo dobili prazan ispis jer je namestno da vrati rezultat u varijablu $exec i da ga ne ispise...

Na ljusci iz source koda nalazimo da se za privatne poruke ispisuje ovako:

<a href="./ucp.php?i=pm&amp;folder=inbox"><strong>0</strong> new messages</a>

a za broj novih postova, topica i korisnika ovako:

<p class="genmed">New Posts <strong>84</strong> | New Topics <strong>10</strong> | New users <strong>9</strong></p>

Sada mi ne zelimo da ispisemo ceo response nego samo te delove, to cemo raditi sa preg_match funkcijom... Skripta ce sada izgledati ovako:

<?php
    $login_link = "http://ljuska.org/ucp.php?mode=login";
    $forum_link = "http://ljuska.org/";
    $login_info = "username=vas_username&password=vas_password&login=Login";

    $fp = fopen("cookie.txt", "w");
    fclose($fp);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_URL, $login_link);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $login_info);
    curl_setopt($ch, CURLOPT_URL, $forum_link);
    $exec = curl_exec($ch);
    curl_close($ch);

    unlink("cookie.txt");

    $private_messages = "/<a [^>]*?><strong>[0-9]+<\/strong><\/a>/is";
    $new_posts = "/<td [^>]*?><p [^>]*?>New Posts.*?<strong>[0-9]+<\/strong>/is";
    $new_topics = "/<td class=\"row1\" width=\"100%\" valign=\"middle\">.*\/strong> | New Topics <strong>[0-9]+<\/strong>/is";
    $new_users = "/.*?New Topics <strong>[0-9]+</strong>/is";

    $pms = preg_match($private_messages, $exec);
    $np = preg_match($new_posts, $exec, $found_posts);
    $nt = preg_match($new_topics, $exec, $found_topics);
    $explode = explode("New Topics", $found_topics[0]);

    echo "You have <b>".$pms."</b> new private messages<br />";
    echo "New posts in last 24 hours: <b>".str_replace(array("<td class=\"row1\" width=\"100%\" valign=\"middle\"><p class=\"genmed\">New Posts <strong>","</strong>"), "", $found_posts[0])."</b><br />";
    echo "New topics in last 24 hours: <b>".$explode[1]."</b><br />";

I na stranici cemo dobiti sledeci ispis:

Necu objasnjavati novi deo koji smo dodali jer to ne spada u cURL tutorial nego u Regular expression...

4) Shell provera
Evo dacu cisto i primer skripte koja bi proveravala da li postoji shell na odredjenom linku, ovo sam radio za neki projekat pa evo da i to pokazemo... Za proveru shell-a ne mozemo da koristimo file_get_contents zato sto ta funkcija ne radi na https sajtovima... Skripta ce izgledai ovako:

<?php
    set_time_limit(0);

    $file = "shells.txt";
    $content = file_get_contents($file);
    $shells = explode("\n", $content);

    $ex = "";
    $nex = "";

    foreach($shells as $shell)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
        curl_setopt($ch, CURLOPT_URL, $shell);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $headers = curl_exec($ch);
        curl_close($ch);

        if(@!eregi("200", $headers))
        {
            echo "[-] Shell ".$shell." doesn't exists<br />";
        } else
        {
            echo "[+] Shell ".$shell." exists<br />";
        }
    }

I na stranici cemo dobiti ispis:

set_time_limit stavljamo da bi skripta proveravala to koliko god joj vremena treba a ne da se ogranici

CURLOPT_HEADER koristimo da bi u rezultat bio poslao sadrzaj header-a

CURLOPT_NOBODY koristimo kako bismo uzeli samo header za rezultat a ne i source code

CURLOPT_SSL_VERIFYPEER koristimo da kazemo skripti da ne proverava SSL sertifikat

CURLOPT_SSL_VERIFYHOST koristimo da proverimo postojanje SSL-a

If you don't know who I am, then maybe your best course would be to tread lightly.

Sign In or Register to comment.

Welcome

It looks like you're new here. If you want to get involved, click one of these buttons!

Discussions