waffle 2021. 9. 13. 17:43
728x90

sql query & php code

query값을 톡해 λ°›μ•„μ˜€λŠ” 데이터λ₯Ό ν™œμš©ν•˜μ—¬ sql query둜 λ§Œλ“€μ–΄ db에 λͺ…령을 λ‚΄λ¦¬λŠ” php μ½”λ“œμ΄λ‹€.

 

PHP 뢄석


 

μ€‘μš”ν•˜κ²Œ 확인해야 ν•  뢀뢄은 ν•„ν„°λ§λ˜λŠ” 뢀뢄인데,

5,6번째 쀄을 ν™•μΈν•˜λ©΄ 'preg_match'λΌλŠ” ν•¨μˆ˜κ°€ ν™œμš©λ˜μ–΄μžˆλŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

preg_match function description, PHP Official

preg_match ν•¨μˆ˜λŠ” μ •κ·œμ‹ ν‘œν˜„, 검색 λŒ€μƒ λ¬Έμžμ—΄, μΌμΉ˜λ°°μ—΄ λ°˜ν™˜λ³€μˆ˜(선택) 등을 μž…λ ₯ν•˜λ©΄ μž…λ ₯된 μ •κ·œμ‹μ— μΌμΉ˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ°Ύμ•„λ‚΄λŠ” λ‚΄μž₯ν•¨μˆ˜λ‹€. 

 

μ •κ·œμ‹ 뢄석


 

 

λ‹€μ‹œ λŒμ•„μ™€ μ½”λ“œμ— μ‚¬μš©λœ preg_match ν•¨μˆ˜μ˜ μ •κ·œμ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€:

/prob|_|\.|\(\)/i

2개의 '/' 사이에 ν™•μΈν•˜κ³ μž ν•˜λŠ” 값듀을 '|'둜 κ΅¬λΆ„ν•˜μ—¬ μž‘μ„±ν•˜λ©΄ ν•΄λ‹Ή 값이 ν•„ν„°λ§λœλ‹€. λ§ˆμ§€λ§‰ '/' 뒀에 i의 경우 λ¬΄μ‹œν•œλ‹€λŠ” μ˜΅μ…˜μ„ μ€€ 것이닀. λ”°λΌμ„œ 해석을 ν•˜μžλ©΄ μ•„λž˜μ™€ κ°™κ²Œ μ •λ¦¬λœλ‹€:

 

"'prob'. '_', '.', '()'λ¬Έμžμ—΄λ“€μ„ λ¬΄μ‹œν•œλ‹€"

 

λ”°λΌμ„œ μœ„μ˜ 값듀을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 쿼리문을 idλ‚˜ pw ν•„λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ†‘ν•˜λ©΄ SQL Injection 취약점이 발견될 수 μžˆμ„ 것이닀.

 

Injection


λ”°λΌμ„œ 처음 μ‹œλ„ν•œ Injection CodeλŠ” λ‹€μŒκ³Ό κ°™λ‹€:

 

' OR LENGTH(id)!=0 #

'을 μ‚¬μš©ν•΄μ„œ μ•žμ„  쿼리문 λ¬Έμžμ—΄μ—μ„œ μ—΄λ €μžˆλŠ” λ¬Έμžμ—΄κΈ°ν˜Έ(?)λ₯Ό λ‹«μ•„μ£Όκ³  OR μ˜΅μ…˜μ„ μ‚¬μš©ν•΄ ORκΈ°μ€€ μ•žμ΄λ‚˜ λ’· λ‚΄μš© λ‘˜μ€‘ ν•˜λ‚˜λ§Œ μΌμΉ˜ν•΄λ„ 쿼리문이 λͺ¨λ“  값을 뱉어낼 수 μžˆλ„λ‘ λ§Œλ“€μ—ˆλ‹€.

OR λ’€μ—λŠ” idκ°€ λΉ„μ–΄μžˆμ§€ μ•Šμ€ 이상 무쑰건 true일 수 μžˆλ„λ‘ λ¬Έμžμ—΄μ˜ 길이가 0이 μ•„λ‹Œ λͺ¨λ“  값을 μ„ νƒν•˜λ„λ‘ ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€.

이후 λ’·λ‚΄μš©μ€ #을 μ‚¬μš©ν•΄ μ£Όμ„μ²˜λ¦¬ν•˜μ—¬ λ¬΄μ‹œν•˜λ„λ‘ λ§Œλ“€μ—ˆλ‹€. λ”°λΌμ„œ pw의 λ‚΄μš©μ€ μ–΄λ–€ 값이 듀어가더라도 λ¬΄μ‹œλœλ‹€.

 

이후 ν™•μΈν•œ λͺ¨λ²” Injection CodeλŠ” λ‹€μŒκ³Ό κ°™λ‹€:

 

' OR 1=1 #

λΉ„μ–΄μžˆλ‹€κ³  ν•˜λ”λΌλ„ λͺ¨λ“  값을 ν‘œμ‹œν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄ 1=1을 μž…λ ₯ν•˜μ—¬ 항상 trueκ°€ λ‚˜μ˜€λ„λ‘ μ„€μ •λ˜μ–΄μžˆλ‹€. 

 

두 방법 λͺ¨λ‘ url query parameterλ₯Ό 톡해 μš”μ²­ν•˜λ©΄ λ‹€μŒκ³Ό 같은 응닡을 뱉어낸닀:

 

 

How to Defence


 

생각해본 방법듀은 λ‹€μŒκ³Ό κ°™λ‹€:

 

1. %μ΄λ‚˜ #κ°’μœΌλ‘œ 값이 λ“€μ–΄μ˜€λ©΄ μš”μ²­ 자체λ₯Ό μ·¨μ†Œ

SQL Injection은 λŒ€λΆ€λΆ„ query λ³€μ‘°λ₯Ό 톡해 λ“€μ–΄μ˜€κΈ° λ•Œλ¬Έμ—, query에 특수문자λ₯Ό μž…λ ₯ν•˜κΈ°μœ„ν•΄ λ°˜λ“œμ‹œ ν•„μš”ν•œ %문자λ₯Ό μ• μ΄ˆμ— λ§‰λŠ”λ‹€. λ˜ν•œ 쿼리문 주석을 μœ λ„ν•˜λŠ” #문자 λ˜ν•œ κΈˆμ§€μ‹œμΌœ μ˜λ„ν•œ μ½”λ“œμ˜ 싀행쀑단을 λ°©μ§€ν•œλ‹€. λ‹€λ§Œ 이 방법을 μœ„ν•΄μ„œλŠ” λΉ„λ°€λ²ˆν˜Έλ‚˜ 아이디에 %λ¬Έμžμ™€ #문자 μž…λ ₯을 κΈˆμ§€μ‹œμΌœμ•Ό ν•œλ‹€.

 

2. λͺ¨λ“  특수문자 μ•žμ— μ—­μŠ¬λ ˆμ‹œ ('\') 뢙이기

μ—­μŠ¬λ ˆμ‹œλ₯Ό 특수문자 μ•žμ— λΆ™μ΄κ²Œ 되면 ν•΄λ‹Ή 값이 κ°€μ§€λŠ” νŠΉλ³„ν•œ μ˜λ―Έκ°€ μ•„λ‹Œ 문자 자체의 의미둜 컴퓨터가 ν•΄μ„ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ λͺ¨λ“  특수문자 μ•žμ— μ—­μŠ¬λ ˆμ‹œλ₯Ό 뢙이면 μœ„λ³€μ‘°λ₯Ό 막을 수 μžˆμ„ 것이라 μƒκ°ν•œλ‹€.

 

728x90
λ°˜μ‘ν˜•