waffle 2021. 9. 13. 19:24
728x90

sql query & PHP code

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

 

PHP 뢄석


μ•žμ˜ 2λ¬Έμ œμ™€λŠ” 달리 필터링 λ‚΄μš© 및 쿼리 λ‚΄μš©μ΄ λ³€κ²½λ˜μ—ˆλ‹€.

μš°μ„  μž…λ ₯ν•„λ“œκ°€ id & pwμ—μ„œ id & no둜 λ³€κ²½λ˜μ—ˆκ³ , id값은 μž…λ ₯λ°›λŠ” 값이 λ“€μ–΄κ°€μ§€ μ•Šκ³  'guest'둜 κ³ μ •λ˜μ–΄μžˆλ‹€.

λ˜ν•œ 필터링도 κ°•ν™”λ˜μ–΄ no에 ',",`λ₯Ό μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ 넣을 수 μ—†λ‹€.

 

ν•˜μ§€λ§Œ 문제의 해결을 μœ„ν•΄μ„œλŠ” id ν•„λ“œμ˜ 값이 admin이어야 ν•œλ‹€. 즉, κ³ μ •λœ 값을 λ³€κ²½ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

 

https://devwaffle.tistory.com/39

 

[ SQL ] SQL 문법 μ‹€ν–‰μˆœμ„œ

SQL λ¬Έλ²•μ—λŠ” ꡬ문 λ‚΄ μ‹€ν–‰μˆœμ„œμ™€ 연산사 μ‹€ν–‰μˆœμ„œκ°€ μ‘΄μž¬ν•œλ‹€. SQL ꡬ문의 κ²½μš°μ—λŠ” FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY μˆœμ„œλ‘œ μ‹€ν–‰λœλ‹€. 즉, μ•„λž˜μ™€ 같은 SQL 쿼리문이 μ‘΄μž¬ν•  경우: SELECT..

devwaffle.tistory.com

 

μœ„μ— SQL문법 μ‹€ν–‰ μˆœμ„œμ— λŒ€ν•˜μ—¬ μ •λ¦¬ν•œ 포슀트λ₯Ό μ—°κ²°ν•΄λ†“μ•˜λŠ”λ°, κ·Έ μ΄μœ κ°€ 이번 문제λ₯Ό ν’€κΈ°μœ„ν•΄ μš°μ„ μˆœμœ„μ— λŒ€ν•œ 이해가 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

SQL 문법상 WHERE문에 μ μš©λ˜λŠ” μ—°μ‚°μžλ³„ μš°μ„ μˆœμœ„λŠ” ANDκ°€ OR보닀 λ†’λ‹€. λ”°λΌμ„œ no에 OR둜 이루어진 λ‹€μŒκ³Ό 같은 SQL 쿼리λ₯Ό μž‘μ„±ν•˜μ—¬ 보내면 μ•„λž˜μ™€ 같이 필터링 쑰건이 λ³€κ²½λœλ‹€:

 

0 OR id='admin'

 

1) id='guest'이고 no=0인 데이터

2) id='admin'인 데이터

 

 

Injection

 


ν˜Όμžμ„œλŠ” 방법을 μ°Ύμ§€ λͺ»ν•˜μ—¬ κ°•μ˜μžλ£Œμ™€ ꡬ글링을 톡해 SQL μš°μ„ μˆœμœ„ 등에 λŒ€ν•œ ν•™μŠ΅μ„ ν•˜μ—¬ λ‹€μŒ λ‹΅μ•ˆμ„ μ•Œμ•„λ‚΄μ—ˆλ‹€

 

0 OR id='admin'

μ •μƒμ μœΌλ‘œ 쑰건을 μ™„μ„±μ‹œμΌœμ£Όκ³ , 뒀에 OR 쑰건을 λΆ™μ—¬ WHERE을 톡해 필터링 κ°€λŠ₯ν•œ 결과값에 λŒ€ν•œ 쑰건을 μƒˆλ‘œ μΆ”κ°€ν•˜μ˜€λ‹€.

ν•˜μ§€λ§Œ 이 μ½”λ“œμ—λŠ” λ¬Έμžμ—΄μ΄ ν¬ν•¨λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— ν•„ν„°λ§μ‘°κ±΄μ—μ„œ λ¬Έμ œκ°€ λœλ‹€. λ”°λΌμ„œ μœ„ μ½”λ“œμ˜ λ¬Έμžμ—΄ 'admin'을 16μ§„μˆ˜ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€. (SQL이 16μ§„μˆ˜ λ¬Έμžμ—΄μ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έ)

 

0 OR id=0x61646D696E

 

 

 

How to Defence


 

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

 

1. ' AND'λ‚˜ ' OR'ν˜•νƒœμ˜ νŒ¨ν„΄μ„ κ°€μ§„ λ¬Έμžμ—΄μ΄ ν¬ν•¨λœ μš”μ²­μ„ μ „λΆ€ κ±°λΆ€ν•œλ‹€

곡백 λ°”λ‘œ λ‹€μŒμ— μ—°μ‚°μžκ°€ μ˜€λŠ” νŒ¨ν„΄μ˜ λ¬Έμžμ—΄κ³Ό ν•¨κ»˜ λ“€μ–΄μ˜€λŠ” λͺ¨λ“  μš”μ²­μ„ κ±°λΆ€ν•  경우 WHEREμ ˆμ— λŒ€ν•œ μˆ˜μ •μ΄ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ 개발자의 μ˜λ„λŒ€λ‘œ 쿼리문 싀행이 κ°€λŠ₯ν•˜λ‹€. νŠΉμˆ˜λ¬Έμžλ“€ 쀑 κ΄„ν˜ΈκΉŒμ§€ λ§‰μœΌλ©΄ λ”μš± μ’‹λ‹€.

 

2. νŠΉμˆ˜λ¬Έμžλ“€ 쀑 '=', '(', ')'도 ν•¨κ»˜ ν•„ν„°λ§ν•œλ‹€

'=' 특수문자λ₯Ό 필터링 ν•˜λ©΄ λ‹€μ–‘ν•œ 곡격듀을 λ°©μ–΄ν•  수 μžˆλ‹€. 특히 비ꡐ문을 μ›μ²œμ μœΌλ‘œ μ‚¬μš©ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ—°κ΄€λœ λͺ¨λ“  곡격을 막을 수 μžˆμ„ 것이닀. λ˜ν•œ κ΄„ν˜Έλ₯Ό ν•¨κ»˜ ν•„ν„°λ§ν•˜μ—¬ WHERE절의 쿼리문을 개발자의 μ˜λ„λŒ€λ‘œ 싀행될 수 μžˆλ„λ‘ λ§Œλ“€ 수 μžˆλ‹€.

 

3. 16μ§„μˆ˜ λ¬Έμžμ—΄μ„ 일반 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ κ²€μ‚¬ν•œλ‹€

16μ§„μˆ˜ λ¬Έμžμ—΄λ„ 일반 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ‹€μ‹œ κ²€μ‚¬ν•˜κ²Œ λœλ‹€λ©΄ μœ„μ— ',",`ν‘œμ‹μ„ 톡해 λ¬Έμžμ—΄μž„μ„ λͺ…μ‹œν•˜λŠ” 쑰건을 νšŒν”Όν•˜λŠ” 것을 λ°©μ§€ν•  수 μžˆλ‹€.

728x90
λ°˜μ‘ν˜•